Data Analysis

Encoding : 문자형이나 범주형 데이터를 숫자형 데이터로 변환하는 과정

김심슨 2025. 6. 17. 11:23

머신러닝 알고리즘은 숫자만 인식할 수 있기 때문에, 문자나 범주형 카테고리 (성별, 지역, 직업 등)는 숫자로 바꿔줘야만 학습이 가능함 

 

< 인코딩 방법의 종류 >

크게 두 가지로 나누면 (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별로 나눠야 누수 방지