컴퓨터에서 인코딩이란 컴퓨터에서 연산이 가능하도록 범주형자료,명목형자료와 같은 변수를 0또는 1 로 인코딩하여 머신러닝 알고리즘에서 사용가능하도록 데이터를 변환하는 것
사이킷런 머신러닝 알고리즘은 문자열 값을 입력 값으로 허용하지 않습니다. 그러므로 문자열 값들을 숫자 형으로 변환하는 인코딩 작업이 필요합니다.
머신러닝에서의 인코딩 방식을 대표적으로 레이블 인코딩, 원-핫 인코딩 두 가지가 있습니다. 각각의 인코딩 방식에 대해 공부해 보겠습니다
from sklearn.preprocessing import LabelEncoder
items = ['TV','냉장고','전자렌지','컴퓨터','선풍기','선풍기','믹서','믹서']
## LabelEncoder 를 객체로 생성한 후, fit() 과 transform()으로 label인코딩 수행.
encoder = LabelEncoder()
encoder.fit(items)
labels = encoder.transform(items)
print('인코딩 변환값:',labels)
print('인코딩 클래스:',encoder.classes_)
print('디코딩 원본 값:',encoder.inverse_transform([0, 1, 4, 5, 3, 3, 2, 2]))
인코딩 변환값: [0 1 4 5 3 3 2 2]
인코딩 클래스: ['TV' '냉장고' '믹서' '선풍기' '전자렌지' '컴퓨터']
디코딩 원본 값: ['TV' '냉장고' '전자렌지' '컴퓨터' '선풍기' '선풍기' '믹서' '믹서']
classes_ : 0번부터 순서대로 어떤 문자열이 변환된 것인지 보여줍니다.
inverse_transform : 인코딩된 값을 받아 디코딩해줍니다.
from sklearn.preprocessing import OneHotEncoder
import numpy as np
items = ['TV','냉장고','전자렌지','컴퓨터','선풍기','선풍기','믹서','믹서']
oh_encoder = OneHotEncoder()
## 리스트 형태의 데이터를 array로 바꿔 차원을 2차원 배열로 변경한다는 의미
## 여기서 reshape(8,1) = reshape(-1,1)과 같은 의미로 일단 1열로 정리하면 알아서
## 행의 값이 지정
items = np.array(items).reshape(-1,1)
oh_labels = oh_encoder.fit_transform(items)
oh_labels.toarray()
array([[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.]])
판다스의 get_dummies 메서드를 사용하면 숫자형 값 변환없이 원-핫 인코딩을 쉽게 구현 할 수 있습니다.
import pandas as pd
df = pd.DataFrame({'item':["TV","냉장고","전자렌지","컴퓨터","선풍기","선풍기","믹서","믹서"]})
pd.get_dummies(df['item'])
TV 냉장고 믹서 선풍기 전자렌지 컴퓨터
0 1 0 0 0 0 0
1 0 1 0 0 0 0
2 0 0 0 0 1 0
3 0 0 0 0 0 1
4 0 0 0 1 0 0
5 0 0 0 1 0 0
6 0 0 1 0 0 0
7 0 0 1 0 0 0