Categorical Feature Encoing Methods

sy_healing·2022년 4월 29일
0

머신러닝

목록 보기
7/16

Feature Engineering 에 대해 정리해둔 내용을 바탕으로 범주형 데이터(Categorical data)를 어떻게 encoding 하는지 알아보고자 한다.

범주형 특성에 대한 Encoding 방법은 여러 가지가 있고, 해당 내용은 Category Encoders 공식홈페이지에서 상세히 볼 수 있다. (해당 사이트에서 많은 내용을 참고했다!)


대부분의 모델은 범주형 변수를 이해하지 못한다. 거의 String type으로 되어있기 때문에이다.
따라서 숫자로 인코딩을 해줘야하고, 정보의 손실을 최소화 하기 위해서는 데이터에 따라 적합한 인코딩 방법을 사용해야한다.

일반적으로 범주형 데이터라고 하면 명목형(Nominal)과 순서형(Ordinal)으로 나뉜다.
Nominal순서가 없는 데이터로 과일(사과, 딸기, ..)이나 성별(남/여) 같은 것이고,
Ordinal순서가 있는 데이터로 등급(1등급, 2등급, ..), 평점 같은 것이다.


💡 원핫 인코딩(OneHotEncoding)

원핫 인코딩은 Nominal feature를 인코딩 하는 방법으로, 하나의 feature를 0과 1로 이루어진 여러 개 feature로 나누는 방법이다.
(단, 트리 모델에서는 변수가 제외되는 문제가 발생하므로 원핫 인코딩을 선호하지 않는다.)

📖Python

import pandas as pd
import numpy as np

data = {
    '이름' : ['강호동', '유재석', '조세호', '박명수', '하동훈', '정준하', '이승기', '이수근'],
    '학교' : ['서울고', '부산고', '대구고', '서울고', '대구고', '대구고', '부산고', '서울고'],
    '키' : [197, 184, 168, 187, 188, 202, 188, 190]}

# 데이터프레임 만들기
df = pd.DataFrame(data)
df


위 데이터셋에서 학교 column에 서울고, 부산고, 대구고가 있는데, 이것을 각각 다른 feature로 수치화 해보고자 한다.

📖Python

#필요 시 category_encoders를 설치한다.
#!pip install --upgrade category_encoders

from category_encoders import OneHotEncoder

enc = OneHotEncoder(cols='학교', use_cat_names=True)
df = enc.fit_transform(df)

#use_cat_names=True : 기존 col의 이름인 '학교'를 각 범주 앞에 표시함


'''
참고로 train data와 test data에 대해서 encoding 할때,
train data는 규칙을 만들고 변형까지 해주지만, test는 변형만 진행한다.

enc = OneHotEncoder(use_cat_names=True)

df_train = enc.fit_transform(df_train)   #데이터셋의 모든 범주형 feature에 대해 인코딩
df_test = enc.transform(df_test)
'''
# pandas의 get_dummies를 통해서도 OneHotEncoding을 진행할 수 있다.
# prefix는 use_cat_names와 같은 역할을 한다.
df = pd.get_dummies(df, prefix='')

원핫 인코딩을 통해 학교 column의 값들을 수치화해서 분리하고 데이터프레임으로 변경했다.
단, 주의해야 할 점은 특정 feature에 범주가 너무 많은 경우, 중요하지 않은 feature가 많아질 수 있어서 오히려 모델의 성능을 저하시킬 수 있다는 것이다.


💡 바이너리 인코딩(Binary Encoding)

바이너리 인코딩은 범주형 featrue의 값들을 이진법으로 변환해주는 인코딩 방법이다.
원핫 인코딩과 비슷하게 feature 갯수가 추가적으로 만들어 지지만, 원핫 인코딩에 비해서 적은 갯수의 feature가 추가된다. 그래서 모델 학습 시에 원핫 인코딩보다 속도가 빠르다.

📖Python

from category_encoders import BinaryEncoder

enc = BinaryEncoder(cols='학교')
df = enc.fit_transform(df)


💡 오디널 인코딩(Ordinal Encoding)

오디널 인코딩은 Ordinal feature를 인코딩 하는 방법이다. 레이블 인코딩과 다르게 순서 정보를 고려해서 인코딩 한다. 데이터의 범주형 변수 중 순서뿐만 아니라 알파벳 순서까지 고려할 수 있다.

📖Python

from category_encoders import OrdinalEncoder

enc = OrdinalEncoder(cols = '학교')
df = enc.fit_transform(df)

0개의 댓글