[빅데이터] 데이터 인코딩 / Data Encoding
1. 데이터 인코딩을 사용하는 이유
사이킷런의 머신러닝 알고리즘은 문자열 값을 허용하지 않는다.
따라서 범주형 데이터인 문자형과 카테고리형 값을 모두 숫자형으로 변환해야한다.
2. 데이터 인코딩 종류
1). Label Encoding(레이블 인코딩)
카테고리형 값을 코드형 숫자값으로 변환하는 것을 의미한다.
예를 들어 타이타닉 데이터의 embark_town 구분이 Southampton, Cherbourg, Queenstown 값으로 구성되어 있다.
이를 Southampton : 1, Cherbourg : 2, Queenstown : 3 과 같은 숫자형 값으로 변환하는 것이 Label Encoding 이다.
실제 코드로 실행해보면 아래와 같다.
패키지 불러오기
# 데이터 구성
import pandas as pd
import numpy as np
# seaborn
import seaborn as sns
# Encoder
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
# 경고 메시지 무시
import warnings
warnings.filterwarnings('ignore')
데이터 불러오기
# 데이터 불러오기
df_raw = sns.load_dataset('titanic')
df_raw['embark_town']
Label Encoding 실습
# 데이터 선택
embark_town = df_raw.iloc[:,12:13].values
# LabelEncoder
le = LabelEncoder()
# fit_transform()
embark_town[:,0] = le.fit_transform(embark_town[:,0])
# DataFrame 형태로 변환
embark_town = pd.DataFrame(embark_town)
# column명 설정
embark_town.columns = ['embark_town']
# 결과 확인
print(embark_town)
다음과 같이 값이 0, 1, 2로 변경된 것을 확인할 수 있다.
데이터 이해를 돕기 위해 딕셔너리 형태로 변환하는 방법은 아래와 같다.
dict형 변환
# dict형 변환
embark_town_mapping = dict(zip(le.classes_, le.transform(le.classes_)))
print('embark_town의 Label Encoding 결과')
print(embark_town_mapping)
print(embark_town.head(10))
하지만 Label Encoding은 일괄적인 숫자 값으로 변환되는 과정에서 몇몇 머신러닝 알고리즘의 예측 성능이 떨어질 수 있다.
숫자 값의 크고 작음에 대한 특성이 작용하기 때문이다.
이러한 특성 때문에 선형회귀와 같은 머신러닝 알고리즘에는 사용하지 않는 것이 좋고, 트리 기반의 알고리즘에서는 숫자의 특성을 반영하지 않으므로 사용해도 괜찮다.
One-Hot Encoding(원핫 인코딩)은 이러한 Label Encoding(레이블 인코딩)의 문제점을 해결하기 위한 방법이다.
2). One-Hot Encoding(원핫 인코딩)
One-Hot Encoding(원핫 인코딩)은 값의 유형에 따라 새로운 피처를 추가하여 고유 값에 해당하는 컬럼에만 1을 표시하고 나머지 컬럼에는 0을 표시하는 방식이다.
즉, 여러 개의 속성 중 단 한개의 속성만 1로 표시한다.
Label Encoding 실습에서 사용한 타이타닉 데이터를 활용하여 실제 코드로 실행해보면 아래와 같다.
One-Hot Encoding 실습
# 데이터 선택
embark_town = df_raw.iloc[:,12:13].values
# OneHotEncoder
ohe = OneHotEncoder()
# fit_transform()
embark_town = ohe.fit_transform(embark_town).toarray()
# DataFrame 형태로 변환
embark_town = pd.DataFrame(embark_town)
# column명 설정
embark_town.columns = ['Cherbourg','Queenstown','Southampton']
# 결과 확인
print('embark_town의 One-Hot Encoding 결과')
print(embark_town.head(10))
Pandas(판다스)에는 One-Hot Encoding(원핫 인코딩)을 더 쉽게 지원하는 방법이 있다.
get_dummies()를 이용하면 된다. 실행해보면 아래와 같다.
pd.get_dummies()
# pd.get_dummies()
pd.get_dummies(df_raw['embark_town'])
Label Encoding(레이블 인코딩)과 달리 One-Hot Encoding(원핫 인코딩)은 주의할 점이 있다.
입력값으로 2차원 데이터가 필요하다는 것과, 변환한 값이 희소행렬(Sparse Matrix) 형태이므로 toarray()를 이용하여 밀집행렬(Dense Matrix)로 변환해야한다.
3. 분석 시 활용방안
범주형 변수 데이터 분석을 실시할 경우 pandas의 get_dummies()를 이용하는 것이 빠르고, 편하다.
하지만 정확도가 낮을 경우 변수에 따라 다른 인코딩을 적용해보면 좋을 것 같다.