들어가며

지난 글 4. 데이터 정제에서는 누락된 값을 처리하는 방법에 대해서 다루어 보았습니다. 이번에는 숫자형 데이터가 아닌 텍스트 형식의 데이터 및 범주형 특성을 정제하는 방법에 대해서 설명하도록 하겠습니다.

 

텍스트와 범주형 특성 다루기

대부분의 머신러닝 알고리즘은 숫자형을 다루므로 우선 카테고리를 숫자에 매핑하여 표현하도록 합시다.pandas의 factorize() 메서드는 문자열 범주형 특성을 머신러닝 알고리즘이 다루기 쉬운 숫자 범주형 특성으로 변환시켜 줍니다

 

https://colab.research.google.com/drive/1wWaPMCEb3ewf3CNKIeu262vQaCG36apw#scrollTo=y3BZex4cO67p&line=1&uniqifier=1

 

Google Colaboratory

 

colab.research.google.com

각 카테고리는 0부터 4까지 하나씩 숫자로 매핑하였습니다. 그러나 이렇게 진행할 경우 머신러닝 알고리즘이 0과 1 사이가 0과 4 사이보다 가까워 비슷한 특성이라고 인지합니다. 이는 사실과 무관한 유사도를 가지므로 이를 해결하기 위해서는 데이터를 이진으로 나누는 one-hot encoding을 사용해야 합니다.

원-핫 인코딩(one-hot encoding)

one-hot encoding은 데이터 종류만큼 리스트를 만들고 실제 숫자에 해당하는 인덱스 부분만 1로 설정하고 나머지는 전부 0으로 설정하여 데이터를 구분하도록 하는 것을 의미합니다. (ex. 1 -> [0,1,0,0,0])

사이킷런에서 sklearn.preprocessing.OneHotEncoder 모듈을 사용한다면 간단하게 구현할 수 있습니다.

one-hot encoding은 대부분 0으로 이루어져 있기 때문에 효율성을 위해 희소 행렬 (Sparse Matrix)로 출력됩니다.

희소 행렬을 이해하기 쉽게 일반 행렬로 표현하면 다음과 같습니다.

위처럼 텍스트 형식 및 범주형 특성의 데이터를 처리하기 위해서는 두 가지 과정을 거쳐야 합니다.

1. 범주형 데이터들을 숫자로 매핑하기

2. 매핑한 숫자들을 원-핫 인코딩으로 변환하기

CategoricalEncoder 모듈 사용하기

사이킷런에서는 CategoricalEncoder를 이용해서 이를 간단하게 처리할 수 있습니다. 단 sikit-learn 0.20.0 버전부터 이를 지원하므로 유의하시기 바랍니다.

 

+ Recent posts