개요
인코딩(Encoding)은 정보를 특정 형식이나 체계에 맞춰 변환하는 과정을 의미하며, 특히 데이터 과학(Data Science) 분야에서는 범주형 데이터를 머신러닝 모델이 이해할 수 있는 수치형 형태로 변환하는 기법을 주로 지칭합니다. 컴퓨터는 텍스트나 범주(category) 형태의 데이터를 직접 처리할 수 없으므로, 이러한 데이터를 수치로 매핑하는 과정이 필수적입니다. 이 문서에서는 데이터 과학에서 사용되는 주요 인코딩 기법들을 정리하고, 각각의 특징과 활용 사례를 설명합니다.
인코딩의 필요성
머신러닝 알고리즘은 대부분 수치 기반 연산을 수행하므로, 입력 데이터가 수치형이어야 합니다. 그러나 실제 데이터셋에서는 "성별", "지역", "제품 카테고리"와 같은 범주형 변수(categorical variable)가 자주 등장합니다. 예를 들어, 다음과 같은 데이터가 있다고 가정해 봅시다:
이름 |
지역 |
직업 |
홍길동 |
서울 |
개발자 |
김철수 |
부산 |
디자이너 |
이영희 |
서울 |
분석가 |
여기서 "지역"과 "직업"은 텍스트 형태의 범주형 데이터입니다. 이를 모델에 입력하기 위해서는 서울 → 0, 부산 → 1과 같이 수치로 변환해야 합니다. 이 과정이 바로 인코딩입니다.
주요 인코딩 기법
1. 레이블 인코딩 (Label Encoding)
레이블 인코딩은 각 범주에 고유한 정수 값을 부여하는 방법입니다. 예를 들어:
from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
encoded_labels = encoder.fit_transform(['서울', '부산', '서울', '대구'])
print(encoded_labels) # [0, 1, 0, 2]
장점
- 간단하고 메모리 사용이 적음.
- 순서가 있는 범주(순서형 변수, ordinal variable)에 적합.
단점
- 정수 값의 크기 차이를 모델이 순서로 오해할 수 있음 (예: 부산 > 서울로 인식).
- 명목형 변수(nominal variable)에는 부적합.
활용 예
- 학년(1학년, 2학년, 3학년), 등급(A등급, B등급, C등급) 등 순서가 있는 데이터.
원-핫 인코딩은 각 범주를 이진 벡터(binary vector)로 표현하는 방법입니다. 범주가 N개라면 N개의 열을 생성하고, 해당 범주에 해당하는 위치에만 1을, 나머지에는 0을 넣습니다.
예를 들어, "지역"이 [서울, 부산, 대구]일 경우:
지역_서울 |
지역_부산 |
지역_대구 |
1 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
import pandas as pd
df = pd.DataFrame({'지역': ['서울', '부산', '서울', '대구']})
one_hot = pd.get_dummies(df, columns=['지역'])
장점
- 범주 간의 순서를델이 오해할 가능성이 없음.
- 명목형 변수에 매우 적합.
단점
- 범주 수가 많을 경우 차원이 급격히 증가 (차원의 저주).
- 희소 행렬(sparse matrix) 생성 → 메모리 및 성능 이슈.
활용 예
- 성별, 국가, 색상 등 순서가 없는 범주형 변수.
3. 범주형 인코딩 (Target Encoding / Mean Encoding)
타겟 인코딩은 범주형 변수의 각 값을 해당 범주에 속하는 타겟 변수의 평균값으로 대체하는 방법입니다. 주로 분류 문제에서 사용됩니다.
예: "지역"별로 구매 전환율(타겟)을 계산하여 인코딩.
지역 |
구매 전환율(평균) |
서울 |
0.75 |
부산 |
0.40 |
대구 |
0.60 |
장점
- 범주와 타겟 간의 관계를 반영하여 강력한 피처 생성 가능.
- 고차원 문제를 피할 수 있음.
단점
- 데이터 누수(data leakage) 위험 존재 (학습 데이터의 타겟을 사용하므로).
- 과적합(overfitting) 발생 가능 → 평활화(smoothing) 기법 필요.
주의사항
- 교차 검증 시, 각 폴드 내에서만 타겟 평균을 계산해야 함.
4. 임베딩 (Embedding)
딥러닝 기반 인코딩으로, 범주형 변수를 고정된 길이의 밀집 벡터(dense vector)로 변환합니다. 신경망의 한 층으로 구현되며, 학습 과정에서 범주 간의 의미적 유사성을 학습합니다.
예: 단어 임베딩(Word2Vec)처럼 "서울"과 "경기"가 유사한 벡터를 가짐.
장점
- 범주 간 유사성 포착 가능.
- 고차원 문제 해결.
단점
활용 예
인코딩 선택 기준
기법 |
적합한 데이터 유형 |
차원 증가 |
비선형 관계 포착 |
주의사항 |
레이블 인코딩 |
순서형 변수 |
낮음 |
제한적 |
명목형 변수에 사용 금지 |
원-핫 인코딩 |
명목형 변수 (범주 수 적을 때) |
높음 |
없음 |
고차원 → 정규화 필요 |
타겟 인코딩 |
명목형 변수 (고유값 많을 때) |
낮음 |
있음 |
데이터 누수 방지 필수 |
임베딩 |
고차원 명목형 변수 |
조절 가능 |
높음 |
딥러닝 환경 필요 |
결론
인코딩은 데이터 과학에서 전처리의 핵심 단계 중 하나입니다. 범주형 데이터를 적절히 수치화하지 않으면 모델의 성능이 크게 저하될 수 있습니다. 데이터의 성격(명목형, 순서형), 범주 수, 모델 종류에 따라 적절한 인코딩 기법을 선택하는 것이 중요합니다. 특히, 원-핫 인코딩은 단순하지만 차원 폭발 문제, 타겟 인코딩은 강력하지만 과적합 위험이 있으므로 신중한 사용이 필요합니다.
참고 자료
# 인코딩
## 개요
**인코딩**(Encoding)은 정보를 특정 형식이나 체계에 맞춰 변환하는 과정을 의미하며, 특히 **데이터 과학**(Data Science) 분야에서는 범주형 데이터를 머신러닝 모델이 이해할 수 있는 수치형 형태로 변환하는 기법을 주로 지칭합니다. 컴퓨터는 텍스트나 범주(category) 형태의 데이터를 직접 처리할 수 없으므로, 이러한 데이터를 수치로 매핑하는 과정이 필수적입니다. 이 문서에서는 데이터 과학에서 사용되는 주요 인코딩 기법들을 정리하고, 각각의 특징과 활용 사례를 설명합니다.
## 인코딩의 필요성
머신러닝 알고리즘은 대부분 수치 기반 연산을 수행하므로, 입력 데이터가 수치형이어야 합니다. 그러나 실제 데이터셋에서는 "성별", "지역", "제품 카테고리"와 같은 **범주형 변수**(categorical variable)가 자주 등장합니다. 예를 들어, 다음과 같은 데이터가 있다고 가정해 봅시다:
| 이름 | 지역 | 직업 |
|--------|----------|------------|
| 홍길동 | 서울 | 개발자 |
| 김철수 | 부산 | 디자이너 |
| 이영희 | 서울 | 분석가 |
여기서 "지역"과 "직업"은 텍스트 형태의 범주형 데이터입니다. 이를 모델에 입력하기 위해서는 **서울 → 0**, **부산 → 1**과 같이 수치로 변환해야 합니다. 이 과정이 바로 인코딩입니다.
## 주요 인코딩 기법
### 1. 레이블 인코딩 (Label Encoding)
레이블 인코딩은 각 범주에 고유한 정수 값을 부여하는 방법입니다. 예를 들어:
- 서울 → 0
- 부산 → 1
- 대구 → 2
```python
from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
encoded_labels = encoder.fit_transform(['서울', '부산', '서울', '대구'])
print(encoded_labels) # [0, 1, 0, 2]
```
#### 장점
- 간단하고 메모리 사용이 적음.
- 순서가 있는 범주(순서형 변수, ordinal variable)에 적합.
#### 단점
- 정수 값의 크기 차이를 모델이 순서로 오해할 수 있음 (예: 부산 > 서울로 인식).
- 명목형 변수(nominal variable)에는 부적합.
#### 활용 예
- 학년(1학년, 2학년, 3학년), 등급(A등급, B등급, C등급) 등 순서가 있는 데이터.
---
### 2. 원-핫 인코딩 (One-Hot Encoding)
원-핫 인코딩은 각 범주를 **이진 벡터**(binary vector)로 표현하는 방법입니다. 범주가 N개라면 N개의 열을 생성하고, 해당 범주에 해당하는 위치에만 1을, 나머지에는 0을 넣습니다.
예를 들어, "지역"이 [서울, 부산, 대구]일 경우:
| 지역_서울 | 지역_부산 | 지역_대구 |
|----------|----------|----------|
| 1 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
```python
import pandas as pd
df = pd.DataFrame({'지역': ['서울', '부산', '서울', '대구']})
one_hot = pd.get_dummies(df, columns=['지역'])
```
#### 장점
- 범주 간의 순서를델이 오해할 가능성이 없음.
- 명목형 변수에 매우 적합.
#### 단점
- 범주 수가 많을 경우 차원이 급격히 증가 (차원의 저주).
- 희소 행렬(sparse matrix) 생성 → 메모리 및 성능 이슈.
#### 활용 예
- 성별, 국가, 색상 등 순서가 없는 범주형 변수.
---
### 3. 범주형 인코딩 (Target Encoding / Mean Encoding)
타겟 인코딩은 범주형 변수의 각 값을 해당 범주에 속하는 타겟 변수의 평균값으로 대체하는 방법입니다. 주로 분류 문제에서 사용됩니다.
예: "지역"별로 구매 전환율(타겟)을 계산하여 인코딩.
| 지역 | 구매 전환율(평균) |
|------|------------------|
| 서울 | 0.75 |
| 부산 | 0.40 |
| 대구 | 0.60 |
#### 장점
- 범주와 타겟 간의 관계를 반영하여 강력한 피처 생성 가능.
- 고차원 문제를 피할 수 있음.
#### 단점
- **데이터 누수**(data leakage) 위험 존재 (학습 데이터의 타겟을 사용하므로).
- 과적합(overfitting) 발생 가능 → 평활화(smoothing) 기법 필요.
#### 주의사항
- 교차 검증 시, 각 폴드 내에서만 타겟 평균을 계산해야 함.
---
### 4. 임베딩 (Embedding)
딥러닝 기반 인코딩으로, 범주형 변수를 고정된 길이의 밀집 벡터(dense vector)로 변환합니다. 신경망의 한 층으로 구현되며, 학습 과정에서 범주 간의 의미적 유사성을 학습합니다.
예: 단어 임베딩(Word2Vec)처럼 "서울"과 "경기"가 유사한 벡터를 가짐.
#### 장점
- 범주 간 유사성 포착 가능.
- 고차원 문제 해결.
#### 단점
- 많은 데이터 필요.
- 학습 시간 소요.
#### 활용 예
- 자연어 처리, 추천 시스템.
---
## 인코딩 선택 기준
| 기법 | 적합한 데이터 유형 | 차원 증가 | 비선형 관계 포착 | 주의사항 |
|------------------|--------------------------|-----------|------------------|------------------------------|
| 레이블 인코딩 | 순서형 변수 | 낮음 | 제한적 | 명목형 변수에 사용 금지 |
| 원-핫 인코딩 | 명목형 변수 (범주 수 적을 때) | 높음 | 없음 | 고차원 → 정규화 필요 |
| 타겟 인코딩 | 명목형 변수 (고유값 많을 때) | 낮음 | 있음 | 데이터 누수 방지 필수 |
| 임베딩 | 고차원 명목형 변수 | 조절 가능 | 높음 | 딥러닝 환경 필요 |
## 결론
인코딩은 데이터 과학에서 전처리의 핵심 단계 중 하나입니다. 범주형 데이터를 적절히 수치화하지 않으면 모델의 성능이 크게 저하될 수 있습니다. 데이터의 성격(명목형, 순서형), 범주 수, 모델 종류에 따라 적절한 인코딩 기법을 선택하는 것이 중요합니다. 특히, **원-핫 인코딩은 단순하지만 차원 폭발 문제**, **타겟 인코딩은 강력하지만 과적합 위험**이 있으므로 신중한 사용이 필요합니다.
## 참고 자료
- Scikit-learn 문서: [LabelEncoder](https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelEncoder.html)
- Pandas 문서: [get_dummies](https://pandas.pydata.org/docs/reference/api/pandas.get_dummies.html)
- "Feature Engineering for Machine Learning", Alice Zheng, O'Reilly
- "Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow", Aurélien Géron