본문 바로가기

파이썬/전처리

원핫인코딩 파이썬 get_dummies 함수로 범주형 변수 전처리

원핫인코딩, 가변수(dummy variable)은 성별, 학력과 같은 범주형 변수를 0 또는 1값을 가진 하나 이상의 새로운 특성으로 바꾼 것이다. 이 때 변수의 특성 개수는 상관없다. 

 

 

예를 들어 학력이라는 특성에 '학사', '석사', '박사' 3개 값이 있다고 가정해보자. 그러면 어떤 사람의 학력 값에 해당하는 특성은 1이 되고 나머지는 0이 된다. 즉 데이터 포인트마다 정확히 3개의 특성 중 하나는 1이 되고 나머지 2개는 0이 된다.

 

 

원핫 인코딩은 왜 하는걸까? 컴퓨터는 문자를 이해할 수 없기 때문에 컴퓨터가 알아들을 수 있는 숫자로 변환시켜주는 작업이 필요한 것이다. 

 

 

많은 데이터에 문자값이 포함되어 있기 때문에 원핫인코딩은 전처리 과정에서 아주 흔하게 사용되며 머신러닝, 딥러닝뿐만 아니라 자연어처리, 데이터 마이닝 등 다양한 분야에서 사용되기 때문에 꼭 제대로 짚고 넘어가는 것이 중요하다.

 

adult.csv
3.91MB

1994년 인구조사 db에서 추출한 미국 성인의 소득 데이터셋인 adult 데이터 셋으로 원핫 인코딩 실습을 해보자.

 

 

import pandas as pd
import numpy as np

adult = pd.read_csv('adult.csv')
adult.head()

 

 

workclass, education, relationship, sex 와 같은 컬럼들은 범주형 변수로 가변수 처리가 필요하다.

 

#가변수 처리
adult_dummies = pd.get_dummies(adult)
list(adult_dummies.columns)

 

판다스의 get_dummies함수를 사용해 인코딩을 해주면 이렇게 연속형 변수는 그대로이고 범주형 특성은 값마다 새로운 특성으로 확장된다.

 

 

원핫인코딩을 해준 후의 데이터에서 workclass_? 컬럼을 보면 workclass가 ?값을 가졌던 0번, 3번 데이터는 1의 값을 갖고 나머지는 0의 값을 갖는다. 이런식으로 각 컬럼별로 해당되는 데이터는 1의 값을, 아닌 데이터는 0의 값을 갖는 것이 바로 가변수처리이다.

 

 

이제 로지스틱회귀 모델에 적합시켜보자.

#X,y 분리
features = adult_dummies.loc[:, 'age':'native.country_Yugoslavia']
X = features.values
y = adult_dummies['income_>50K'].values

#train test split
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

X_train, X_test, y_train, y_test = train_test_split(X, y.reshape(-1,), test_size=0.4, random_state=42)
X_val, X_test, y_val, y_test = train_test_split(X_test, y_test, test_size=0.5, random_state=42)

#모델 적합
log_reg = LogisticRegression(random_state=42)
log_reg.fit(X_train, y_train)
y_pred_val = log_reg.predict(X_val)

#모델 성능 평가
y_pred_proba = log_reg.predict_proba(X_val)  #predict_proba : 예측확률
y_pred = np.argmax(y_pred_proba, axis=1)
accuracy_score(y_val, y_pred)
>>>0.7953009828009828

 

널값 처리나 standard scaler 같은 다른 전처리를 안하고 가변수 처리만 해서 모델 성능은 썩 좋지는 않다..ㅋㅋ

보다 상세한 EDA는 추가적으로 실습하는 걸로!