[sklearn] One Hot Encoding 되돌리기

scikit-learn에서 OneHotEncoder를 사용하고 되돌리는 방법에 대해 알아보자.


머신러닝을 할 때, sklearn.preprocessing.OneHotEncoder 또는 sklearn.preprocessing.LabelEncoder를 사용하여 학습을 하게된다면, 최종 예측 결과도 one-hot encoded 된 결과로 나오게 되는데, 간단하게 inverse_transform을 통해 원래 형식으로 바꿀 수 있다.

 

아래처럼 샘플 시리즈 ["a", "b", "c"]가 있다고 할 때, OneHotEncoder 또는 LabelEncoder를 사용하게 된다면:

import pandas as pd
from sklearn.preprocessing import LabelEncoder, OneHotEncoder

s = pd.Series(['a', 'b', 'c'])
le = LabelEncoder()
ohe = OneHotEncoder(sparse=False)
s1 = le.fit_transform(s)
s2 = ohe.fit_transform(s.to_numpy().reshape(-1, 1))

아래와 같은 numpy.ndarray 형식을 보게 된다:

# s1
array([0, 1, 2])
# s2
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])

array를 다시 우리가 원하는 string 값으로 받으려면:

inv_s1 = le.inverse_transform(s)
inv_s2 = ohe.inverse_transform(s2).ravel()

최종값:

# inv_s1
array(['a', 'b', 'c'], dtype=object)

# inv_s2
array(['a', 'b', 'c'], dtype=object)

유의할 점은, LabelEncoder는 주로 1d array (=pandas.Series) 용도이지만 안되진 않는다, DataConversionWarning을 보게될 뿐). 그러나 OneHotEncoder의 경우 반드시 2d array (=pandas.DataFrame)을 사용해야 한다는 것.

1d array를 2d array로 바꿔야 한다거나, 왜 에러가 나는지 모르겠다면 필자의 디버깅 글을 참조하자:

[debugging] Expected 2D array, got 1D array instead

 

본 글은 필자가 답변한 How to go back from ONE-HOT-ENCODED labels to single column using sklearn? 을 가다듬은 것입니다.