OrdinalEncoder (LabelEncoder vs OrdinalEncoder)
머신러닝을 공부하면서 문자열 데이터를 숫자형으로 바꾸는 사이킷런에서 제공하는 인코딩은 LabelEncoder만 쓰면 된다고 생각했다.
하지만 찾아보니 LabelEncoder는 레이블 데이터 즉 우리가 원하는 종속변수에 대해 인코딩을 할 때만 사용하라는 권고사항을 발견했다.
그렇기에 LabelEncoder를 사용할 때는 1차원의 배열을 기대하는 것이었다!!!
종속변수 즉, 우리가 예측해야하는 레이블 데이터는 1차원의 배열로 만들어져 있기 때문에 LabelEncoder는 1차원 배열을 기대!!!
그래서 독립변수 피처 데이터들의 문자열을 정수 숫자형 데이터로 바꾸는 방법인 OrdinalEncoder를 알아보자.
OrdinalEncoder또한 LabelEncoder와 비슷하다. 문자열로 되어있는 데이터들을 숫자형으로 바꿔주는 것이다.
이때 하나하나씩 바꾸면 너무 힘들기 때문에 사이킷런에서는 ColumnTransformer라는 모듈을 진행하는데 이것은 pipeline을 할 때도 사용했었다. 여기서 자세히 알아보자.
ColumnTransformer는 판다스 데이터프레임의 열마다 다른 변환을 적용하도록 도와주는 역할을 한다. 여러 개의 열을 변환하거나 적용할 때 굉장히 도움이 많이 된다.
ColumnTransformer의 매개변수
첫번째 매개변수로 transformers의 리스트를 받는다. 이는 코드로 보면 모두 이해가 될 것이다.
두번째 매개변수로 remainder라는 매개변수도 받는데 이것 또한 코드로 보자.
OrdinalEncoder는 문자열을 정수로 변환하는 형태에서 float의 형태 실수의 형태로 인코딩을 한다. 그렇기에 int로 변환해주기 위해서 np.int64를 써주게 된다. 또한 categories 매개변수의 기본 값은 'auto'로 훈련 데이터셋에서 자동으로 범주를 인식한다. 또는 categories 매개변수에 직접 범주 리스트를 전달할 수도 있다.
두번째 매개변수인 remainder를 쓴 코드
import sklearn
import numpy as np
df = pd.DataFrame([
['green', 'L', 10.1, 'class1'],
['red', 'M', 13.5, 'class2'],
['blue', 'XL', 15.3, 'class1'],])
df.columns = ['color', 'size', 'price', 'classlabel']
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OrdinalEncoder
ord_enc = OrdinalEncoder(dtype=np.int64)
column_transform = ColumnTransformer(
transformers=[('enc', ord_enc, ['color'])], remainder='passthrough')
X_trans = column_transform.fit_transform(df)
X_trans
array([[1, 'L', 10.1, 'class1'],
[2, 'M', 13.5, 'class2'],
[0, 'XL', 15.3, 'class1']], dtype=object)
두번째 매개변수인 remainder를 안 쓴 코드
import sklearn
import numpy as np
df = pd.DataFrame([
['green', 'L', 10.1, 'class1'],
['red', 'M', 13.5, 'class2'],
['blue', 'XL', 15.3, 'class1'],])
df.columns = ['color', 'size', 'price', 'classlabel']
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OrdinalEncoder
ord_enc = OrdinalEncoder(dtype=np.int64)
column_transform = ColumnTransformer(transformers=[('enc', ord_enc, ['color'])])
X_trans = column_transform.fit_transform(df)
X_trans
array([[1],
[2],
[0]])
OridnalEncoder를 ColumnTransformer를 이용해서 여러차원의 배열을 순차적으로 적용, 변환하면서 인코딩 하는 것을 볼 수 있다.
여기서 이제 다시 문자열로 바꾸는 디코딩을 보자.
디코딩은 앞에서 ColumnTransformer에 사용한 변환기 named_transformers_ 속성으로 앞서 지정한 'enc' 이름으로 참조 할 수 있다. 또한 OrdinalEncoder의 inverse_transform메서드를 호출하면 된다.
column_transform.named_transformers_['enc'].inverse_transform(X_trans)
array([['green'],
['red'],
['blue']], dtype=object)
우리는 OrdinalEncoder를 ColumnTransformer를 이용해서 인코딩과 디코딩을 쉽게하는 것을 해보았다. 이것은 굉장히 많이 쓰이기 때문에 꼭 알아두자!!!!