기본적으로 사이킷런의 머신러닝 알고리즘은 문자열 값을 입력 값으로 허락하지 않는다.
그렇기 때문에 모든 문자열 값들을 숫자 형으로 인코딩하는 전처리 작업 후에 머신러닝 모델에 학습을 시켜야한다.
이렇게 인코딩 하는 방식에는 크게 레이블 인코딩(Lable encoding)과 원-핫 인코딩(One Hot Encoding)이 있다.
레이블 인코딩
from sklearn.preprocessing import LabelEncoderitems=['트와이스','BTS','레드벨벳','신화','GOD','GOD']# LabelEncoder를 객체로 생성한 후 , fit( ) 과 transform( ) 으로 label 인코딩 수행. encoder = LabelEncoder()
encoder.fit(items)labels = encoder.transform(items)
print('인코딩 변환값:',labels)
- 여기서 객체의 인코딩 전 원래의 값을 확인할 수 있는 방법이 있다.
print('인코딩 클래스:',encoder.classes_)
- 레이블 인코딩의 문제점
- 일괄적인 숫자 값으로 변환되면서 예측 성능이 떨어질 수 있다.
-> 숫자의 크고 작음에 대한 특성이 작용
2. 선형 회귀와 같은 ML 알고리즘에는 적용하지 않아야 함 (트리 계열의 ML알고리즘은 숫자의 이러한 특성을 반영하지 않으므로 괜찮음)
원 — 핫 인코딩
간단하게 피처 값의 유형에 따라 새로운 피처를 추가해 고유 값에 해당하는 칼럼에만 1을 표시하고 나머지 칼럼에는 0을 표시하는 방법이다.
- SKlearn (사이킷런 사용 — 상대적으로 복잡)
-> 레이블 인코딩을 한번 거쳐야함.
from sklearn.preprocessing import OneHotEncoder
import numpy as np
items=['트와이스','BTS','레드벨벳','신화','GOD','GOD']# 먼저 숫자값으로 변환을 위해 LabelEncoder로 변환합니다.
encoder = LabelEncoder()
encoder.fit(items)
labels = encoder.transform(items)
# 2차원 데이터로 변환합니다.
labels = labels.reshape(-1,1)# 원-핫 인코딩을 적용합니다.
oh_encoder = OneHotEncoder()
oh_encoder.fit(labels)
oh_labels = oh_encoder.transform(labels)
print('원-핫 인코딩 데이터')
print(oh_labels.toarray())
print('원-핫 인코딩 데이터 차원')
print(oh_labels.shape)
- pandas (get_dummies() 함수 사용)
import pandas as pddf = pd.DataFrame({'item':['트와이스','BTS','레드벨벳','신화','GOD','GOD'] })
df# pd.get_dummies(df)# 원핫인코딩 실행
결론적으로는 pandas의 get_dummies 함수가 가장 좋은 방법으로 생각된다.