본문 바로가기
ML/ML-Kaggle, 데이콘

OneHot 인코딩-OneHotEncoder(), pd.get_dummies()

by lucian 2021. 10. 8.

원핫인코딩은 컴퓨터가 사람의 언어를 이해하지 못할 때 쓴다.

보통 과일 컬럼 안에 사과, 배 , 딸기가 있다 한다면 컴퓨터는 이 것이 뭔소린가 할것이다.

그럴때 컴퓨터도 이해할 수 있게 바꿔주는 것이 인코딩인데 그 중 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://conanmoon.medium.com/%EB%8D%B0%EC%9D%B4%ED%84%B0%EA%B3%BC%ED%95%99-%EC%9C%A0%EB%A7%9D%EC%A3%BC%EC%9D%98-%EB%A7%A4%EC%9D%BC-%EA%B8%80%EC%93%B0%EA%B8%B0-%EC%9D%BC%EA%B3%B1%EB%B2%88%EC%A7%B8-%EC%9D%BC%EC%9A%94%EC%9D%BC-7a40e7de39d4

 

데이터과학 유망주의 매일 글쓰기 — 일곱번째 일요일

범주형 데이터의 다양한 인코딩(Encoding)

conanmoon.medium.com

 

 

https://techblog-history-younghunjo1.tistory.com/99

 

[ML] How to encode categorical variables

이번 포스팅에서는 Categorical variables 즉, 범주형 변수들을 인코딩하는 여러가지 방법에 대해서 알아보려고 한다. 해당 내용은 포스팅 하단의 래퍼런스를 통해 학습했고 해당 래퍼런스에서 다루

techblog-history-younghunjo1.tistory.com

 

'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

댓글