카테고리형 데이터를 수치형으로 변환하기 (LabelEncoder와 type Category)
Jan 14, 2020

카테고리형 데이터(Categorical Data)를 수치형 데이터(Numerical Data)로 변환해주는 작업은 머신러닝 모델을 돌려보기 위해서 필수로 해줘야하는 전처리 작업입니다.

이렇게 수치형으로 변환해주는 방법에는 한 가지 방법만 정해져 있는 것이 아니라 다양한 방법으로 변환해 줄 수 있고, 보통 개인의 취향(?)에 따라 주로 사용하는 방법으로 변환을 하곤 합니다.

이번 포스팅에서는 Categorical 데이터를 Numerical 로 변환하는 3가지 방법를 공유드리고자 합니다.

아래 내용을 보시고, 본인의 성향에 가장 잘 맞는 방법을 택해서 전처리를 해주면 되고, 각각의 방법마다 미세하게 장단점이 존재할 수 있습니다.

샘플데이터는 Kaggle의 대표적인 입문형 Contest인 Titanic: Machine Learning from Disaster 의 데이터셋으로 진행하며, 링크에서 바로 데이터셋을 다운로드 받을 수 있습니다.

Sample Data

import pandas as pd

train = pd.read_csv('train.csv')
train.head()

image-20200113114803524

#1 astype(‘category’).cat.codes

  1. numerical 데이터로 변경하고 싶은 categorical 컬럼을 정한 뒤,

  2. categorical 형 column으로 강제 형변환을 시키고
  3. cat.codes를 호출해 주면 자동으로 숫자형 리턴을 해주게 됩니다.
train['Sex'].astype('category').cat.codes
# 0      1
# 1      0
# 2      0
# 3      0
# 4      1
#       ..
# 886    1
# 887    0
# 888    0
# 889    1
# 890    1

보통 1줄로 끝나버리기 때문에, 개인적으로 많이 사용하는 방법 입니다.

단점은, 어떤 클래스가 숫자로 맵핑되어 있는지 확인하기 어렵습니다.

#2 LabelEncoder

sklearn.preprocessing 안에 있는 모듈인 LabelEncoder를 활용하면 #1 방법의 단점도 해결할 수 있습니다.

사용방법도 무척 간단합니다.

from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()
result = le.fit_transform(train['Sex'])
print(result)
# array([1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1,
#        0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0,
#        0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1,
#        0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1,
#        0, 1, 1, 1, 1.... 1, 1])

# 변환된 label classes 확인
le.classes_
# array(['female', 'male'], dtype=object)

변환한 뒤 inverse_trainsform으로 다시 역변환 할 수도 있습니다.

le.inverse_transform(result)
# array(['male', 'female', 'female', 'female', 'male', 'male', 'male',
#        'male', 'female', 'female', 'female', 'female', 'male', 'male',
#        'female', 'female', 'male', 'male', 'female', 'female', 'male',
#        'male', 'female', 'male', 'female', 'female', 'male

#3 get_dummies

마지막은, 사실 숫자형으로 변경한다기 보다는 원핫인코딩(one-hot-encoding)을 해준다고 봐야 맞습니다.

get_dummies는 원핫인코딩을 매우 쉽게 해주며, DataFrame에서 category형 데이터 컬럼을 선택하여 자동으로 원핫인코딩을 해줍니다. 만약 겉보기에는 수치형 데이터 컬럼이지만, 실제로는 categorical 컬럼이라면 이 역시 원핫인코딩을 해줍니다.

get_dummies

pd.get_dummies(train['Sex'])

image-20200113120305991

Numerical -> Categorical로 변환

train['Pclass'] = train['Pclass'].astype('category')
pd.get_dummies(train['Pclass'])

image-20200113120446901



관련 글 더보기

- 경사하강법 (Gradient Descent) 직접 구현하기

- 최소제곱법 (Ordinary Least Squares) 과 선형회귀 알고리즘 (Linear Regression)

- train_test_split 모듈을 활용하여 학습과 테스트 세트 분리

- PCA 를 활용한 차원축소

- GridSearch를 이용한 머신러닝 Hyperparameter 튜닝

데이터 분석, 머신러닝, 딥러닝의 대중화를 꿈 꿉니다.