ML/사이킷런

데이터전처리-인코딩

야뤼송 2024. 1. 29. 10:48
반응형

 

1. 데이터 인코딩

 

머신러닝 알고리즘은 문자열 데이터 속성을 입력 받지 않으며 모든 데이터는 숫자형으로 표현되어야 한다. 문자형 카테고리형 속성은 모두 숫자값으로 변환/인코딩 되어야한다.

머신러닝에서 사용되는 인코딩식 방식은 대표적으로 레이블 인코딩, 원-핫 인코딩 2가지 있다.

 

 

2. 레이블 인코딩

 

문자열코드를 숫자형으로 변환하는 방법이다. 

아래에서처럼 TV는 0, 냉장고는 1 이런식으로 각각의 항목이 고유 번호를 부여 받도록 한다.

사이킷런에서는 레이블 인코딩을 적용하기 위한 LabelEncoder 클래스를 제공하고 fit(),  transform()을 이용하여 변환한다.

 

실습

사용 방법은 LabelEncoder를 객체로 생성한 후 , fit( ) 과 transform( ) 으로 label 인코딩 수행한다.

from sklearn.preprocessing import LabelEncoder

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

encoder = LabelEncoder()
encoder.fit(items)
labels = encoder.transform(items)
print('인코딩 변환값:',labels)
print('인코딩 클래스:',encoder.classes_)
print('디코딩 원본 값:',encoder.inverse_transform([4, 5, 2, 0, 1, 1, 3, 3]))

▶ Out

인코딩 변환값: [0 1 4 5 3 3 2 2]
인코딩 클래스: ['TV' '냉장고' '믹서' '선풍기' '전자렌지' '컴퓨터']
디코딩 원본 값: ['전자렌지' '컴퓨터' '믹서' 'TV' '냉장고' '냉장고' '선풍기' '선풍기']

 

 

3. 원-핫 인코딩

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

 

사이킷런에서는 원-핫 인코딩을 위해 OneHotEncoder 클래스를 제공하고 있고 원-핫 인코딩을 적용하기 위해서는 먼저 문자열을 숫자열로 변환이 되어야한다.

사이킷런의 OneHotEncoder 클래스를 이용하여 원-핫 인코딩을 적용하기 위해서는 다음과 같이 수행한다.

  • fit(),  transform()을 이용하여 변환한다(인자로 2차원 ndArray 입력필요)
  • Sparse(희소) 배열 형태로 변환되므로 toarray()를 적용하여 다시 Dense형태로 변화되어야함.

사이킷런의 OneHotEncoder 클래스를 이용한 원-핫 인코딩은 아래와 같다.

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)

▶ Out

원-핫 인코딩 데이터
[[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)

 

 

추가로 판다스를 이용할 경우에도 원-핫 인코딩을 적용할 수 있다.

  • 판다스의 getr_dummies(DataFrame)을 이용
import pandas as pd

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

▶ Out

 

 

 

반응형