-
카테고리컬 변수 인코딩하는 세가지 방법 (원핫 인코딩, 라벨 인코딩, 바이너리 인코딩)머신러닝 배우기 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 등이 있습니다.
'머신러닝 배우기' 카테고리의 다른 글
불균형 데이터 SMOTE 코드 위주 실습과 결과 해석 (0) 2023.12.28 불균형 데이터의 문제와 해결 방법, 평가지표 (0) 2023.12.28 [머신러닝] PCA와 feature selection 과의 비교 (0) 2023.12.12 [머신러닝] 클러스터링의 대표, K-means Algorithm (1) 2023.12.12 [머신러닝] HPO 최적의 하이퍼 파라미터 찾기 GridSearch 예제 (0) 2023.12.11