Gaegul's devlog

파이썬 머신러닝 완벽 가이드 - chap1-2. 데이터 전처리 (feat. 데이터 인코딩) 본문

Artificial Intelligence/Data Science

파이썬 머신러닝 완벽 가이드 - chap1-2. 데이터 전처리 (feat. 데이터 인코딩)

부지런깨꾹이 2020. 8. 29. 15:55
728x90
반응형

데이터 전처리(Data Processing or Cleansing)은 머신러닝 알고리즘 만큼 매우 중요합니다. 데이터 전처리 방법에는 다양한 방법들이 있는데요. 그 중에 문자열 데이터를 수치화 시켜주는 인코딩 방법과 서로 다른 변수의 값 범위를 일정한 수준으로 맞추는 피쳐 스케일링 (정규화, 표준화) 에 관해 실습해 보겠습니다.

 

# 1. 데이터 인코딩

머신러닝을 위한 대표적인 인코딩 방식은 크게 레이블 인코딩(Label Encoding)과 원-핫 인코딩(One Hot Encoding) 방법이 있습니다.

1-1. 레이블 인코딩

사이킬런의 레이블 인코딩을 인포트 해옵니다. LabelEncoder를 객체로 생성한 후 fit()transform()을 호출해 레이블 인코딩을 수행합니다. 각 문자열이 숫자로 변환된 것을 확인할 수 있습니다. 클래스 종류가 많을 경우에는 LabelEncoder 객체의 classes_ 속성값으로 확인 할 수 있습니다.

from sklearn.preprocessing import LabelEncoder

items = ['TV', '냉장고', '전자레인지', '컴퓨터', '선풍기', '선풍기', '선풍기', '에어프라이기', '에어프라이기']

#라벨인코더를 객체로 생성한 후 fit()과 transform()을 통해 인코딩한 값으로 변환.
lbe = LabelEncoder()
lbe.fit(items)
item_lbe = lbe.transform(items)
print(item_lbe) 

#[0 1 4 5 2 2 2 3 3] 
#TV : 0, 냉장고 : 1, 전자레인지 : 4, ...
print('인코딩 클래스 :', encoder.classes_)

이렇게 레이블 인코딩은 간단하게 문자열 값을 숫자형 카테고리 값으로 변환합니다.

 

하지만, 레이블 인코딩같은 경우는 숫자로 변환이 되기 때문에 학습시 가중치를 주어 결과에 영향을 미칠 수 있습니다. 1 보다 2가 더 큰 값이기 때문에 가중치가 더 부여될 가능성이 존재한다는 말로 다시 정리 할 수 있겠네요. 그렇기 때문에 가중치의 영향을 따르는 Linear Regression 과 같은 모델에는 적용하지 않아야 합니다. 하지만 트리 계형 (Decision Tree, Random Forest..) 과 같은 모델은 숫자의 특성을 반영하지 않기 때문에 적합하다고 볼 수 있습니다. 

from sklearn.preprocessing import OneHotEncoder
import numpy as np

items = ['TV', '냉장고', '전자레인지', '컴퓨터', '선풍기', '선풍기', '선풍기', '에어프라이기', '에어프라이기']

#원핫 인코더를 객체로 생성한 후 fit()과 transform()을 통해 인코딩한 값으로 변환.
ohe = OneHotEncoder()
ohe.fit(item_lbe)
item_ohe = ohe.transform(item_lbe)

print(item_ohe.toarray())

1-2. 원 핫 인코딩

원 핫 인코딩은 피쳐 값의 유형에 따라 새로운 피쳐를 추가해 고유 값에 해당하는 컬럼에만 1 표시, 나머지 0 을 표시하는 방법입니다.

하지만 라벨 인코딩과 다르게 주의해야할 점이 있습니다. 

<주의할 점>

  1. One Hot Encoder 로 변환하기 전에 모든 문자열 값이 숫자형으로 변환돼야 한다.

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

방법 1. OneHotEncoder 객체 사용.

from sklearn.preprocessing import OneHotEncoder
import numpy as np

items = ['TV', '냉장고', '전자레인지', '컴퓨터', '선풍기', '선풍기', '선풍기', '에어프라이기', '에어프라이기']

#원핫 인코더를 객체로 생성한 후 fit()과 transform()을 통해 인코딩한 값으로 변환.
ohe = OneHotEncoder()
ohe.fit(item_lbe)
item_ohe = ohe.transform(item_lbe)

print(item_ohe.toarray())

# 출력 :
[[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. 1. 0. 0. 0.]
 [0. 0. 1. 0. 0. 0.]
 [0. 0. 1. 0. 0. 0.]
 [0. 0. 0. 1. 0. 0.]
 [0. 0. 0. 1. 0. 0.]]

원핫인코딩을 위해 수치형으로 바꾼 라벨 인코더를 2차원 배열로 변경해주어 하는 작업을 먼저 해주어야 합니다. 이때 reshape으로 차원을 변경해 줍니다. 

item_lbe = item_lbe.reshape(-1,1)
print(item_lbe)

# 출력 : 
[[0]
 [1]
 [4]
 [5]
 [2]
 [2]
 [2]
 [3]
 [3]]

 

방법 2. get_dummies() API 사용.

 

get_dummies()를 사용하면 숫자형 변환 없이 바로 원핫인코딩 값으로 변환이 가능합니다. 대신, 데이터 프레임이어야 적용 가능합니다.

pandas 라이브러리 안에 내장되어 있기 때문에 반드시 pandas를 인포트 해준 후 사용합니다.

import pandas as pd

items = pd.DataFrame({'item':['TV', '냉장고', '전자레인지', '컴퓨터', '선풍기', '선풍기', '선풍기', 
						'에어프라이기', '에어프라이기']})
pd.get_dummies(items)

 

다음은 정규화, 표준화의 차이점에 관한 포스팅으로 돌아올께요~

728x90
반응형
Comments