본문 바로가기
Data Analysis/Statistics with Python

[Statistics with Python] 04. 데이터 전처리 : Encoding, One-Hot Encoding (with Scikit-learn)

by Dlearner 2019. 8. 17.
반응형

2절 Scikit - learn을 통한 예측 알고리즘 실습해보기

5장 Data Preprocessing

 

 

본 포스팅은 [위키북스- 파이썬 머신러닝 완벽 가이드]를 활용한 스터디 포스팅입니다.

[위키북스- 파이썬 머신러닝 완벽 가이드]

 

 

 

데이터 전처리가 필요한 이유

사이킷런의 ML 알고리즘을 쓰려면 다음과 같은 조건에 만족되는 데이터 셋이 필요하다.

  1. 결측치(Null)값이 허용되지 않는다

    • Null 값이 얼마 없으면 중앙값이나 평균값으로 대체한다

    • Null 값이 대다수라면 해당 피쳐값은 드롭하는 것도 좋다

    • 중요도가 높은 피처는 유지시킨다

  2. 문자열도 허용되지 않는다.

    • 문자열이 허용되지 않기때문에, 해당 피쳐값에 대한 인코딩(숫자로 변환)이 필요하다.

    • 인코딩은 카테고리형(코드 값)으로 대부분 변환시킨다.

    • 필요없는 피처는 드롭한다.

 

 

 

레이블 인코딩

문자열로 구성되어 있는 items 데이터를 카테코리화(코드화) 하는 것이다.

 

사이킷런에서 인코딩을 지원하는 라이브러리인  preprocessing의 LabelEncoder을 import 한다.

In [1]:
from sklearn.preprocessing import LabelEncoder
In [2]:
items=['TV', '냉장고', '전자레인지', '컴퓨터', '선풍기', '선풍기', '믹서', '믹서']

 

LabelEncoder 함수를 변수에 할당시켜서 데이터를 fit 시킨다.

In [3]:
encoder = LabelEncoder()
encoder.fit(items)
Out[3]:
LabelEncoder()

 

LabelEncoder함수에서 지원하는 transform 기능을 활용하여 items 데이터를 인코딩 시키고, 이를 labels에 저장한다.

 
In [4]:
labels = encoder.transform(items)
labels
Out[4]:
array([0, 1, 4, 5, 3, 3, 2, 2], dtype=int64)

 

encoder.classes_ 명령어를 사용하면 인코더가 랜덤으로 배치한 인코딩 순서를 알 수 있다.

In [5]:
encoder.classes_
# 인코더가 랜덤으로 배치한 인코딩 순서 (0부터 시작함)
Out[5]:
array(['TV', '냉장고', '믹서', '선풍기', '전자레인지', '컴퓨터'], dtype='<U5')

 

encoder.inverse_transform 함수를 사용하면 인코딩된 데이터를 역으로 되돌릴 수 있다.

In [6]:
encoder.inverse_transform([4, 5, 2, 0, 1, 1, 3, 3])
Out[6]:
array(['전자레인지', '컴퓨터', '믹서', 'TV', '냉장고', '냉장고', '선풍기', '선풍기'],
      dtype='<U5')

 

< 주의 >

하지만, 여기서의 숫자들은 숫자로서의 의미가 아닌 단순한 코드의 의미로 사용되는 것이다.
따라서 이 상태로 바로 ML에 적용하면 숫자로 변환된 변수가 가중치에 영향을 줄 수 있으니 별도의 조치를 취해주어야 한다.

 

 

 

 

 

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

One-Hot Encoding은 dummy 변수 개념을 활용하여 새롭게 코드화 하는 방법이다.

 

사이킷런에서 dummy변수를 활용한 인코딩을 지원하는 라이브러리인  preprocessing의 OneHotEncoder을 import 한다. OneHotEncoder를 사용하더라도, 위의 예시에서 했던 LabelEncoder 과정은 거쳐서 레이블에 인코딩 값을 할당시켜 주어야 한다.

 

In [7]:

from sklearn.preprocessing import OneHotEncoder
import numpy as np
In [8]:
items=['TV', '냉장고', '전자레인지', '컴퓨터', '선풍기', '선풍기', '믹서', '믹서']
In [9]:
# 일단 레이블 인코딩 과정을 거쳐서 문자열에 숫자 하나씩 매칭 시켜줘야 함
encoder = LabelEncoder()
encoder.fit(items)
labels = encoder.transform(items)

 

OneHotEncoder를 사용하기 위해 인덱스 값들을 2차원 배열로 변환시켜준다.

In [10]:
# 2차원 배열로 변환
labels = labels.reshape(-1,1)
labels
Out[10]:
array([[0],
       [1],
       [4],
       [5],
       [3],
       [3],
       [2],
       [2]], dtype=int64)

 

OneHotEncoder 함수를 변수에 할당시켜서 데이터를 fit 시킨다.

In [11]:
oh_encoder = OneHotEncoder()
In [12]:
oh_encoder.fit(labels)
oh_labels = oh_encoder.transform(labels)
oh_labels.toarray()

Out[12]:

array([[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.]])

 

 

위의 과정을 거치면 2차원 배열의 인코딩 값을 생성할 수 있다. 

인코딩한 배열의 shape을 살펴보면 데이터의 수 8개와 인코딩 값 6개가 생성되었음을 확인할 수 있다.

 
 
In [13]:
oh_labels.shape
Out[13]:
(8, 6)

 

 

 

 

pandas의 get_dummies 기능을 활용한 인코딩

One-Hot Encoding으로도 인코딩이 가능하지만, pandas에서 get_dummies() 기능을 활용하면 쉽게 변환해준다.

 

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

pandas의 DataFrame 덕분에, 따로 2차원 배열을 구성하지 않아도 편하게 인코딩을 실행할 수 있다.

 
 
In [16]:
pd.get_dummies(df)
Out[16]:
  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
반응형

댓글