원핫인코딩은 컴퓨터가 사람의 언어를 이해하지 못할 때 쓴다.
보통 과일 컬럼 안에 사과, 배 , 딸기가 있다 한다면 컴퓨터는 이 것이 뭔소린가 할것이다.
그럴때 컴퓨터도 이해할 수 있게 바꿔주는 것이 인코딩인데 그 중 onehot 인코딩은 컬럼안에 과일의 갯수만큼 컬럼을 만들어 그 컬럼중 자신이 속한 과일에 1을 표시하고 나머지는 0을 표시하는 방법이다.
쉽게 말해
과일
사과
사과
배
딸기 를
사과 배 딸기
1 0 0
1 0 0
0 1 0
0 0 1 이런 식으로 바꿔준다.
또 그러면 의문점이 생긴다. 하나의 컬럼 안에 사과=1, 배=2, 딸기=3로 해주면 안될까??
- 이렇게 생긴 컬럼을 머신러닝 알고리즘에 그대로 넣어 데이터를 예측 하라고 지시한다면 컴퓨터가 이들 값의 관계를 예상과 다르게 형성할 가능성이 있다.( 사과, 배 , 딸기 따로이지만, 사과+배=딸기 로 인식할 수 있기 때문에 원핫 인코딩을 써주는 거다!)
OneHotEncoder()
from sklearn.preprocessing import OneHotEncoder
encoder=OneHotEncoder()
#[]를 더 써준 이유는 2차원 배열이 되야됨. 인자로 2차원 배열을 받기 때문이다.
onehot=encoder.fit_transform(df[['컬럼명']])
#인코더 형태이기 때문에 array형식으로 바꿔준 후 df으로 바꿔준다.
onehot=onehot.toarray()
onehot=pd.DataFrame(onehot)
# encoder의 "get_feature_names()"를 사용해 column 이름을 바꿔준다. 기존엔 0 1 2 순의 컬럼 명이였음
onehot.columns = encoder.get_feature_names()
# 원본 데이터에 병합한다.
df=pd.concat([df,onehot],axis=1)
# 그 후 onehotencoder로 변경한 컬럼을 버린다.
df=df.drop(columns=['컬럼명'])
########################################
# 위의 코드들을 단순화하면 #
########################################
encoder = OneHotEncoder()
onehot = pd.DataFrame(encoder.fit_transform(df[['컬럼명']]).toarray(), columns = encoder.get_feature_names())
df = pd.concat([df,onehot], axis = 1).drop(columns = ['컬럼명'])
pd.get_dummies()
위에 onehotencoder와 get_dummies는 둘다 파생변수를 만든다.
그러면 이 두개의 차이점이 뭐냐하면, OneHotEncoder()는 명목변수와 순위변수 모두다 인코딩을 해주는 반면 get_dummies()는 명목변수만 인코딩 해준다는 점이다.
새로운 df을 만들어봤다. 명목변수 컬럼에는 사과,바나나,배가 들어있고 순위변수 컬럼에는 사과가 2등, 바나나가 1등, 배가 0등으로 2,1,0을 넣어봤다.
import pandas as pd
df = pd.DataFrame()
df['명목변수']=['사과','바나나','배']
df['순위변수']=[2,1,0]
df
이제 여기서 dummies()함수를 써보자.
pd.get_dummies(df)
이처럼 전체 df이 들어가니 명목변수 항목만 onehotnecoding되었다.
즉 순위변수는 건들지 않았고 명목변수 항목만 바뀐 것을 볼 수 있다.
이제 pd.get_dummies()함수가 명목변수만 바꿔준다는 사실을 알았다.
OneHotEncoder()를 써보자.
from sklearn.preprocessing import OneHotEncoder
onehot=OneHotEncoder()
onehot_df=pd.DataFrame(onehot.fit_transform(df).toarray())
onehot_df
알아보기 힘들지만 모든 순위변수와 명목변수가 onehotencoding된 것을 볼 수 있다.
알아보기 힘드므로 명목변수, 순위변수 이렇게 한개씩 onehotencoding해보자.
from sklearn.preprocessing import OneHotEncoder
onehot=OneHotEncoder()
nominal_df=pd.DataFrame(onehot.fit_transform(df[['명목변수']]).toarray())
nominal_df
from sklearn.preprocessing import OneHotEncoder
onehot=OneHotEncoder()
ordinal_df=pd.DataFrame(onehot.fit_transform(df[['순위변수']]).toarray())
ordinal_df
이렇게 위에서 본 것 전체 df을 원핫 인코딩한 것을 그대로 쪼개진 채 나오는 것을 볼 수 있다.
정리를 하자.
OneHotEncoder()는 명목변수든 순위변수든 모두 원핫 인코딩을 해준다.
pd.get_dummies()함수는 명목변수만 원핫 인코딩을 해준다.
그 외. 나머지 encoding 하는 방법들
https://techblog-history-younghunjo1.tistory.com/99
'ML > ML-Kaggle, 데이콘' 카테고리의 다른 글
GBM(Gradient Boosting Model) (0) | 2021.10.08 |
---|---|
EDA (0) | 2021.10.08 |
수치형 데이터 정규화 (0) | 2021.10.08 |
이상치(Outlier) (0) | 2021.10.08 |
랜덤포레스트(RandomForestRegressor) (3) | 2021.09.29 |
댓글