개요
데이터 전처리 과정에서 인코딩(Encoding)은 범주형 데이터(categorical data)를 머신러닝 모델이 이해할 수 있는 수치형 형식으로 변환하는 핵심 기술입니다. 대부분의 머신러닝 알고리즘은 문자열이나 라벨 형태의 범주형 데이터를 직접 처리할 수 없으므로, 이를 숫자로 변환하는 과정이 필수적입니다. 인코딩은 데이터의 의미를 보존하면서도 모델 학습에 적합한 형태로 데이터를 재구성하는 역할을 합니다.
이 문서에서는 대표적인 인코딩 기법들 — 레이블 인코딩(Label Encoding), 원-핫 인코딩(One-Hot Encoding), 이미지 인코딩(Ordinal Encoding), 임베딩(Embedding) — 을 중심으로 설명하고, 각 기법의 사용 사례, 장단점, 그리고 실전 적용 시 고려해야 할 사항을 다룹니다.
주요 인코딩 기법
레이블 인코딩 (Label Encoding)
레이블 인코딩은 각 범주형 값에 고유한 정수를 할당하는 간단한 인코딩 방식입니다. 예를 들어, ["red", "green", "blue"]라는 색상 카테고리를 [0, 1, 2]로 매핑할 수 있습니다.
from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
colors = ["red", "green", "blue", "red"]
encoded = encoder.fit_transform(colors)
print(encoded) # 출력: [2 1 0 2]
장점
- 메모리 사용이 적고, 간단하게 구현 가능
- 순서가 있는 데이터(순서형 변수, ordinal)에 적합
단점
- 임의로 부여된 정수 값이 알고리즘에 "순서" 또는 "크기 비교"의 의미를 전달할 수 있음
- 예: "red=0", "blue=2" 라고 하면 모델이 "blue가 red보다 2배 크다"고 오해할 수 있음
✅ 적합한 경우: 순서형 변수(예: "낮음", "중간", "높음") 또는 트리 기반 모델(랜덤 포레스트, XGBoost 등)에서 사용 시
원-핫 인코딩 (One-Hot Encoding)
원-핫 인코딩은 각 범주를 독립적인 이진 벡터(binary vector)로 표현하는 방식입니다. 범주의 수만큼의 새로운 열을 생성하고, 해당 범주에 해당하는 위치에만 1을, 나머지는 0을 배정합니다.
예: ["A", "B", "A", "C"] →
| A | B | C |
|---|---|---|
| 1 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 0 | 0 | 1 |
import pandas as pd
data = pd.DataFrame({'color': ['red', 'green', 'blue', 'red']})
one_hot = pd.get_dummies(data, columns=['color'])
print(one_hot)
장점
단점
- 범주의 수가 많을 경우 차원이 급격히 증가함 (차원의 저주)
- 희소 행렬(sparse matrix) 생성 → 메모리 낭비
✅ 적합한 경우: 명목형 변수(nominal, 예: 국가, 색상), 범주 수가 적을 때
순서형 인코딩 (Ordinal Encoding)
순서형 인코딩은 레이블 인코딩과 유사하지만, 범주에 의미 있는 순서가 있을 때 수동으로 순위를 부여하는 방식입니다.
예: 교육 수준 → ["고졸", "학사", "석사", "박사"] → [1, 2, 3, 4]
from sklearn.preprocessing import OrdinalEncoder
encoder = OrdinalEncoder(categories=[["low", "medium", "high"]])
levels = [["low"], ["high"], ["medium"]]
encoded = encoder.fit_transform(levels)
print(encoded) # [[0.], [2.], [1.]]
특징
- 순서 정보를 모델에 명시적으로 전달 가능
- 사용자가 순서를 정의해야 하므로 도메인 지식 필요
✅ 적합한 경우: 순서가 있는 범주형 변수 (예: 평점, 등급)
임베딩 (Embedding)
고차원 범주형 변수(예: 단어, 사용자 ID)를 처리할 때는 임베딩(Embedding) 기법을 사용합니다. 딥러닝 모델에서 흔히 사용되며, 범주를 고정된 크기의 밀집 벡터(dense vector)로 변환합니다.
예: 단어 "사과" → [0.8, -0.3, 1.2, 0.1]
장점
- 차원 축소 효과
- 유사한 범주 간의 의미적 유사성 학습 가능
- 고차원 데이터에 적합
단점
- 딥러닝 모델 학습 과정에서 함께 학습 필요
- 해석이 어렵고, 사전 학습된 임베딩이 없으면 초기 성능 낮음
✅ 적합한 경우: 자연어 처리(NLP), 추천 시스템, 고유 식별자(ID) 처리
인코딩 선택 가이드
| 인코딩 방식 |
데이터 유형 |
차원 증가 |
모델 적합성 |
비고 |
| 레이블 인코딩 |
순서형 또는 이진형 |
없음 |
트리 기반 모델 |
순서 주의 |
| 원-핫 인코딩 |
명목형, 소규모 |
큼 |
대부분의 선형 모델 |
더미 변수 함정 주의 |
| 순서형 인코딩 |
순서형 |
없음 |
모든 모델 (순서 반영 시) |
수동 정의 필요 |
| 임베딩 |
고차원 범주형 |
조절 가능 |
딥러닝 기반 모델 |
학습 기반 |
💡 더미 변수 함정(Dummy Variable Trap): 원-핫 인코딩 후 모든 더미 변수를 유지하면 다중 공선성 문제 발생 → 일반적으로 하나의 범주를 기준으로 제거
참고 자료 및 관련 문서
인코딩은 데이터 과학 프로젝트의 성패를 좌우하는 중요한 전처리 단계입니다. 데이터의 성격과 사용하는 모델의 특성을 고려해 적절한 인코딩 방식을 선택함으로써, 모델의 성능과 해석 가능성을 동시에 높일 수 있습니다.
# 인코딩
## 개요
데이터 전처리 과정에서 **인코딩**(Encoding)은 범주형 데이터(categorical data)를 머신러닝 모델이 이해할 수 있는 수치형 형식으로 변환하는 핵심 기술입니다. 대부분의 머신러닝 알고리즘은 문자열이나 라벨 형태의 범주형 데이터를 직접 처리할 수 없으므로, 이를 숫자로 변환하는 과정이 필수적입니다. 인코딩은 데이터의 의미를 보존하면서도 모델 학습에 적합한 형태로 데이터를 재구성하는 역할을 합니다.
이 문서에서는 대표적인 인코딩 기법들 — **레이블 인코딩**(Label Encoding), **원-핫 인코딩**(One-Hot Encoding), **이미지 인코딩**(Ordinal Encoding), **임베딩**(Embedding) — 을 중심으로 설명하고, 각 기법의 사용 사례, 장단점, 그리고 실전 적용 시 고려해야 할 사항을 다룹니다.
---
## 주요 인코딩 기법
### 레이블 인코딩 (Label Encoding)
**레이블 인코딩**은 각 범주형 값에 고유한 정수를 할당하는 간단한 인코딩 방식입니다. 예를 들어, ["red", "green", "blue"]라는 색상 카테고리를 [0, 1, 2]로 매핑할 수 있습니다.
```python
from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
colors = ["red", "green", "blue", "red"]
encoded = encoder.fit_transform(colors)
print(encoded) # 출력: [2 1 0 2]
```
#### 장점
- 메모리 사용이 적고, 간단하게 구현 가능
- 순서가 있는 데이터(순서형 변수, ordinal)에 적합
#### 단점
- 임의로 부여된 정수 값이 알고리즘에 "순서" 또는 "크기 비교"의 의미를 전달할 수 있음
- 예: "red=0", "blue=2" 라고 하면 모델이 "blue가 red보다 2배 크다"고 오해할 수 있음
> ✅ **적합한 경우**: 순서형 변수(예: "낮음", "중간", "높음") 또는 트리 기반 모델(랜덤 포레스트, XGBoost 등)에서 사용 시
---
### 원-핫 인코딩 (One-Hot Encoding)
**원-핫 인코딩**은 각 범주를 독립적인 이진 벡터(binary vector)로 표현하는 방식입니다. 범주의 수만큼의 새로운 열을 생성하고, 해당 범주에 해당하는 위치에만 1을, 나머지는 0을 배정합니다.
예: ["A", "B", "A", "C"] →
| A | B | C |
|---|---|---|
| 1 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 0 | 0 | 1 |
```python
import pandas as pd
data = pd.DataFrame({'color': ['red', 'green', 'blue', 'red']})
one_hot = pd.get_dummies(data, columns=['color'])
print(one_hot)
```
#### 장점
- 범주 간의 인위적인 순서를 부여하지 않음
- 선형 회귀, 로지스틱 회귀 등 대부분의 모델에 적합
#### 단점
- 범주의 수가 많을 경우 차원이 급격히 증가함 (차원의 저주)
- 희소 행렬(sparse matrix) 생성 → 메모리 낭비
> ✅ **적합한 경우**: 명목형 변수(nominal, 예: 국가, 색상), 범주 수가 적을 때
---
### 순서형 인코딩 (Ordinal Encoding)
순서형 인코딩은 **레이블 인코딩과 유사하지만**, 범주에 의미 있는 순서가 있을 때 수동으로 순위를 부여하는 방식입니다.
예: 교육 수준 → ["고졸", "학사", "석사", "박사"] → [1, 2, 3, 4]
```python
from sklearn.preprocessing import OrdinalEncoder
encoder = OrdinalEncoder(categories=[["low", "medium", "high"]])
levels = [["low"], ["high"], ["medium"]]
encoded = encoder.fit_transform(levels)
print(encoded) # [[0.], [2.], [1.]]
```
#### 특징
- 순서 정보를 모델에 명시적으로 전달 가능
- 사용자가 순서를 정의해야 하므로 도메인 지식 필요
> ✅ **적합한 경우**: 순서가 있는 범주형 변수 (예: 평점, 등급)
---
### 임베딩 (Embedding)
고차원 범주형 변수(예: 단어, 사용자 ID)를 처리할 때는 **임베딩**(Embedding) 기법을 사용합니다. 딥러닝 모델에서 흔히 사용되며, 범주를 고정된 크기의 밀집 벡터(dense vector)로 변환합니다.
예: 단어 "사과" → [0.8, -0.3, 1.2, 0.1]
#### 장점
- 차원 축소 효과
- 유사한 범주 간의 의미적 유사성 학습 가능
- 고차원 데이터에 적합
#### 단점
- 딥러닝 모델 학습 과정에서 함께 학습 필요
- 해석이 어렵고, 사전 학습된 임베딩이 없으면 초기 성능 낮음
> ✅ **적합한 경우**: 자연어 처리(NLP), 추천 시스템, 고유 식별자(ID) 처리
---
## 인코딩 선택 가이드
| 인코딩 방식 | 데이터 유형 | 차원 증가 | 모델 적합성 | 비고 |
|-------------------|---------------------|-----------|----------------------------|------|
| 레이블 인코딩 | 순서형 또는 이진형 | 없음 | 트리 기반 모델 | 순서 주의 |
| 원-핫 인코딩 | 명목형, 소규모 | 큼 | 대부분의 선형 모델 | 더미 변수 함정 주의 |
| 순서형 인코딩 | 순서형 | 없음 | 모든 모델 (순서 반영 시) | 수동 정의 필요 |
| 임베딩 | 고차원 범주형 | 조절 가능 | 딥러닝 기반 모델 | 학습 기반 |
> 💡 **더미 변수 함정**(Dummy Variable Trap): 원-핫 인코딩 후 모든 더미 변수를 유지하면 다중 공선성 문제 발생 → 일반적으로 하나의 범주를 기준으로 제거
---
## 참고 자료 및 관련 문서
- [Scikit-learn 공식 문서: Preprocessing](https://scikit-learn.org/stable/modules/preprocessing.html)
- [Pandas `get_dummies`](https://pandas.pydata.org/docs/reference/api/pandas.get_dummies.html)
- Goodfellow, I., Bengio, Y., & Courville, A. (2016). *Deep Learning*. MIT Press. (임베딩 장 참고)
- 데이터 전처리 관련 문서: [결측치 처리](/wiki/결측치_처리), [정규화 및 표준화](/wiki/정규화_표준화)
---
인코딩은 데이터 과학 프로젝트의 성패를 좌우하는 중요한 전처리 단계입니다. 데이터의 성격과 사용하는 모델의 특성을 고려해 적절한 인코딩 방식을 선택함으로써, 모델의 성능과 해석 가능성을 동시에 높일 수 있습니다.