본문 바로가기

공부방/파이썬_머신러닝

[파이썬/머신러닝] 사이킷런 기초다지기 - 3

[파이썬/머신러닝] 사이킷런 기초다지기 - 3

 

데이터 전처리

머신러닝 알고리즘은 데이터에 기반하고 있기 때문에 어떤데이터의 입력을 가지느냐가 아주 중요합니다.

사이킷런의 머신러닝 알고리즘을 적용하기 전에 데이터에 대해 미리 처리해야 할 기본사항이 있습니다.

 

- 결손값(Null, NaN)은 허용되지 않음

- 문자열 값을 입력값으로 허용하지 않음

 

따라서 결손값들은 각 경우에 맞게 평균값으로 변환되거나 Drop 하는 형태로 변경해 주어야 합니다.

그리고 문자열 값을 입력하는 것을 허용하지 않기 때문에 숫자형으로 변환해야 합니다.

여기서는 레이블 인코딩, 원-핫 인코딩 순서로 예를 들어 보겠습니다.

 

 

레이블 인코딩(Label Encoding)

from sklearn.preprocessing import LabelEncoder

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

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

fit()과 transform()을 사용합니다.

변환하게 되면 문자열 데이터가 숫자로 변경된 것을 확인할 수 있습니다.

 

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

인코딩 클래스는 다음과 같은 명령으로 확인할 수 있습니다.

 

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

변환된 값의 원본값을 알기 위해서는 다음과 같은 명령으로 확인 가능합니다.

 

 

이러한 레이블 인코딩 방식은 숫자형으로 변환되기는 하지만 숫자 간의 크고 작음의 특성이 특정 알고리즘에서는 반영되어 결과 값에 영향을 미칠수 있습니다. 이런 특성 때문에 선형 회귀와 같은 머신 러닝 알고리즘에서는 사용하는 것을 지양한다고 합니다. ( 트리 계열 머신러닝 알고리즘은 사용 가능)

 

이러한 문제점 해결을 위해 원-핫 인코딩을 사용합니다.

 

 

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

 

원-핫 인코딩은 피처 값의 유형에 따라 새로운 피처를 추가해 고유 값에 해당하는 컬럼만 1을 표시하고 나머지 컬럼에는 0을 표시하는 방식(새로운 차원의 벡터를 만들고, 그 값에 해당되는 차원의 위치만 1, 나머지는 0으로 표기) 입니다.

행 형태의 피처를 열 형태로 차원 변환 후에 고유값에만 1을 표시하고 나머지 컬럼엔 0을 표시하는 형태 입니다.

 

 

예제를 통해 확인 합니다.

from sklearn.preprocessing import LabelEncoder, OneHotEncoder
import numpy as np

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

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)

우선 레이블 인코더로 시작값을 변환을 해야 합니다. 그리고 반환된 데이터를 2차원 데이터로 변환합니다.

reshape를 이용해 차원 변경을 해주고 해당 위치에 있는 벡터값만 1로 해주고 나머지 값은 0이 되는 row를 갖습니다.

해당 데이터는 8x6 형태를 가지는 것을 확인 합니다.

 

원본데이터 > 숫자로 인코딩 > 원-핫 인코딩 순서로 진행해야 하는 모습을 볼 수 있는데 이런 복잡한 과정을 거치지 않고 한번에 동일한 결과를 가질 수 있는 API를 제공하고 있습니다.

 

get_dummies()

예제를 통해 얼마나 쉽게 바뀌는지 확인하겠습니다.

import pandas as pd

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

df

아이템 별로 pandas를 이용해 DataFrame을 만들어줬습니다.

 

pd.get_dummies(df)

간단하게 API를 사용해 두줄이면 끝났네요.

API가 알아서 중복값 없는 고유값으로 컬럼을 지정해주고 데이터에 해당하는 부분만 1로 표시, 나머지는 0으로 표시되는게 원-핫 레코딩과 유사한 결과를 나타냅니다.