RL Researcher

Data Encoding 본문

Machine-Learning/Preprocessing

Data Encoding

Lass_os 2021. 1. 16. 03:31

1. Data Encoding


머신러닝을 위한 대표적인 인코딩 방식은 레이블 인코딩(Label encoding)과 원-핫 인코딩(One Hot encoding)이 있습니다.

레이블 인코딩(Label encoding)

  • Label encoding은 카테고리 피처를 코드형 숫자 값으로 변환하는 것입니다. 예를 들어 상품 데이터의 상품 구분이 TV,냉장고, 전자레인지, 컴퓨터, 선풍기, 믹서 값으로 되어 있다면 TV : 1, 냉장고 : 2, 전자레인지 : 3, 컴퓨터 : 4, 선풍기 : 5, 믹서 : 6과 같은 숫자형 값으로 변환하는 것입니다. 

2. Label encoding


Label encoding을 코드로 구현해 보겠습니다.

from sklearn.preprocessing import LabelEncoder

items = ['TV','냉장고','전자레인지','컴퓨터','선풍기','선풍기','믹서','믹서']

# LabelEncoder를 객체로 생성한 후, fit()과 transform()으로 레이블 인코딩 수행
encoder = LabelEncoder()
encoder.fit(items)
labels = encoder.transform(items)
print('인코딩 변환값: ',labels)

======================================================

<output>
인코딩 변환값:  [0 1 4 5 3 3 2 2]

TV는 0, 냉장고는 1, 전자레인지는 4, 컴퓨터는 5, 선풍기는 3, 믹서는 2로 변환되었습니다. 위의 예제는 데이터가 작아서 문자열 값이 어떤 숫자 값으로 인코딩 되었는지 직관적으로 알 수 있지만, 많은 경우에는 이를 알지 못합니다. 이 경우에는 LabelEncoder 객체의 classes_ 속성값으로 확인하면 됩니다.

print('인코딩 클래스: ',encoder.classes_)

==========================================

<output>
인코딩 클래스:  ['TV' '냉장고' '믹서' '선풍기' '전자레인지' '컴퓨터']

classes_ 속성은 0번부터 순서대로 변환된 인코딩 값에 대한 원본값을 가지고 있습니다. 따라서 TV가 0, 냉장고 1, 믹서 2, 선풍기 3, 전자레인지 4, 컴퓨터가 5로 인코딩 되었음을 알 수 있습니다. inverse_transform()을 통해 인코딩된 값을 다시 디코딩할 수 있습니다.

print('디코딩 원본값: ',encoder.inverse_transform([4,5,2,0,1,1,3,3]))

====================================================================

<output>
디코딩 원본값:  ['전자레인지' '컴퓨터' '믹서' 'TV' '냉장고' '냉장고' '선풍기' '선풍기']

3. One Hot Encoding


OneHot Encoding은 피처 값의 유형에 따라 새로운 피처를 추가해 고유 값에 해당하는 칼렘에만 1을 표시하고 나머지 컬럼에는 0을 표시하는 방식입니다. 즉, 행 형태로 되어있는 피처의 고유 값을 열 형태로 차원을 변환한 뒤, 고유 값에 해당하는 칼럼에만 1을 표시하고 나머지 칼럼에는 0을 표시합니다.

OneHot encoding을 코드로 구현해 보겠습니다.

# Module
import numpy as np
from sklearn.preprocessing import LabelEncoder,OneHotEncoder

# Data
items = ['TV','냉장고','전자레인지','컴퓨터','선풍기','선풍기','믹서','믹서']

# 먼저 숫자 값으로 변환을 위해 LabelEncoder로 변환합니다.
encoder = LabelEncoder()
encoder.fit(items)
labels = encoder.transform(items)
# 2차원 데이터로 변환합니다
labels = labels.reshape(-1,1)

# OneHotEncoding
one_encoder = OneHotEncoder()
one_encoder.fit(labels)
one_labels = one_encoder.transform(labels)
print('OneHot Encoding Data')
print(one_labels.toarray())
print('OneHot Encoding Data Shape')
print(one_labels.shape)

========================================================================

<output>
OneHot Encoding Data
[[1. 0. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0. 0.]
 [0. 0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 0. 1.]
 [0. 0. 0. 1. 0. 0.]
 [0. 0. 0. 1. 0. 0.]
 [0. 0. 1. 0. 0. 0.]
 [0. 0. 1. 0. 0. 0.]]
OneHot Encoding Data Shape
(8, 6)

8개의 레코드와 1개의 칼럼을 가진 원본 데이터가 8개의 레코드와 6개의 칼럼을 가진 데이터로 변환되었습니다. TV가 0, 냉장고 1, 믹서 2, 선풍기 3, 전자레인지 4, 컴퓨터가 5로 인코딩 되었으므로 첫 번째 칼럼이 TV, 두 번째 칼럼이 냉장고, 세 번째 칼럼이 믹서, 네 번째 칼럼이 선풍기, 다섯 번째 칼럼이 전자레인지, 여섯 번째 칼럼이 컴퓨터를 나타냅니다. 

따라서, 원본 데이터의 첫 번째 코드가 TV이므로 변환된 데이터의 첫 번째 레코드의 첫 번째 칼럼이 1이고, 나머지 칼럼은 모두 0이 됩니다. 이어서 원본 데이터의 두 번째 레코드가 냉장고이므로 변환된 데이터의 두 번째 레코드의 냉장고에 해당하는 칼럼인 두 번째 칼럼이 1이고, 나머지 칼럼은 모두 0이 됩니다.

 

판다스에는 OneHot Encoding을 더 쉽게 지원하는 API가 있습니다.(get_dummies()를 이용)

Scikit-learn의 OneHotEncoder와 다르게 문자열 카테고리 값을 숫자 형으로 변환할 필요 없이 바로 변환할 수 있습니다.

# Module
import pandas as pd

df = pd.DataFrame({'item':['TV','냉장고','전자레인지','컴퓨터','선풍기','선풍기','믹서','믹서']})
pd.get_dummies(df)

 

Comments