머신러닝의 모델을 만들때 데이터를 '인코딩' 하게된다.
컴퓨터는 인간과 달리 텍스트를 인식하지 못하기 때문에 연산을 하거나 인식할 수 있는 숫자의 형태로 바꿔줘야한다.
문자처럼 Categorical한 데이터를 숫자로 바꾸어 주는 것을 인코딩이라고 부른다.
범주형(Categorical) 데이터를 다루는 기법 중 하나이다.
OneHotEncoding은 category_encoders라이브러리를 사용하면 범주형 데이터만 원핫 인코딩을 수행할 수 있다. scikitlearn 등의 라이브러리에서도 one-hot encoding을 사용할 수 있으나 category_encoders에서의 기능이 더 좋다고 한다.
# 라이브러리 불러오기
from category_encoders import OneHotEncoder
# 원핫 인코딩을 시켜보자.
encoder = OneHotEncoder(use_cat_names = True)
X_train = encoder.fit_transform(X_train)
X_test = encoder.transform(X_test)
파리미터에 use_cat_names =True를 넣어주면 이전에 있는 컬럼 names를 같이 가져갈 수 있다. 텍스트 value가 있는 범주형 데이터를 수치데이터로 인코딩을 할 때, 해당 데이터가 어떤 feature의 어떤 value였는지를 표현해주는 것이다.
# pd.get_dummies()
pd.get_dummies(df, prefix = ['City'])
prefix는 접두사와 같은 것으로 생각하면 된다. 위의 OneHotEncoder(use_cat_names = True)처럼 어떤 feature(위에서는 ['City']라는 feature)의 텍스트 값에서 나왔다는 것을 표현한다.
pandas의 get_dummies()는 숫자 특성은 모두 연속형이라고 생각해서 가변수를 만들지 않는다.(가변수란, 범주형 변수를 0또는 1값을 가진 하나 이상의 새로운 특성으로 바꾼 것을 의미한다.)
대신 어떤 열이 연속형인지 범주형인지를 지정할 수 있는 scikit-learn의 OneHotEncoder를 사용할 수 있고, DataFrame에 있는 숫자로 된 열을 문자열로 바꿀 수도 있다.
원핫인코더는 Ordinal 데이터도 모두 범주형으로 인식하여 처리한다.
get_dummies는 Ordinal 데이터를 숫자로 인식하기 때문에 범주형 데이터로 인식하지 않는다.
이 두 개의 방법 test 데이터에 새로운 값이 들어오면 에러가 걸리게 된다.
순서형 인코딩은 범주에 숫자를 mapping한다.
['a', 'b', 'c']의 세 범주가 있다면 이것을 [1, 2, 3]으로 인코딩하는 것이다.
트리구조학습에서 무작정 원핫인코딩을 사용하면 좋은 모델을 만들기 어렵다. 왜냐하면 트리구조에서는 중요한 특성이 상위 노드에서 먼저 분할이 일어나는 구조이기 때문이다. 따라서 범주의 종류가 많은, 즉 cardinality가 높은 특성은 원핫인코딩으로 인해 상위 노드에 선택될 가능성이 작아진다. 따라서 원핫인코딩의 영향을 받지 않는 수치형 특성이 상위노드를 차지할 기회가 높아지고 전체적인 성능 저하가 생길 수 있다.
범주들을 순서가 있는 숫자형으로 바꾸면 숫자의 크기대로 순서정보가 새롭게 생긴다.
순서형 인코딩은 범주들 간에 분명한 순위가 있을 때 그 연관성에 맞게 숫자를 정해주는 것이 좋다. 예를 들면 영화의 평점(나쁨, 보통, 좋음 등)같은 특성은 순위를 매길 수 있는 숫자로 변환하면 적절하다고 할 수 있다.
정확한 범주의 순위를 알고 있다면 mapping
파라미터를 통해 지정해줄 수 있다. category_encoders.ordinal 공식문서