One-Hot Encoding
One-Hot EncodingOne-Hot Encoding(원- 인코딩)은신러닝과 데이터 과학 분야에서 범주형 데이터(categorical data)를 수치형 데이터로 변환하는 데 널리 사용되는 기법. 범주형 변수는 특정 범주(예: 색상, 국가, 직업 등)를 나타내며, 일반적으로 정수나 문자열 형태로 저장되지만, 머신러닝 알고리즘은 이러한 값을 직접 처리할 수 없습니다. 따라서 One-Hot Encoding은 각 범주를 독립적인 이진 벡터(binary vector)로 표현함으로써 모델이 이해할 수 있도록 돕습니다.
이 문서에서는 One-Hot Encoding의 개념, 동작 원리, 사용 사례, 장단점, 그리고 Python을 활용한 구현 방법을 다룹니다.
개요
범주형 데이터는 순서가 없는 명목형(nominal) 데이터와 순서가 있는 순서형(ordinal) 데이터로 나뉩니다. One-Hot Encoding은 주로 명목형 데이터에 적용됩니다. 예를 들어, "색상" 변수에 "빨강", "파랑", "초록"이라는 값이 있다면, 이들을 단순히 0, 1, 2로 인코딩하면 모델이 "파랑 > 빨강"과 같은 잘못된 순서 관계를 추론할 수 있습니다. 이를 방지하기 위해 One-Hot Encoding은 각 범주를 독립적인 열(column)로 분리하고, 해당 범주에 해당하는 위치에 1을, 나머지 위치에 0을 배치합니다.
One-Hot Encoding의 동작 원리
기본 개념
One-Hot Encoding은 다음과 같은 방식으로 작동합니다:
- 범주형 변수의 고유한 값들(예: A, B, C)을 식별합니다.
- 각 고유 값마다 새로운 열(column)을 생성합니다.
- 각 행(row)에서 해당 범주에 해당하는 열에 1을, 나머지 열에는 0을 입력합니다.
예를 들어, 다음과 같은 데이터가 있다고 가정해 봅시다:
색상 |
---|
빨강 |
파랑 |
초록 |
빨강 |
One-Hot Encoding 후:
색상_빨강 | 색상_파랑 | 색_초록 |
---|---|---|
1 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 1 |
1 | 0 | 0 |
이처럼 각 범 독립적인 이진 특성으로 변환됩니다.
사용 사례
One-Hot Encoding은 다음과 같은 상황에서 유용합니다:
- 머신러닝 모델 학습: 대부분의 알고리즘(예: 선형 회귀, SVM, 신경망)은 수치 입력만을 처리할 수 있으므로 범주형 변수를 변환해야 합니다.
- 특성 공학(Feature Engineering): 모델의 성능을 높이기 위해 원시 데이터를 더 잘 표현하는 방식으로 변환.
- 텍스트 분류: 단어나 라벨을 벡터 형태로 표현할 때 사용 (예: 단어의 존재 여부를 0/1로 인코딩).
장점과 단점
장점
- 비대칭성 보장: 각 범주가 동등한 거리로 표현되어, 임의의 순서를 부여하지 않음.
- 모델 호환성: 대부분의 머신러닝 알고리즘과 호환됨.
- 해석 용이성: 생성된 피처는 각 범주의 존재 여부를 명확히 나타냄.
단점
- 차원 증가(Dimensionality Explosion): 고유 범주의 수가 많을 경우 피처 수가 급격히 증가 (예: 100개의 국가 → 100개의 열).
- 희소성(Sparsity): 대부분의 값이 0인 희소 행렬(sparse matrix)이 생성되어 메모리 낭비 가능성.
- 중복 정보: 하나의 범주형 변수가 여러 열로 분리되므로, 다중공선성(multicollinearity) 문제가 발생할 수 있음. 이를 방지하기 위해 보통 하나의 열을 드롭(drop)하여 더미 변수(dummy variable)로 사용.
Python을 통한 구현
Python에서는 [pandas](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/Python/pandas)
와 [scikit-learn](/doc/%EA%B8%B0%EC%88%A0/%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D/scikit-learn)
을 활용해 쉽게 One-Hot Encoding을 수행할 수 있습니다.
1. Pandas 사용 ([pd.get_dummies](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/Python/pd.get_dummies)
)
import pandas as pd
# 샘플 데이터
data = pd.DataFrame({'색상': ['빨강', '파랑', '초록', '빨강']})
# One-Hot Encoding
encoded_data = pd.get_dummies(data, columns=['색상'], prefix='색상')
print(encoded_data)
출력:
색상_빨강 색상_파랑 색상_초록
0 1 0 0
1 0 1 0
2 0 0 1
3 1 0 0
2. Scikit-learn 사용 (OneHotEncoder
)
from sklearn.preprocessing import OneHotEncoder
import numpy as np
# 데이터 준비
colors = np.array([['빨강'], ['파랑'], ['초록'], ['빨강']])
# 인코더 정의 및 학습
encoder = OneHotEncoder(sparse_output=False) # sparse=False: 밀집 배열 반환
encoded_array = encoder.fit_transform(colors)
print(encoded_array)
출력:
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]
[1. 0. 0.]]
관련 기법
One-Hot Encoding 외에도 범주형 데이터를 인코딩하는 다양한 방법이 존재합니다:
- Label Encoding: 각 범주에 정수를 할당 (순서형 데이터에 적합).
- Ordinal Encoding: 순서가 있는 범주형 변수에 순서를 반영하여 인코딩.
- Target Encoding: 범주별 타겟 평균값을 사용 (과적합 주의 필요).
- Embedding: 딥러닝에서 고차원 One-Hot을 저차원 밀집 벡터로 변환.
참고 자료
- Scikit-learn 공식 문서 - OneHotEncoder
- Pandas 문서 - get_dummies
- Hands-On Machine Learning with Scikit-Learn, Keras & TensorFlow, Aurélien Géron
One-Hot Encoding은 데이터 과학에서 범주형 변수를 다룰 때 가장 기초적이면서도 필수적인 기법입니다. 적절한 사용과 함께 차원 축소 기법(예: PCA)이나 임베딩과 결합하면 대규모 범주 데이터도 효과적으로 처리할 수 있습니다.
이 문서는 AI 모델(qwen-3-235b-a22b-instruct-2507)에 의해 생성된 콘텐츠입니다.
주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.