원핫인코딩, 가변수(dummy variable)은 성별, 학력과 같은 범주형 변수를 0 또는 1값을 가진 하나 이상의 새로운 특성으로 바꾼 것이다. 이 때 변수의 특성 개수는 상관없다.
예를 들어 학력이라는 특성에 '학사', '석사', '박사' 3개 값이 있다고 가정해보자. 그러면 어떤 사람의 학력 값에 해당하는 특성은 1이 되고 나머지는 0이 된다. 즉 데이터 포인트마다 정확히 3개의 특성 중 하나는 1이 되고 나머지 2개는 0이 된다.
원핫 인코딩은 왜 하는걸까? 컴퓨터는 문자를 이해할 수 없기 때문에 컴퓨터가 알아들을 수 있는 숫자로 변환시켜주는 작업이 필요한 것이다.
많은 데이터에 문자값이 포함되어 있기 때문에 원핫인코딩은 전처리 과정에서 아주 흔하게 사용되며 머신러닝, 딥러닝뿐만 아니라 자연어처리, 데이터 마이닝 등 다양한 분야에서 사용되기 때문에 꼭 제대로 짚고 넘어가는 것이 중요하다.
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는 추가적으로 실습하는 걸로!
'파이썬 > 전처리' 카테고리의 다른 글
차원축소 방법 PCA 외 LDA, SVD 등 (0) | 2021.09.20 |
---|---|
라쏘와 엘라스틱넷, 선형회귀 과적합 방지를 위한 규제 방법 (0) | 2021.07.23 |
파이썬 null 처리 방법, fillna()와 dropna()로 결측치 보정하기 (0) | 2021.07.17 |
베이지안 최적화(optimization) 개념 Auto Ml로 하이퍼파라미터 튜닝하기 (0) | 2021.07.12 |
데이터 스케일링 반드시 필요한 전처리 과정! fit_transform과 transform의 차이 (1) | 2021.06.23 |