군침이 싹 도는 코딩

레이블 인코딩 / 원핫 인코딩 본문

Python/Machine Learning

레이블 인코딩 / 원핫 인코딩

mugoori 2022. 12. 1. 10:22

머신러닝으로 학습 시키기 위해서는 방정식에 대입이 되어야 하는데

방정식은 수학식이므로 데이터를 모두 숫자로 변환하여하 한다

따라서 문자열이 있다면 그것을 레이블 인코딩 또는 원핫 인코딩으로

숫자로 변환시켜주어야 한다.

 

 

X를 Country, Age, Salary  y를 Purchased라고 할때

카테고리컬 데이터인 Country, Purchased 가 문자열이므로 이것을 숫자로 바꿔보겠다

# X를 대문자로 쓰는 이유는 X는 2차원 행렬이여야 하고

y는 1차원이여서이다

 

 

먼저 유니크한값으로 출력 후 정렬을 해준다

sorted(X['Country'].unique())
>>> ['France', 'Germany', 'Spain']

 

 

 

이후 앞에서부터 0 , 1 , 2 순으로 바꿔준다 이것을 레이블 인코딩이라고 한다

from sklearn.preprocessing import LabelEncoder, OneHotEncoder
from sklearn.compose import ColumnTransformer

encoder= LabelEncoder()
X['Country'] = encoder.fit_transform(X['Country'])


먼저 import 하고 레이블 인코딩을 변수에 저장해
핏 트랜스폼이라는 함수를 사용해 컨트리부분을 레이블 인코딩한다

 

 

 

이렇게 컨트리부분이 잘 바뀐것을 볼수있다

하지만 레이블 인코딩으로 변환후 학습시켰을때

카테고리컬 데이터의 갯수가 3개 이상일때는

레이블 인코딩으로 학습이 잘 되지 않는다

따라서 3개 이상의 카테고리컬 데이터는 *One-Hot Encoding 을

이용해서 처리한다면 학습이 잘 된다.

 

 

*One-Hot Encoding 의 예

France  Germany  Spain    Age      Salary
   1       0        0      44       72000
   0       0        1      27       48000
   0       1        0
   0       0        1

# 컨트리 데이터의 자리에 맞는 데이터값이 오면 1 아니면 0으로 표기된다

 

 

 

원 핫 인코딩 방법

ct = ColumnTransformer( [ ('encoder',OneHotEncoder(),[0])  ] , remainder='passthrough' )
ct.fit_transform( X )
>>>   # france   Germany  spain     Age      Salary
array([[1.0e+00, 0.0e+00, 0.0e+00, 4.4e+01, 7.2e+04],
       [0.0e+00, 0.0e+00, 1.0e+00, 2.7e+01, 4.8e+04],
       [0.0e+00, 1.0e+00, 0.0e+00, 3.0e+01, 5.4e+04],
       [0.0e+00, 0.0e+00, 1.0e+00, 3.8e+01, 6.1e+04],
       [1.0e+00, 0.0e+00, 0.0e+00, 3.5e+01, 5.8e+04],
       [1.0e+00, 0.0e+00, 0.0e+00, 4.8e+01, 7.9e+04],
       [0.0e+00, 1.0e+00, 0.0e+00, 5.0e+01, 8.3e+04],
       [1.0e+00, 0.0e+00, 0.0e+00, 3.7e+01, 6.7e+04]])
       
# e+00 은 10의 0승 이라는 뜻

원 핫 인코딩으로 바꾸고 싶은 컬럼의 인덱스를 리스트 안에 넣어주면 된다
원 핫 인코딩으로 바꾸고 싶은 컬럼이 여러개이면 [1,2,3] 이런식으로 써주면 된다
remainder 의 passthrough 뜻은 원 핫 인코딩을 제외한 부분을 패스 시킨다는 뜻이다
encoder라고 쓴 부분은 그냥 이름이기때문에 아무거나 써줘도 무방하다

# 원 핫 인코딩을 사용할 경우 원핫 인코딩을 한 컬럼이 제일 앞으로 온다

원 핫 인코딩을 통해 컨트리 컬럼에 있던 유니크 데이터 3개로 나눠진것을 볼수있다

나머지 컬럼은 원 핫 인코딩에 넣지 않았으므로 인코딩되지 않고 그대로 출력된다