✅ 범주형 인코딩 (Categorical Encoding)
범주형 인코딩 |
• 텍스트로 이루어진 범주형 데이터를 수치형 데이터로 변환하는 것. • 인코딩하는 이유: 데이터 양이 방대한 경우, 텍스트로 이루어진 범주형은 수치로 변환해줘야 데이터 처리속도가 향상됨 (다시 말해 컴퓨터가 가장 이해하기 쉬운 언어인 숫자로 바꿔주는 게 좋다)
|
레이블/라벨 인코딩 (Label Encoding) |
• 범주형 데이터에 숫자 레이블/라벨을 할당함 = 범주마다 번호를 매김 (ex) 월요일은 1, 화요일은 2, 수요일은 3, ... |
원핫 인코딩 (OneHot Encoding) |
• 범주별로 칼럼을 만들어서, 칼럼안에 1 아니면 0 만 넣는다 • 한 칼럼에만 1(True) 이 들어가고, 나머지 칼럼들은 0(False) 가 들어가는 방식
|
0️⃣ 패키지 & 데이터프레임 불러오기
- 예시가 될 데이터셋은 Kaggle에서 가져온 Flight Price Prediction 입니다.
- 레이블 인코딩은 비행사(airline) 칼럼으로 해보고, 원핫 인코딩은 좌석클래스(class) 칼럼으로 테스트 해보겠습니다.
# 패키지 불러오기
import pandas as pd
import numpy as np
# 데이터셋 불러오기
df = pd.read_csv('./Clean_Dataset.csv', encoding='cp949')
df = df.drop([df.columns[0]], axis=1)
1️⃣-1. 레이블 인코딩 :: pd.factorize()
- 판다스의 factorize() 메소드로 범주형 데이터에 숫자 라벨을 붙여서 인코딩할 수 있습니다.
이 메소드는 결과를 튜플 형태로 반환하기 때문에, 아래 코드와 같이 형태를 바꿔서 새로운 칼럼으로 추가해줘야 합니다.
# 인코딩 결과를 새로운 칼럼으로 추가
df['airline_label'] = pd.factorize(df['airline'])[0].reshape(-1,1)
- 범주마다 숫자라벨이 잘 붙어있지만, 알파벳 순서대로 붙여주지는 않습니다.
그냥 데이터프레임에서 먼저 출현한 순서대로 0부터 번호를 붙여주는 방식이에요.
1️⃣-2. 알파벳 순서대로 레이블 인코딩 :: LabelEncoder()
- 사이킷런(scikitlearn)의 LabelEncoder 모듈을 이용하면, 알파벳 순서대로 알아서 라벨링을 해줍니다.
# 사이킷런 패키지의 인코더 모듈 불러오기
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
# LabelEncoder는 원래 데이터프레임에 인코딩 결과를 붙여서 반환함
df['airline_sk_label'] = le.fit_transform(df['airline'])
2️⃣ 원핫 인코딩 :: pd.get_dummies()
- 판다스의 get_dummies() 메소드를 사용하면 빠르게 원핫인코딩을 할 수 있습니다.
좌석클래스(class) 칼럼으로 진행해봤는데요, 원래 class 칼럼은 없어지고 class_Business, class_Economy가 생겼죠.
- 다만 기본 결과값은 True/False로 채워서 나오기 때문에, 1/0으로 채우고 싶다면 dtype=int 를 넣어줘야 합니다.