Notice
Recent Posts
Recent Comments
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

AI기록장

[ML] 데이터 인코딩 (Label / One-Hot Encoding) 본문

ML/개념정리

[ML] 데이터 인코딩 (Label / One-Hot Encoding)

SanL 2023. 9. 7. 14:34

❖ 데이터 인코딩

머신러닝 알고리즘은 문자열 데이터 속성을 입력받지 않으며, 모든 데이터는 숫자형으로 표현 되어야함


사람과 컴퓨터가 데이터를 읽는 시각이 다르기 떄문에 컴퓨터가 분석하기 쉬운 값으로 변환해줘한다.

인코딩의 종류

  • 레이블(Label)인코딩

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

인코딩 적용 방법

  • 레이블(Label) 인코딩

    : LabelEncoder 클래스, fit() 과 transform()을 이용하여 변환

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

    : OneHotEncoder 클래스

    fit()과 transform()을 이용하여 반환, 인자로 2차원 ndarray 입력 필요

    Sparse 배열 형태로 변환되므로 toarray()를 적용하여 다시 Dense 형태로 변환되어야함

    ->pd.get_dummies(DataFrame)을 이용!

▷주의해야할 부분은 레이블 인코딩은 1차원으로 들어가도 무방

하지만, 원-핫 인코딩은 반드시 2차원 ndarray로 들어가야함

-> np.array(Data).reshape(-1, 1)

[레이블 인코딩(Label encoding)]

from sklearn.preprocessing import LabelEncoder

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

# LabelEncoder를 객체로 생성한 후 , fit( ) 과 transform( ) 으로 label 인코딩 수행. 
encoder = LabelEncoder()
encoder.fit(items)
labels = encoder.transform(items)
print('인코딩 변환값:',labels)
인코딩 변환값: [0 1 4 5 3 3 2 2]
print('인코딩 클래스:',encoder.classes_)
인코딩 클래스: ['TV' '냉장고' '믹서' '선풍기' '전자렌지' '컴퓨터']

encoder.classes_를 사용하면 Encoding된 값을 이전에 어떤 값으로 데이터에 들어왔는지 확인할 수 있음

print('디코딩 원본 값:',encoder.inverse_transform([4, 5, 2, 0, 1, 1, 3, 3]))
디코딩 원본 값: ['전자렌지' '컴퓨터' '믹서' 'TV' '냉장고' '냉장고' '선풍기' '선풍기']

숫자형으로 Encoding 된 값들을 다시 문자형으로 inverse 시켜줌

[원-핫 인코딩(One-Hot encoding)]

One-Hot encoding 은 피처 값의 유형에 따라 새로운 피처를 추가해 고유 값에 해당하는 컬럼에만 1을 표시하고나머지 컬럼에는 0을 표시하는 방식

메모

  1. 원-핫 인코딩은 데이터가 2차원이여야함
  2. fit 해준 encoder 값은 스팔스 행렬이라 우리가 아닌 tolist형태로 바꿔줘야 알아볼 수 잇음.
from sklearn.preprocessing import OneHotEncoder
import numpy as np

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

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

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

# OneHotEncoder로 변환한 결과는 희소행렬(Sparse Matrix)이므로 toarray()를 이용하여 밀집 행렬(Dense Matrix)로 변환. 
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. 0. 1. 0. 0.]
 [0. 0. 1. 0. 0. 0.]
 [0. 0. 1. 0. 0. 0.]]
원-핫 인코딩 데이터 차원
(8, 6)

위에서 진행한 one-hot-encoding을 pd.get_dummies로 바로 진행할 수 있음

import pandas as pd

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

item_TV item_냉장고 item_믹서 item_선풍기 item_전자렌지 item_컴퓨터
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

참고 [파이썬 머신러닝 완벽 가이드]