본문 바로가기
ML & DL/Machine Learning

[ML] Encoding : Label & One Hot

by 홍월이_ 2022. 12. 16.

아래 내용들은 제가 혼자 학습하면서 정리한 내용들입니다.

'부족한 내용' 혹은 '잘못된 내용'이 있을 수 있습니다.

댓글 남겨주시면 더욱 공부하고 수정하도록 하겠습니다.

감사합니다.


데이터 인코딩

  • 머신러닝을 위한 대표적인 인코딩 방식 : 레이블 인코딩(Label Encoding) & 원-핫 인코딩(One Hot Encoding)
  • 레이블 인코딩은 범주형 데이터의 피처를 unique한 코드형 숫자값으로 변환하는 방식
  • 원-핫 인코딩은 피처 값의 유형에 따라 새로운 피처를 추가해 고유 값에 해당하는 컬럼에만 1을 표시하고 나머지 컬럼에는 0을 표시하는 방식

레이블 인코딩

  • Scikit Learn의 LabelEncoder 클래스로 구현
from sklearn.preprocessing import LabelEncoder

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

 

LabelEncoder를 객체로 생성한 후, fit()과 transform()으로 레이블 인코딩 수행

# LabelEncoder를 객체로 생성한 후, fit()과 transform()으로 레이블 인코딩 수행.
encoder = LabelEncoder()

encoder.fit(items)
labels = encoder.transform(items)
print('인코딩 변환값:', labels)

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

 

LabelEncoder 속성들

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

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

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

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

 

문제점

  • 간단하게 문자열 값을 숫자형 카테고리 값으로 변환
  • 숫자 값에 크고 작음에 대한 ordinal한 특성이 반영되기 독립적인 관측값간의 관계성이 생긴다.
  • 몇몇 ML 알고리즘에서 가중치가 더 부여되거나 중요하게 인식하는 등, 예측 성능이 떨어지는 경우 발생
  • 선형회귀와 같은 ML 알고리즘 보다는 트리 계열의 알고리즘에서 더 적합하다.

 

원-핫 인코딩(One-Hot Encoding)

  • 레이블 인코딩의 문제점을 해결하기 위한 인코딩
  • Scikit Learn의 OneHotEncoderEncoder 클래스로 변환 가능
  • 입력값으로 2차원 데이터가 필요
  • 변환한 값이 Sparse Matrix 형태이므로 toarray()를 이용해 Dense Matrix로 변환 필요
  • Pandas get_dummies() 메서드를 사용하여 쉽게 변환이 가능
from sklearn.preprocessing import OneHotEncoder
import numpy as np

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

 

2차원 ndarray로 변환

# 2차원 ndarray로 변환
items = np.array(items).reshape(-1, 1)

 

원-핫 인코딩 적용

# 원-핫 인코딩 적용
oh_encoder = OneHotEncoder()
oh_encoder.fit(items)
oh_labels = oh_encoder.transform(items)

 

OneHotEncoder로 변환한 결과를 밀집 행렬로 변환

print('원-핫 인코딩 데이터')
print(oh_labels.toarray())
print('원-핫 인코딩 데이터 차원')
print(oh_labels.shape)

>> 원-핫 인코딩 데이터
[[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. 1. 0. 0. 0.]
 [0. 0. 1. 0. 0. 0.]]
원-핫 인코딩 데이터 차원
(7, 6)

 

Pandas get_dummies() 이용

import pandas as pd

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

 

Reference

 

파이썬 머신러닝 완벽 가이드(개정2판): 다양한 캐글 예제와 함께 기초 알고리즘부터 최신 기법

자세한 이론 설명과 파이썬 실습을 통해 머신러닝을 완벽하게 배울 수 있습니다! 《파이썬 머신러닝 완벽 가이드》는 이론 위주의 머신러닝 책에서 탈피해, 다양한 실전 예제를 직접 구현해 보

wikibook.co.kr

 

sklearn.preprocessing.LabelEncoder

 

scikit-learn.org

 

sklearn.preprocessing.OneHotEncoder

Examples using sklearn.preprocessing.OneHotEncoder: Release Highlights for scikit-learn 1.1 Release Highlights for scikit-learn 1.1 Release Highlights for scikit-learn 1.0 Release Highlights for sc...

scikit-learn.org

 

레이블인코딩(Label Encoding) vs 원핫인코딩(One-hot Encoding) 비교

컴퓨터는 인간의 언어를 이해하지 못한다. 우리가 컴퓨터에 한글을 입력한다 해도 컴퓨터가 받아들이는 것은 0과 1의 이진수로 이해를 하게된다. 따라서 우리가 머신러닝/딥러닝을 할 때 문자열

hye-z.tistory.com

 

...끝

 

댓글