원-핫 인코딩
원-핫 인코딩
개요
원핫 인코딩(One-Hot Encoding)은 범주형 데이터(c data)를 기계학습 모델이 이해할 있도록 수치형 데이터로 변환하는 대표적인 방법 중 하나입니다. 이 기은 각 범주)를 고유한 이진 벡터(binary vector)로 표현하며, 벡터 내에서 해당 범주에 해당하는 위치만 1로 설정하고 나머지 모든 위치는 0으로 설정합니다. 이는 자연어처리(NLP), 데이터 전처리, 머신러닝 등 다양한 분야에서 널리 사용됩니다.
원-핫 인코딩은 단순하면서도 직관적인 방식으로, 특히 신경망 모델이나 선형 모델에서 범주형 변수를 입력으로 사용할 때 필수적인 전처리 단계로 간주됩니다. 그러나 고유 범주의 수가 많아질 경우 차원의 저주(curse of dimensionality) 문제를 유발할 수 있으므로, 상황에 따라 다른 인코딩 기법(예: 임베딩, 레이블 인코딩)과 함께 고려되어야 합니다.
원-핫 인코딩의 원리
기본 개념
범주형 변수는 숫자가 아닌 이름이나 레이블로 구성된 데이터입니다. 예를 들어, 색상 데이터에서 ["빨강", "파랑", "초록"]과 같은 값은 기계학습 모델이 직접 처리하기 어렵습니다. 원-핫 인코딩은 이러한 값을 다음과 같은 방식으로 변환합니다:
- 각 고유 범주에 대해 하나의 열(column)을 할당합니다.
- 특정 샘플이 어떤 범주에 속하면 해당 열의 값은 1, 나머지 열의 값은 0이 됩니다.
예를 들어, 세 가지 색상 범주가 있을 때:
| 색상 |
|---|
| 빨강 |
| 파랑 |
| 초록 |
이를 원-핫 인코딩하면 다음과 같은 이진 행렬로 변환됩니다:
| 빨강 | 파랑 | 초록 |
|---|---|---|
| 1 | 0 | 0 |
| 0 | 1 | 0 |
| 0 | 0 | 1 |
수학적 표현
$n$개의 고유 범주가 있을 경우, 각 범주는 $n$차원의 이진 벡터로 표현됩니다. 예를 들어, 범주 $c_i$는 다음과 같은 벡터로 표현됩니다:
$$ \mathbf{v}_i = [0, 0, \dots, 1, \dots, 0] \quad (\text{단, } i\text{-번째 위치만 1}) $$
이 방식은 단일 활성화(one-of-K encoding)라고도 불립니다.
자연어처리에서의 활용
원-핫 인코딩은 자연어처리의 초기 단계에서 단어를 수치화하는 데 사용되었습니다.
단어의 원-핫 인코딩
예를 들어, 어휘 집합(vocabulary)이 다음과 같다고 가정합니다:
["사과", "바나나", "오렌지", "포도"]
이 경우 각 단어는 다음과 같이 인코딩됩니다:
- "사과":
[1, 0, 0, 0] - "바나나":
[0, 1, 0, 0] - "오렌지":
[0, 0, 1, 0] - "포도":
[0, 0, 0, 1]
이 인코딩은 단어를 벡터 형태로 표현하기 위한 첫걸음이지만, 다음과 같은 문제점이 있습니다:
- 차원 증가: 어휘가 10,000개라면 모든 단어는 10,000차원 벡터로 표현되어 메모리 소모가 큽니다.
- 의미 정보 부족: "사과"와 "바나나" 사이의 유사성은 0으로 계산되며, 의미적 유사성을 반영하지 못합니다.
- 희소 벡터(Sparse Vector): 벡터 대부분이 0이므로 계산 효율성이 낮습니다.
문장 표현
문장을 원-핫 인코딩으로 표현하려면 각 단어를 개별적으로 인코딩한 후, 평균 또는 합을 취하는 방식을 사용할 수 있습니다. 하지만 이 방법은 문맥 정보를 완전히 무시하므로 현대 NLP에서는 거의 사용되지 않습니다.
장점과 단점
장점
- 단순하고 직관적: 구현이 매우 쉽고 해석이 명확합니다.
- 모델 호환성: 대부분의 기계학습 알고리즘은 수치 입력을 요구하므로, 범주형 변수를 처리하기 위한 기본 방법으로 적합합니다.
- 서로 다른 범주 간의 순서 무시: 레이블 인코딩과 달리 임의의 숫자 순서를 부여하지 않아 순서 없는 범주에 적합합니다.
단점
- 차원 증가: 고유 범주의 수가 많을수록 피처(feature) 수가 급격히 증가합니다.
- 메모리 비효율: 희소 행렬(sparse matrix)을 생성하여 저장 및 계산 비용이 높아집니다.
- 의미 정보 부재: 범주 간 유사성을 반영하지 못합니다.
- 고차원 문제: 차원이 너무 커지면 모델의 성능이 저하될 수 있습니다.
사용 예시 (코드)
다음은 파이썬에서 [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/%EB%8D%B0%EC%9D%B4%ED%84%B0%EA%B3%BC%ED%95%99/%EB%8D%B0%EC%9D%B4%ED%84%B0%20%EB%B6%84%EC%84%9D%20%EB%8F%84%EA%B5%AC/scikit-learn)을 이용한 원-핫 인코딩의 예입니다.
import pandas as pd
from sklearn.preprocessing import OneHotEncoder
# 샘플 데이터
data = pd.DataFrame({'색상': ['빨강', '파랑', '초록', '빨강', '파랑']})
# 방법 1: pandas의 get_dummies 사용
encoded_pandas = pd.get_dummies(data, columns=['색상'])
print(encoded_pandas)
# 방법 2: scikit-learn의 OneHotEncoder 사용
encoder = OneHotEncoder(sparse_output=False)
encoded_sklearn = encoder.fit_transform(data[['색상']])
print(encoded_sklearn)
출력 결과:
색상_빨강 색상_파랑 색상_초록
0 1 0 0
1 0 1 0
2 0 0 1
3 1 0 0
4 0 1 0
관련 기법 및 대안
원-핫 인코딩 외에도 다음과 같은 대안 기법들이 존재합니다:
- 레이블 인코딩(Label Encoding): 범주에 정수를 할당 (예: 빨강→0, 파랑→1). 순서가 있는 범주에 적합하지만, 순서 없는 범주에서는 오해의 소지가 있음.
- 임베딩(Embedding): 고차원 원-핫 벡터를 저차원 밀집 벡터(dense vector)로 변환. 딥러닝 모델에서 단어 의미를 학습하는 데 사용됨.
- 해싱 트릭(Hashing Trick): 고차원 범주를 고정된 크기의 벡터로 해싱하여 차원 축소.
참고 자료 및 관련 문서
- Scikit-learn 공식 문서 - Preprocessing
- Pandas get_dummies 문서
- Jurafsky, D., & Martin, J. H. (2023). Speech and Language Processing (3rd ed.). 자연어처리 기초 개념 설명.
- Goodfellow, I., Bengio, Y., & Courville, A. (2016). Deep Learning. MIT Press.
원-핫 인코딩은 데이터 전처리의 기초이자 필수 기술로, 현대의 복잡한 모델 개발 과정에서도 여전히 중요한 역할을 하고 있습니다.
이 문서는 AI 모델(qwen-3-235b-a22b-instruct-2507)에 의해 생성된 콘텐츠입니다.
주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.