ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 카테고리컬 변수 인코딩하는 세가지 방법 (원핫 인코딩, 라벨 인코딩, 바이너리 인코딩)
    머신러닝 배우기 2023. 12. 17. 01:26

    ▶︎ 카테고리컬(명목형, 범주형) 변수란? 

    → 카테고리컬 변수는 이름에서 알 수 있듯 변수의 속성값은 서로 구분되는 카테고리를 나타내는 변수입니다.

    속성값은 양적인 값을 갖지 않으며, 카테고리를 구분하기 위한 값이고 숫자로 표현되더라도 각 값의 크기나 순서에는 의미가 없습니다. 즉, 숫자로 표현되더라도 그룹 간에 단순히 식별하기 위한 용도일 뿐이며, 숫자 값 자체에는 의미가 없습니다.

    예시) 성별(남성, 여성), 색상(빨강, 파랑, 노랑, 초록) 

     

    ▶︎ 카테고리컬 변수를 인코딩 해야하는 이유

     머신러닝 모델은 데이터를 숫자로 입력받아야 이해하고 처리할 수 있기 때문에 인코딩 과정이 필요합니다. 

     

    ▶︎ 카테고리컬 변수의 인코딩 종류와 장단점

     

    1. 원-핫 인코딩 (One-Hot Encoding)
    - 개념 : 고유 값에 해당하는 변수만 1로 표시하고 나머지는 0으로 표시하는 방법. 어떤 변수가 카테고리를 N개 가지고 있다면 N개의 변수가 추가로 생성

    - 장점 : 범주형 변수의 각 카테고리를 그대로 유지하므로, 해당 카테고리의 의미를 해석하기 쉽고 정보의 변형 없이 온전히 보전된다. 

    - 단점 :

    1) 카테고리의 종류가 많을수록 차원이 늘어나게 되고 대부분의 값이 0 인 희소행렬로 생성되므로, 메모리 사용이 비효율적이다. 희소 벡터를 활용하여 메모리를 절약해야 합니다.

    2) 트리 계열 알고리즘은 분기점에서 하나의 변수를 선택해 정보 이득을 계산하게 되는데, One-Hot Encoding을 사용한 변수를 트리 알고리즘에 넣게 되면 특정 변수에 대한 정보 이득이 N개의 변수로 찢어지므로, 해당 변수가 높은 정보 이득을 가질 가능성이 낮아지게 된다. 결국 알고리즘에 대해 잘 선택되지 않고, 중요도 역시 낮아진다.

    3) 회귀 모형에서는 늘어난 차원의 수만큼 파라미터 수도 증가하는데, 이로 인해 과적합이 발생할 확률이 높아집니다. 따라서 feature selection으로 차원 수를 최대한 줄여야 합니다.

    - 지식 확장 : OneHotEncoder()과 get_dummies() 함수는 모두 카테고리컬 변수를 더미변수로 바꿔주는 방법이다. 

    from sklearn import preprocessing
    import pandas as pd
    import category_encoders as ce
    df = pd.DataFrame({'color':['빨강','빨강','파랑','노랑','초록']})
    
    # OneHotEncoder 생성
    one_hot_encoder = preprocessing.OneHotEncoder()
    
    # fit_transform 메서드를 사용하여 데이터를 원핫인코딩
    encoded_data = one_hot_encoder.fit_transform(df[['color']])
    
    # 희소 행렬(sparse matrix)을 밀집 배열로 변환
    encoded_array = encoded_data.toarray()
    
    # 결과를 데이터프레임으로 변환
    encoded_df = pd.DataFrame(encoded_array, columns=one_hot_encoder.get_feature_names_out(['color']))
    
    df = pd.concat([df, encoded_df], axis=1)
    df
    df = pd.DataFrame({'color':['빨강','빨강','파랑','노랑','초록']})
    
    # 판다스의 get_dummies 함수 활용
    encoded_df = pd.get_dummies(df).replace(True,1).replace(False,0)
    
    df = pd.concat([df, encoded_df], axis=1)
    df

     

     

    2. 라벨 인코딩 (Label Encoding):
    - 개념 : 각 카테고리를 고유한 정수로 변환하는 방법. 주의할 점은 매핑된 정수 값의 크기가 모델에 영향을 미칠 수 있다.

    - 장점 : 카테고리의 종류가 많을 때(high cardinality), 하나의 열로 만들어 차원을 줄일 수 있음

    - 단점 : 대소 관계를 부여하게 되어 인코딩된 데이터가 가중치로 인식될 수 있다. 

    - 지식 확장 : Label Encoding과 Ordinal Encoding은 모두 정수값으로 변환하는 방법이다. 하지만 Label Encoding은 간단히 카테고리를 숫자로 변환하는 데 사용되며, 순서가 중요하지 않은 경우에 적합합니다. 반면에 Ordinal Encoding은 카테고리 간의 상대적인 순서가 중요한 경우에 사용되며, 순서 정보를 모델에 전달하는 데 유용합니다.

    df = pd.DataFrame({'color':['빨강','빨강','파랑','노랑','초록']})
    
    # 라벨 인코더 객체 저장
    label_encoder = preprocessing.LabelEncoder()
    
    # fit_transform 메서드를 사용하여 데이터를 라벨 인코딩
    df['color_encoding'] = label_encoder.fit_transform(df['color'])
    df
    
    # 카테고리별 어떤 값으로 매핑되었는지 순서를 확인할 수 있음
    # label_encoder.classes_

     

    3. Binary Encoding:
    - 개념 : 각 카테고리를 숫자로 변환하고 해당 숫자를 이진수로 표현하는 방법. 즉 0과 1의 조합으로 구성됨.

    - 장점 : Binary Encoding은 원-핫 인코딩보다 더 적은 열로 표현되어 메모리 효율적이다.

    - 단점 : 인코딩된 데이터가 원-핫 인코딩보다 덜 직관적이며, 데이터에 따라서 원핫 인코딩이 더 성능이 좋을 수 있다.

    df = pd.DataFrame({'color':['빨강','빨강','파랑','노랑','초록']})
    
    binary_encoder = ce.BinaryEncoder(cols=["color"])
    df_binary = binary_encoder.fit_transform(df["color"])
    df = pd.concat([df, df_binary], axis=1)
    df

     

     

    ▶︎ 정리

     카테고리컬 변수를 인코딩할 때, 가장 많이 사용하는 것은 원핫인코딩과 라벨 인코딩입니다. 원핫인코딩은 카테고리의 종류가 많지 않아서 효율적으로 메모리를 사용할 수 있을 때 사용하고 라벨 인코딩은 카테고리의 종류가 많아서 원핫인코딩으로 다루기 힘들 때 사용합니다.

     

    ▶︎  그 외 인코딩 방법들

    Helmert Contrast, Sum Contrast, Polynomial Contrast, Target Encoding 등이 있습니다.

     

     

     

    참고 자료 : https://dacon.io/en/codeshare/4525

Designed by Tistory.