pythonML

[pythonML] 레이블 인코딩(label encoding) / 원-핫 인코딩(one hot encoding)- 데이터 전처리

독립성이 강한 ISFP 2022. 3. 4. 03:18
728x90
반응형

# 데이터 전처리

기본 데이터 전처리 사항

  • 결손값 / 문자열 값 처리
  • 이상치 제거
  • 피처 선택

데이터 인코딩

  • 레이블 인코딩
  • 원-핫 인코딩

피처 스케일링

  • StandardScaler
  • MinMaxScaler

 

# 결측값

-Null값이 얼마 되지 않는다면=> 피처의 평균값, 중앙값, 최빈값 같은 값 넣기

-Null값이 대부분 => 해당 피처 drop

 만약 중요도가 높은 피처이고, Null을 피처의 평균값으로 대체할 경우 예측 왜곡이 심할 수 있다면 더 정밀한 대체 값을 선정해야 함

 

사이킷런의 머신러닝 알고리즘은 문자열 값을 입력 값으로 허용X => 모든 문자열(카테코리형, 텍스트형) 값을 인코딩해서 숫자형으로 변환필수

 

# 데이터 인코딩 : 레이블 인코딩(label encoding) / 원-핫 인코딩(one hot encoding)

 

1. 레이블 인코딩(label encoding) : 문자열 값=> 숫자형 카테고리 값으로 변환

from sklearn.preprocessing import LabelEncoder

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

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

print('인코딩 반환값:',labels)
인코딩 반환값: [0 1 4 5 3 2 2]

 

print('인코딩 클래스:',encoder.classes_)
인코딩 클래스: ['TV' '냉장고' '믹서' '선풍기' '전자레인지' '컴퓨터']

TV=>0

냉장고=>1

믹서=>2

선풍기=>3

전자레인지=>4

컴퓨터=>5

 

문제점 : 예측 성능이 떨어지는 경우가 발생할 수 있음. 숫자 값의 경우 크고 작음에 대한 특성이 작용하기 때문

ex) 냉장고-1, 믹서-2 일 경우 1 보다 2가 더 큰 값이므로 특정 ML알고리즘에서 가중치가 더 부여되거나 더 중요하게 인식할 가능성 발생함

즉 레이블 인코딩은 선형회귀와 같은 ML알고리즘에는 적용 X , 트리 계열의 ML알고리즘은 숫자의 이러한 특성을 반영하지 않으므로 상관이 없다.

 

2. 원-핫 인코딩(one hot encoding) : 행 형태의 피처값을 열 형태로 차원을 변경한 후, 교유 값에 해당하는 칼럼에만 1표시, 나머지 칼럼에는 0을 표시함

 

-원-핫 인코딩은 사이킷런에서 OnehotEncoder 클래스로 쉽게 변환 가능

 

# 주의할 점

1. OnehotEncoder로 변환하기 전에 모든 문자열 값을 숫자형 값으로 변환하기

2. 입력 값으로 2차원 데이터 필요

 

from sklearn.preprocessing import OneHotEncoder

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

#먼저 숫자값으로 변환하기 위해 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)
원-핫 인코딩 데이터
[[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)

 

# 원-핫 인코딩을 지원하는 API => get_dummies()

 

get_dummies() 를 이용하면 숫자형 값으로 변환 없이도 바로 변환이 가능

import pandas as pd

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

728x90
반응형