Others/Data Science

Preprocessing (3) Encoding

Porits789 2022. 7. 18. 12:23

텍스트로 이루어진 값들은 대부분의 머신러닝 알고리즘을 사용하기 어렵습니다.

따라서 해당 값들을 숫자형태로 변환하는 과정을 거쳐야 합니다.  이것을 인코딩이라 부릅니다.

싸이킷런에서 제공하는 인코더들을 실습하려합니다.

 

실습에 앞서 인코딩을 위한 데이터프레임을 생성합니다.

 

1. Label Encoder & Ordinal Encoder

두 인코더가 하는 일은 같습니다. 데이터의 값들을 0부터 n-1의 숫자로 변환하여 표시합니다.

우선 Label Encoder입니다.

from sklearn.preprocessing import LabelEncoder
Le = LabelEncoder()
Le.fit(df.col2)

변환은 다음과 같이 사용합니다.

Le.transform(df.col2)

다음 코드로 역변환도 가능합니다.

Le.inverse_transform(Le.transform(df.col2))

이제는 Ordinal Encoder에 대해 살펴보겠습니다.

from sklearn.preprocessing import OrdinalEncoder
Od= OrdinalEncoder()
Od.fit(df)

마찬가지로 transfrom을 사용하여 변환합니다.

Od.transform(df)

 

각각의 목록은 categories_를 사용하여 볼 수 있습니다.

Od.categories_

 

간단하게 두 encoder를 살펴보았습니다. 하는 역할은 비슷합니다. 그러나 차이점이 분명히 존재합니다.

Label Encoder의 경우에는 1차원 데이터를 다루고있습니다.

그러나 Ordinal Encoder의 경우는 2차원데이터를 다룹니다. 그렇다면 서로 역할을 바꾸어보면 어떨까요?

- Label Encoder로 2차원데이터를 변환시키려 해봅니다.

Le.transform(df)

 - Ordinal Encoder로 1차원 데이터를 변환.

Od.transform(df.col2)

이런식으로 두 Encoder 모두 에러가 뜨게됩니다.

 

정리.
Label Encoder - 1D
Ordinal Encoder -2D

 

2. OneHotEncoder

각 카테고리를 이진화하여 인코딩하는 방법입니다.

간단하게 변환을 수행해보겠습니다.

from sklearn.preprocessing import OneHotEncoder
onehot = OneHotEncoder()
col1_onehot = onehot.fit_transform(df[['col2']])
col1_onehot

이런식으로 출력됨을 알 수 있습니다.

하지만 보고싶은것은 배열의 형태임으로 다음과 같이 사용합니다.

col1_onehot.toarray()

또는 이런식으로도 사용 가능합니다.

onehot2 = OneHotEncoder(sparse=False)
col1_onehot2 = onehot2.fit_transform(df[['col2']])
col1_onehot2

scikit learn의 OneHotEncoding 을 할 때 주의할 점은 백터를 사용할 수 없다는 것입니다.

따라서 reshape(-1,1)를 사용하거나 다음과 같이 사용합니다.

df[['col2']].shape

 

참고.

https://scikit-learn.org/stable/modules/classes.html#module-sklearn.preprocessing

 

API Reference

This is the class and function reference of scikit-learn. Please refer to the full user guide for further details, as the class and function raw specifications may not be enough to give full guidel...

scikit-learn.org