머신 러닝 알고리즘은 단어나 글자 데이터를 가지고 학습을 할 수 없다. 숫자로 바꿔줘야 학습이 가능하다. 즉, 글자나 단어를 숫자로 바꿔주는 전처리 작업이 없이는 학습을 시킬 수 없다는 뜻이다.
Label Encoding
from sklearn.preprocessing import LabelEncoder
ds=['태조','세종','성종','영조','정조','태조']
# 객체 생성
encoder = LabelEncoder()
# fit과 transform 으로 label 인코딩 수행.
encoder.fit(ds)
labels = encoder.transform(ds)
print('인코딩 :', labels)
결과값은 인코딩 : [4 1 0 2 3 4] 이다.
태조 -> 4, 세종 -> 1, 성종 -> 0와 같이 의미 없는 숫자를 부여한다.
아래의 코드로 decoding도 가능하다.
print('디코딩 :', encoder.inverse_transform([4, 1, 0, 2, 3, 4]))
결과값은 디코딩 : ['태조' '세종' '성종' '영조' '정조' '태조'] 이다.
아래의 코드로 인코딩 전 데이터 셋의 값을 확인할 수 있다.
print(encoder.classes_)
결과 값은 인코딩 클래스 : ['성종' '세종' '영조' '정조' '태조'] 이다.
그러나, label encoding의 경우 몇몇 알고리즘에서는 예측성능이 떨어지는 경우가 발생한다. 의미 없는 숫자임에 불구하고, 값의 크고 작음에 대한 특성이 반영되기 때문이다. 또한, 부여된 숫자에 순서 개념이 없음에도 불구하고, 모델은 순서 개념을 전제하여 학습하게 된다. 이런 이유로 회귀 알고리즘을 사용하면 안 된다. 트리 계열의 알고리즘의 경우 값의 크기의 특성을 반영하지 않기 때문에 레이블 인코딩도 별 문제가 없다.
One Hot Encoding
문자를 숫자로 바꾸는 여러 가지 기법 중에서 가장 기본적인 표현방법이 원 핫 인코딩이라는 표현방법이다.
텍스트 또는 단어를 의미 있는 숫자로 바꾸는 가장 손쉬운 방법이 원 핫 인코딩 (One-hot-encoding)이다. 즉, 단어가 포함되는 자리엔 1을 넣고 나머지에는 0을 넣는다. 이렇게 표현된 벡터를 원-핫 벡터(One-hot vector)라고 한다.
예를 들어보자.
원 핫 인코딩 전
| 왕 |
| 태조 |
| 세종 |
| 성종 |
| 영조 |
| 정조 |
| 태조 |
원 핫 인코딩 후
| 언어 | 성종 | 세종 | 영조 | 정조 | 태조 |
| 태조 | 0 | 0 | 0 | 0 | 1 |
| 세종 | 0 | 1 | 0 | 0 | 0 |
| 성종 | 1 | 0 | 0 | 0 | 0 |
| 영조 | 0 | 0 | 1 | 0 | 0 |
| 정조 | 0 | 0 | 0 | 1 | 0 |
| 태조 | 0 | 0 | 0 | 0 | 1 |
python 코드로 구현하면 아래와 같다.
from sklearn.preprocessing import OneHotEncoder
import numpy as np
items=['태조','세종','성종','영조','정조','태조']
# 먼저 숫자값으로 변환을 위해 LabelEncoder로 변환합니다.
encoder = LabelEncoder()
encoder.fit(items)
labels = encoder.transform(items)
# 2차원 데이터로 변환합니다.
labels = labels.reshape(-1,1)
# 원-핫 인코딩을 적용합니다.
onehot_encoder = OneHotEncoder()
onehot_encoder.fit(labels)
onehot_labels = onehot_encoder.transform(labels)
print('원-핫 인코딩 데이터')
print(onehot_labels.toarray())
print('원-핫 인코딩 데이터 차원', onehot_labels.shape)
원-핫 인코딩 데이터
[[0. 0. 0. 0. 1.]
[0. 1. 0. 0. 0.]
[1. 0. 0. 0. 0.]
[0. 0. 1. 0. 0.]
[0. 0. 0. 1. 0.]
[0. 0. 0. 0. 1.]]
원-핫 인코딩 데이터 차원 (6, 5)
'머신러닝(ML)' 카테고리의 다른 글
| Pandas란... (0) | 2020.07.23 |
|---|---|
| K-Means 클러스터링 (0) | 2020.07.09 |
| 나이브 베이즈 분류( Naive Bayes Classification)란... (0) | 2020.07.09 |
| 두 점 사이의 거리 공식 (0) | 2020.07.09 |
| 베이즈 정리( Bayes' Theorem )란... (0) | 2020.07.09 |