
머신러닝 모델은 수학적 알고리즘을 기반으로 작동하기 때문에 'Red', 'Green', 'Blue'와 같은 텍스트 데이터를 직접 이해할 수 없습니다. 따라서 범주형(Categorical) 데이터를 수치형(Numerical) 데이터로 변환하는 '인코딩(Encoding)' 과정은 데이터 전처리 단계에서 모델의 성능을 결정짓는 핵심 요소입니다. 단순히 숫자로 바꾸는 것을 넘어, 데이터의 특성에 맞는 최적의 해결 방법을 선택하는 것이 중요합니다.
1. 인코딩 방식의 핵심 차이 및 선택 기준
범주형 데이터는 크게 순서가 있는 서열형(Ordinal)과 순서가 없는 명목형(Nominal)으로 나뉩니다. 잘못된 인코딩 방식은 모델에 왜곡된 우선순위를 학습시킬 수 있으므로 주의가 필요합니다.
인코딩 주요 기법 비교 요약
| 인코딩 기법 | 주요 특징 | 적합한 데이터 타입 | 장단점 |
|---|---|---|---|
| Label Encoding | 고유값에 숫자 부여 | 서열형 (Ordinal) | 간단하지만 랭킹 왜곡 가능 |
| One-Hot Encoding | 0과 1의 희소 행렬 생성 | 명목형 (Nominal) | 차원의 저주 발생 위험 |
| Target Encoding | 타겟 변수의 평균값 활용 | 고차원 명목형 | 과적합(Overfitting) 주의 |
| Frequency Encoding | 빈도수(Count)로 변환 | 명목형 | 빈도가 같으면 정보 손실 |
2. 실무 적용을 위한 파이썬 인코딩 Example 7선
단순한 방법부터 실무에서 대용량 데이터를 다룰 때 사용하는 고급 인코딩 기법까지, 즉시 복사하여 사용 가능한 예제 코드입니다.
Example 1: Scikit-learn Label Encoding (순서형 데이터)
from sklearn.preprocessing import LabelEncoder
import pandas as pd
df = pd.DataFrame({'Size': ['S', 'M', 'L', 'XL', 'M']})
encoder = LabelEncoder()
df['Size_Encoded'] = encoder.fit_transform(df['Size'])
print(df)
# 결과: S=2, M=1, L=0, XL=3 (알파벳 순서 기준 자동 할당)
Example 2: Pandas Get_Dummies (명목형 데이터의 표준)
import pandas as pd
df = pd.DataFrame({'Color': ['Red', 'Blue', 'Green']})
# drop_first=True는 다중공선성 문제를 피하기 위해 첫 번째 열 제거
one_hot = pd.get_dummies(df['Color'], drop_first=True, prefix='Color')
print(one_hot)
Example 3: Ordinal Encoding (사용자 정의 순서 지정)
# 비즈니스 로직상 순서가 명확할 때 유용
size_map = {'S': 1, 'M': 2, 'L': 3, 'XL': 4}
df['Size_Custom'] = df['Size'].map(size_map)
print(df[['Size', 'Size_Custom']])
Example 4: Target Encoding (고차원 범주형 데이터 해결)
# category_encoders 라이브러리 설치 필요: pip install category_encoders
import category_encoders as ce
df = pd.DataFrame({
'City': ['Seoul', 'Busan', 'Seoul', 'Incheon', 'Busan'],
'Target': [1, 0, 1, 1, 0]
})
encoder = ce.TargetEncoder(cols=['City'])
df['City_Target'] = encoder.fit_transform(df['City'], df['Target'])
print(df)
Example 5: Count/Frequency Encoding (빈도 기반)
df = pd.DataFrame({'Item': ['A', 'B', 'A', 'C', 'A', 'B']})
freq = df['Item'].value_counts() / len(df)
df['Item_Freq'] = df['Item'].map(freq)
print(df)
Example 6: Binary Encoding (메모리 효율적 변환)
# 범주 종류가 수만 개일 때 One-Hot 대신 사용
encoder = ce.BinaryEncoder(cols=['City'])
df_binary = encoder.fit_transform(df['City'])
print(df_binary)
Example 7: Hashing Encoding (대규모 온라인 학습용)
# 정해진 비트 수 내로 해싱하여 차원 고정
encoder = ce.HashingEncoder(cols=['City'], n_components=4)
df_hash = encoder.fit_transform(df['City'])
print(df_hash)
3. 인코딩 시 발생하는 문제와 전문가적 해결 방법
데이터 전처리는 단순히 코드를 실행하는 것이 아니라, 발생 가능한 잠재적 리스크를 제어하는 과정입니다.
- 해결 방법 1: 다중공선성(Multicollinearity) 제어 - One-Hot 인코딩 시 $n$개의 범주를 $n-1$개로 변환하여 변수 간의 높은 상관관계를 차단해야 합니다.
- 해결 방법 2: Unknown Category 처리 - 학습 데이터에는 없었지만 테스트 데이터에 나타난 새로운 범주는 별도의 'Unknown' 버킷으로 처리하거나 빈도가 낮은 데이터로 간주하는 로직이 필요합니다.
- 해결 방법 3: 데이터 누수(Data Leakage) 방지 - Target 인코딩 시 전체 평균을 사용하면 안 되며, 반드시 K-Fold Cross-Validation 과정 내에서 인코딩을 수행하여 타겟 정보가 유출되지 않도록 해야 합니다.
4. 결론 및 데이터 분석의 방향성
범주형 데이터를 수치로 바꾸는 데 정답은 없습니다. 트리 기반 모델(Random Forest, XGBoost 등)은 Label Encoding만으로도 충분히 좋은 성능을 내는 경우가 많지만, 선형 모델이나 신경망은 One-Hot 인코딩이나 Target 인코딩이 필수적입니다. 데이터의 도메인 특성과 사용할 알고리즘의 메커니즘을 깊이 있게 이해하는 것이 훌륭한 데이터 사이언티스트로 가는 지름길입니다.
내용 출처: 1. Scikit-learn Documentation - Preprocessing (scikit-learn.org)
2. Category Encoders Library Docs (contrib.scikit-learn.org/category_encoders/)
3. Feature Engineering for Machine Learning (Alice Zheng & Amanda Casari)
'Artificial Intelligence > 60. Python' 카테고리의 다른 글
| [PYTHON] Matplotlib vs Seaborn : 데이터 시각화의 정점, 2가지 라이브러리 선택 방법과 해결책 (0) | 2026.04.26 |
|---|---|
| [PYTHON] 상관계수 히트맵 해석하는 3가지 방법과 데이터 노이즈 해결 방안 (0) | 2026.04.26 |
| [PYTHON] 특성 공학(Feature Engineering)이 모델 성능을 바꾸는 3가지 방법과 해결책 (0) | 2026.04.26 |
| [PYTHON] 대규모 AI 프로젝트 유지보수를 위한 Type Hinting 활용 방법 7가지와 구조적 해결 차이 (0) | 2026.04.26 |
| [PYTHON] Numba JIT 컴파일러를 활용한 수치 연산 가속화 방법 7가지와 C++ 수준의 성능 해결 차이 (0) | 2026.04.26 |