Note ≡
역주 LabelEncoder는 타깃 레이블을 인코딩하기 위한 클래스이므로 입력 데이터로 1차원 배열을 기대합니다. 앞 코드에서 color 열만 추출해서 LabelEncoder 객체에 주입한 이유입니다. 데이터셋에 변경해야 할 열이 많다면 동일한 작업을 반복해야 하므로 번거롭습니다. 범주형 데이터를 정수로 인코딩하는 OrdinalEncoder와 판다스 데이터프레임의 열마다 다른 변환을 적용하도록 도와주는 ColumnTransformer를 이용하면 여러 개의 열을 한 번에 정수로 변환할 수 있습니다. 코드는 다음과 같습니다.
>>> from sklearn.compose import ColumnTransformer
>>> from sklearn.preprocessing import OrdinalEncoder
>>> ord_enc = OrdinalEncoder(dtype=np.int)
>>> col_trans = ColumnTransformer([('ord_enc', ord_enc, ['color'])])
>>> X_trans = col_trans.fit_transform(df)
>>> X_trans
array([[1],
[2],
[0]])
ColumnTransformer는 첫 번째 매개변수로 트랜스포머(transformer)의 리스트를 받습니다. 트랜스포머는 이름, 변환기, 변환할 열의 리스트로 이루어진 튜플입니다. 여기서는 이름은 ord_enc, 변환기는 OrdinalEncoder 객체, 변환할 열은 color 하나를 지정했습니다. 결과에서 알 수 있듯이 color 열이 정수 값으로 변환되었습니다.
ColumnTransformer에 사용한 변환기는 named_transformers_ 속성에서 앞서 지정한 ord_enc 이름으로 참조할 수 있습니다. 정수로 인코딩된 값을 다시 문자열로 변환하려면 다음과 같이 OrdinalEncoder의 inverse_transform 메서드를 호출합니다.
>>> col_trans.named_transformers_['ord_enc'].inverse_transform(X_trans)
array([['green'],
['red'],
['blue']], dtype=object)
OrdinalEncoder 클래스의 dtype 매개변수 기본값은 np.float64로 실수로 인코딩합니다. 앞에서는 정수로 인코딩하기 위해 np.int로 지정했습니다. categories 매개변수의 기본값은 'auto'로 훈련 데이터셋에서 자동으로 범주를 인식합니다. 또는 categories 매개변수에 직접 범주 리스트를 전달할 수 있습니다. 인식된 범주는 categories_ 속성에 저장됩니다.
사이킷런 0.24 버전에서는 OrdinalEncoder에 handle_unknown과 unknown_value 매개변수가 추가됩니다. handle_unknown의 기본값은 'error'로 알 수 없는 범주 데이터가 transform 메서드로 전달될 때 에러가 발생됩니다. handle_unknown='use_encoded_value'로 설정하면 알 수 없는 범주를 unknown_value에 지정한 정수 값으로 설정합니다.