본문 바로가기

카테고리 없음

Machine Learning Day 2 | Categorical Encoding

범주형 변수를 인코딩 하는 2가지 방법

운동이라는 범주형 변수에 축구, 농구, 야구 3가지가 있다고 가정해보자. 이런식으로 문자열로 되어 있는 경우에는 머신러닝 모델이 각 열들 사이의 상호관계를 파악하기가 쉽지 않기 떄문에 숫자 형태로 바꾸어 줘야 한다. 

One-Hot Encoding

각 종목에 이진 벡터를 만든다.

-> 축구 1 0 0, 농구 0 1 0, 야구 0 0 1

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
ct = ColumnTransformer(transformers=[('encorder', OneHotEncoder(), [0])], remainder='passthrough')
x = np.array(ct.fit_transform(x))
  • 매개변수 설명 : transformers = [(첫번쨰, 어떤 변환을 적용할 것인가? 두번쨰, 어떤 종류의 인코딩을 적용할 것인가? 세번째, 어떤 열의 인덱스를 인코딩하고 싶은가?)]
  • remainder = 'passthrough' : 변환이 적용되지 않을 열을 지정해주는 코드
  • 누락된 데이터 처리할 때와 비슷하게 fit_transform()으로 한번에 처리 가능
  • fit_transform메소드는 np.array 형태로 입력값을 반환하지 않는다. x를 np.array로 갖는 것은 필수다. 왜냐하면 기계모델을 훈련시킬 때 fit()이라는 메소드를 사용하는데 이것은 np.array 형태를 필요로 하기 때문에 np.array로 바꿔 x에 채워준다. 

Label Encoding

축구 1, 농구 2, 야구 3

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()     
x = le.fit_transform(x)
  • 1, 2, ... n 형태로 변환이 되면서 몇몇 머신러닝 알고리즘에 이를 적용할 경우 성능이 떨어지는 경우가 발생할 수 있다
  • 숫자로 되어 있어 잘못하면 가중치로 인식하여 값에 왜곡이 생기게 된다
  • 위와 같은 특징 때문에 레이블 인코딩은 선형 회귀와 같은 머신러닝 알고리즘에는 적용하지 않는다. 트리 계열의 머신러닝 알고리즘은 숫자의 이러한 특성을 반영하지 않으므로 레이블 인코딩도 별문제가 없다.