티스토리 뷰
이번 포스팅의 주제는 범주형 변수 인코딩하기 + 훈련 후 예측 시 새로운 데이터가 들어왔을 때 어떻게 되는가
OneHotEncoder
간단한 데이터를 만들어서 살펴보자.
xxxxxxxxxx
import pandas as pd
train = pd.DataFrame([['a',1], ['b',1],['c',0]])
컬럼0은 명목형이고 컬럼1은 순위형이다. 원핫인코더의 좋은 점은 Ordinal 변수도 모두 범주형으로 인식하여 처리한다는 점이다.
xxxxxxxxxx
from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder()
pd.DataFrame(ohe.fit_transform(train).toarray())
컬럼0이 a,b,c 3값이 때문에 [1,0,0] [0,1,0] [0,0,1]로 잘 구분했고 컬럼1 역시 [0,1] [1,0] 으로 잘 구분했다. 그러나 원핫인코더의 단점은 테스트셋에 새로운 데이터가 들어왔을 때 에러를 낸다는 점이다. 테스트셋의 컬럼0에 훈련하지 않은 값 d
를 넣게되면 아래와 같은 에러를 볼 수 있다.
test = pd.DataFrame([['d',1], ['b',1],['c',0]])
ohe.transform(test)
ValueError: Found unknown categories ['d'] in column 0 during transform
get_dummies
그럼 이번엔 판다스의 get_dummies
를 이용해보자.
xpd.get_dummies(train)
비슷하지만 조금 다른 결과가 나온다. 가장 큰 차이는 Ordinal 변수는 숫자로 인식해서 범주형 처리를 하지 않은 점이다. 명목형인 컬럼0 뒤에 prefix를 붙이고 값을 구분했다. 굳이 하나 더 하자면 float이 아니라 int로 된 점 정도.
pd.get_dummies(test)
그러나 get_dummies
역시 test에 새로운 값이 들어왔을 때는 다른 컬럼을 생성하게 되므로 역시 d 값을 걸러내지 못한다.
결론 > test 값에 새로운 값이 들어올 때도 잘 분류하고싶다면 본인이 직접 소스코드 변경해야한다. ㅎㅎ. 이거 진짜 짜증나서 만들어야겠다 ㅎㅎㅎㅎ
'데이터 분석 > ML' 카테고리의 다른 글
SVM 기초 빠르게 훑어보기 (0) | 2019.06.19 |
---|---|
문자열 텍스트 프레임 분류하기 (0) | 2019.05.07 |
정규식 (0) | 2018.11.09 |
알고리즘 체인과 파이프라인 (0) | 2018.11.07 |