Python - sklearn LabelEncoder, OnehotEncoder 사용


python에서 범주형 변수를 인코딩 하기 위하여 더미변수를 만들거나, one hot encoding을 합니다. 선형회귀 같은 기본적인 통계 모형에서는 더미변수를 많이 쓰지만, 일반적인 머신러닝/딥러닝 접근법에서는 one hot encoding을 많이합니다. one hot encoding을 하기위해서는 직접 함수를 만들어 할 수도 있지만 패키지를 사용하면 편합니다. 가장 편하다고 생각하는 방법이 바로 sklearn 패키지를 통한 one hot encoding 인데요. 예를 들어 아래와 같은 info라는 이름의 pandas dataframe 이 있을 때, class2를 예측변수 y라고 생각하여 one hot encoding 하는 방법을 알아보겠습니다.



id tissue class class2 x y r
0 mdb001 G CIRC B 535 425 197.0
1 mdb002 G CIRC B 522 280 69.0
2 mdb003 D NORM N NaN NaN NaN
3 mdb004 D NORM N NaN NaN NaN
4 mdb005 F CIRC B 477 133 30.0
5 mdb005 F CIRC B 500 168 26.0


Code

from sklearn import preprocessing label_encoder = preprocessing.LabelEncoder() onehot_encoder = preprocessing.OneHotEncoder() train_y = label_encoder.fit_transform(info['class2']) train_y = train_y.reshape(len(train_y), 1) train_y = onehot_encoder.fit_transform(train_y)

LabelEncoder 결과


[0 0 2 2 0 0 2 2 2 2 0 2 0 0 2 0 2 0 2 0 2 0 2 1 2 0 2 2 1 2 0 2 0 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 0 2 2 2 0 2 2 2 2 2 0 2 2 1 2 2 1 2 2 2 2 0 0 2 0 2 2 2 2 2


OnehotEncoder 결과 - 최종 train_y

(0, 0) 1.0 (1, 0) 1.0 (2, 2) 1.0 (3, 2) 1.0 (4, 0) 1.0 (5, 0) 1.0 (6, 2) 1.0 (7, 2) 1.0 (8, 2) 1.0 (9, 2) 1.0 (10, 0) 1.0 (11, 2) 1.0 (12, 0) 1.0 (13, 0) 1.0

몇 줄 되지 않는 코드로 이처럼 one hot encoding을 구현할 수 있습니다. one hot encoding을 하기 전에 label encoding을 하는 이유는 one hot encoder의 인풋으로 숫자형만 올 수 있기 때문입니다. label encoder의 결과로 문자형 변수가 숫자형 변수 범주형으로 변경되게 되고 이를 one hot encoder에 fit_transform 해주면, 이와 같이 one hot encoding된 결과를 얻을 수 있습니다. 이 때, train_y 변수는 sparse matrix가되어 프린트하면 위와같이 나타납니다. 이는 matrix의 인덱스와 그에 해당하는 value를 나타낸건데 매트릭스에 값을 대입해보면 labelencoder 결과에 onehot encoding이 적용된 것을 확인할 수 있습니다.