머신러닝 알고리즘은 숫자만 인식할 수 있기 때문에, 문자나 범주형 카테고리 (성별, 지역, 직업 등)는 숫자로 바꿔줘야만 학습이 가능함
< 인코딩 방법의 종류 >
크게 두 가지로 나누면 (Label Encoding, One-Hot Encoding)
(+ Ordinal Encoding 순서형 인코딩, Target Encoding 타겟 인코딩)
1. 레이블 인코딩 (Label Encoding)
각 범주(category)를 숫자로 변환하는 가장 간단한 방법
남자 (0)
여자 (1)
< 장점 >
- 매우 간단, 효율적
- 메모리 효율성 뛰어남
< 단점 >
모델이 숫자에 따른 순서나 크기가 있다고 잘못 해석할 수 있음
주로 두 개의 범주가 있는 경우 적합함
* 예시 (sklearn)
from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
data = ["남자", "여자", "여자", "남자"]
encoded = encoded.fit_transform(data)
#결과 : [0, 1, 1, 0]
2. 원-핫 인코딩 (One-Hot Encoding)
각 범주를 독립적인 이진 벡터(0과 1로 구성)로 변환
빨강 | 1 | 0 | 0 |
초록 | 0 | 0 | 1 |
파랑 | 0 | 1 | 0 |
< 장점 >
- 범주 간에 순서가 없음을 정확히 표현
- 숫자 간 관계를 없애서 정확한 표현 간으
< 단점 >
- 범주가 많아질 경우 데이터의 차원이 급격히 늘어나 메모리를 많이 소모
import pandas as pd
df = pd.DataFrame({'Color': ['Red', 'Green', 'Blue']})
pd.get_dummies(df['Color'], prefix='Color')
3. Ordinal Encoding
순서가 있는 범주에 수를 부여
예 : Low < Medium < High
주의 : 순서가 없는 데이터에 쓰면 오히려 왜곡됨.
from sklearn.preprocessing import OrdinalEncoder
df = pd.DataFrame({'Grade': ['Low', 'Medium', 'High', 'Medium']})
encoder = OrdinalEncoder(categories=[['Low', 'Medium', 'High']])
df['Grade_encoded'] = encoder.fit_transform(df[['Grade']])
4. Binary Encoding
범주를 정수로 변환한 뒤, 이진수로 바꿔 벡터로 만듦
라이브러리 : category_encoders 필요
장점 : One-Hot 보다 차원이 작고, 해시 형태에 유용함
import category_encoders as ce
df = pd.DataFrame({'City': ['Seoul', 'Busan', 'Incheon', 'Seoul', 'Daegu']})
encoder = ce.BinaryEncoder(cols=['City'])
df_encoded = encoder.fit_transform(df)
5. Target Encoding (평균 인코딩)
범주별로 타겟 평균값을 부여 -> 정답(y)을 사용
강력한 성능, 특히 트리계열 모델에서 자주 쓰임
주의 : 데이터 누수(leakage) 가능 -> 반드시 훈련셋에서만 인코딩 해야함.
df = pd.DataFrame({
'Team': ['A', 'B', 'A', 'B', 'C'],
'Score': [100, 200, 150, 180, 160]
})
encoder = ce.TargetEncoder(cols=['Team'])
df['Team_encoded'] = encoder.fit_transform(df['Team'], df['Score'])
Team 평균 점수 (예측값으로 변환)
A | (100+150)/2 = 125.0 |
B | (200+180)/2 = 190.0 |
C | 160.0 |
< 실무 인사이트 요약 >
인코딩 방식 | 언제 사용해야 하나? | 주의할 점 |
Label | 트리모델(XGBoost 등), 단순한 정수로 표현 가능할 때 | 선형 모델에서 순서 잘못 해석 위험 |
One-Hot | 대부분의 경우 (선형, 딥러닝) | 범주 수가 너무 많을 때 비효율 적 |
Ordinal | 등급처럼 순서가 중요한 컬럼 | 순서가 없는데 쓰면 큰일 |
Binary | 차원이 너무 많을 때 (10개 이상 범주) | 직관성이 떨어질 수 있음 |
Target | 트리모델, 성능이 중요할 때 | 데이터 누수 주의 (훈련셋만 사용해야함) |
+) CatBoost는 인코딩 없이도 범주형 처리 가능
+) Target Encoding은 반드시 fold별로 나눠야 누수 방지
'Data Analysis' 카테고리의 다른 글
의사결정나무모델 실습 - 타이타닉 생존 여부 예측 (0) | 2025.06.25 |
---|---|
DecisionTreeClassifier 의사결정나무 : 소득수준 예측 예제 (0) | 2025.06.21 |
선형회귀 실습 (당뇨병 진행률 BMI, 광고비 기반 매출 예측) (0) | 2025.06.17 |
회귀모델 평가 지표, 회귀 vs 분류 비교, 알고리즘 선택 가이드 (0) | 2025.06.17 |
Regression 회귀 알고리즘, 선형회귀, 릿지회귀, 라쏘회귀, 다항회귀, SVR, 랜덤포레스트 (1) | 2025.06.17 |