여기서 멈추고 이 배열을 분류기에 주입하면 범주형 데이터를 다룰 때 흔히 저지르는 실수 중 하나가 됩니다. 문제가 무엇인지 눈치챘나요? 컬러 값에 어떤 순서가 없지만 학습 알고리즘이 green은 blue보다 크고 red는 green보다 크다고 가정할 것입니다. 이 가정이 옳지 않지만 알고리즘이 의미 있는 결과를 만들 수 있습니다. 그렇지만 이 결과는 최선이 아닐 것입니다.
이 문제를 해결하기 위한 통상적인 방법은 원-핫 인코딩(one-hot encoding) 기법입니다. 이 방식의 아이디어는 순서 없는 특성에 들어 있는 고유한 값마다 새로운 더미(dummy) 특성을 만드는 것입니다. 여기서는 color 특성을 세 개의 새로운 특성인 blue, green, red로 변환합니다. 이진 값을 사용하여 특정 샘플의 color를 나타냅니다. 예를 들어 blue 샘플은 blue = 1, green = 0, red = 0으로 인코딩됩니다. 사이킷런의 preprocessing 모듈에 구현된 OneHotEncoder를 사용하여 이런 변환을 수행할 수 있습니다.
>>> from sklearn.preprocessing import OneHotEncoder
>>> X = df[['color', 'size', 'price']].values
>>> color_ohe = OneHotEncoder()
>>> color_ohe.fit_transform(X[:, 0].reshape(-1, 1)).toarray()
array([[0., 1., 0.],
[0., 0., 1.],
[1., 0., 0.]])
배열의 다른 두 열을 수정하지 않기 위해 OneHotEncoder를 하나의 열(X[:, 0].reshape(-1, 1))에만 적용했습니다. 여러 개의 특성이 있는 배열에서 특정 열만 변환하려면 ColumnTransformer를 사용합니다. 이 클래스는 다음과 같이 (name, transformer, column(s)) 튜플의 리스트를 받습니다.
>>> from sklearn.compose import ColumnTransformer
>>> X = df[['color', 'size', 'price']].values
>>> c_transf = ColumnTransformer([
... ('onehot', OneHotEncoder(), [0]),
... ('nothing', 'passthrough', [1, 2])
... ])
>>> c_transf.fit_transform(X)
array([[0.0, 1.0, 0.0, 1, 10.1],
[0.0, 0.0, 1.0, 2, 13.5],
[1.0, 0.0, 0.0, 3, 15.3]])