[머신러닝] 범주형 데이터 인코딩 방법 정리

반응형
    반응형

    범주형 데이터 인코딩하기

    머신러닝 모델은 글자를 인식하지 못합니다. 이 사실만으로도 인코딩을 반드시 해야한다는 걸 이해하실 수 있을겁니다. 컴퓨터는 사람처럼 소통하는 게 아니기 때문에 이것이 범주형 데이터라는 것을 알려주어야 합니다. 그런 의미에서 판다스에서 타입이 object로 분류되는 데이터는 인코딩을 해주어야 합니다.

    인코딩 방법

    데이터 인코딩하는 방법은 굉장히 많습니다. 그 중에서 주요한 방법인
    레이블 인코딩, 원핫인코딩, 더미 변수, 빈도 인코딩, 순서 인코딩에 대해 간단히 정리합니다.

    레이블 인코딩 (Label Encoding)

    • 개념: 각 범주에 고유한 정수를 할당하는 방식입니다.
      • 카테고리가 확실할 때 사용합니다.
      • 문자를 정수로 반환하는 역할만 합니다.
      • 원 데이터의 손실이 없습니다.
    • 예시:
    from sklearn.preprocessing import LabelEncoder 
    le = LabelEncoder() 
    data['카테고리'] = le.fit_transform(data['카테고리'])
    
    # train 데이터인 경우
    x_train_encoder = le.fit_transform(x_train)
    # test 데이터인 경우
    x_test_encoder = le.transform(x_test)

    원-핫 인코딩 (One-Hot Encoding)

    • 개념: 각 범주를 이진수로 표현하여 고유한 열로 변환합니다.0과 1로만 표현하며 벡터형식으로 나타납니다.
    • 0과 1로만 이루어진 특성 벡터를 생성하므로, 희소한 데이터를 효과적으로 다룰 수 있습니다.
    • 계산이 용이해서 많이 쓰입니다.
    • 분류 모델에서도 작동하지만 회귀모델에서 보다 잘 작동합니다.
    • 범주 간 순서나 관계 정보는 사라집니다.
    • 예시:
    # sklearn 을 이용한 방법
    import sklearn.preprocessing import OneHotEncoder
    encoder = OneHotEncoder()
    data['카테고리'] =encoder.fit_transform(data['카테고리'])
    
    # train 데이터인 경우
    x_train_encoder = encoder.fit_transform(x_train)
    # test 데이터인 경우
    x_test_encoder = encoder.transform(x_test)

    Iris 데이터의 target 데이터는 세종률의 꽃을 라벨링해놓은 데이터인데 이를 원핫인코딩을 돌려보겠습니다. 라벨은 (0,1,2) 로 되어있습니다.


    target이 0일 때는 (1,0,0) 벡터가 생성되고 2일 때는 (0,0,1)로 0,1로만 이루어진 벡터가 생성됩니다.

    더미 변수 (Dummy Variables)

    • 개념: 범주형 변수를 여러 개의 이진 변수로 분해합니다. 원-핫 인코딩과 유사하지만, 카테고리가 n개일 때 n-1개의 열을 생성합니다.
    • 예시:
    data = pd.get_dummies(data, columns=['카테고리'], drop_first=True)

    빈도 인코딩 (Frequency Encoding)

    • 개념: 범주의 등장 빈도를 이용하여 인코딩합니다.
      • 빈도에 기반하므로 정보 손실이 적습니다.
      • 빈도가 중요시 되는 데이터인 경우 유용합니다.
      • 범주의 순서나 관계를 반영하지 않으므로 관계가 중요한 데이터에는 쓸 수 없습니다.
      • 이상치보다는 범주의 크기에 영향을 많이 받으므로 가중치를 적절하게 주어서 하나만 튀지 않도록 조절해야합니다.
      • 범주의 수가 많을 때 cardinality를 줄일 수 있습니다.
    • 예시:
    frequency_map = data['카테고리'].value_counts().to_dict() 
    data['카테고리_빈도'] = data['카테고리'].map(frequency_map)

    순서 인코딩 (Ordinal Encoding)

    • 개념: 범주 간에 순서 또는 중요도가 있는 경우에 사용됩니다.
      • 순서를 정수로만 변환하므로 정보가 유지됩니다.
      • 실제 데이터에 순서가 있는 경우 범주 간 거리가 균등하지 않습니다.인코딩을 하더라도 이 문제는 해결하지 못합니다.
      • cardinality는 줄어들지 않습니다.
    • 예시:
    ordinal_mapping = {'낮음': 1, '보통': 2, '높음': 3} 
    data['중요도'] = data['중요도'].map(ordinal_mapping)

    마치며

    인코딩 방법을 정리하다보니 몇몇 방법들은 내용을 다 넣지 못했습니다. 자세한 내용이 필요한 경우는 추후에 따로 떼서 포스팅할 예정입니다.

    댓글

    Designed by JB FACTORY

    ....