One-Hot Encoding: 범주형 데이터의 벡터 표현 기법
- 원-핫 인코딩의 원리
- 실제 구현 예시
- 텍스트 데이터 처리에서의 활용
- 원-핫 인코딩의 데이터 구조 표현
- 원-핫 인코딩의 흐름도
- 원-핫 인코딩의 장단점
- 원-핫 인코딩의 한계 극복 방안
- 원-핫 인코딩의 산업 응용 사례
- 결론
- Keywords
원-핫 인코딩(One-Hot Encoding)은 기계학습과 딥러닝에서 범주형 데이터를 수치 벡터로 변환하는 대표적인 기법이다. 단어 집합(vocabulary)의 크기를 벡터의 차원으로 설정하고, 표현하고자 하는 단어의 인덱스 위치에만 1을 부여하고 나머지 모든 인덱스에는 0을 부여하는 방식으로 작동한다. 이러한 표현법은 원-핫 벡터(One-Hot vector)라고 불린다.
원-핫 인코딩의 원리
원-핫 인코딩의 기본 개념은 다음과 같다:
- 표현하려는 모든 범주의 개수만큼 벡터 차원을 설정
- 해당 범주를 나타내는 인덱스의 값만 1로 표시
- 나머지 모든 인덱스는 0으로 표시
예를 들어, 단어 집합 {'사과', '바나나', '오렌지', '포도', '딸기'}가 있다면:
- '사과'는 [1, 0, 0, 0, 0]
- '바나나'는 [0, 1, 0, 0, 0]
- '오렌지'는 [0, 0, 1, 0, 0]
- '포도'는 [0, 0, 0, 1, 0]
- '딸기'는 [0, 0, 0, 0, 1]
위와 같이 표현된다.
실제 구현 예시
Python에서 원-핫 인코딩을 구현하는 방법을 살펴보자:
import numpy as np
from sklearn.preprocessing import OneHotEncoder
# 범주형 데이터 준비
data = [['사과'], ['바나나'], ['오렌지'], ['포도'], ['딸기']]
# OneHotEncoder 객체 생성
encoder = OneHotEncoder(sparse=False)
# 인코딩 실행
one_hot_encoded = encoder.fit_transform(data)
print(one_hot_encoded)
결과:
[[1. 0. 0. 0. 0.]
[0. 1. 0. 0. 0.]
[0. 0. 1. 0. 0.]
[0. 0. 0. 1. 0.]
[0. 0. 0. 0. 1.]]
또한 Tensorflow나 PyTorch에서도 쉽게 원-핫 인코딩을 구현할 수 있다:
import tensorflow as tf
# 정수 인덱스로 된 데이터
indices = [0, 1, 2, 3, 4]
# 원-핫 인코딩
depth = 5 # 범주의 수
one_hot_tf = tf.one_hot(indices, depth)
print(one_hot_tf.numpy())
텍스트 데이터 처리에서의 활용
자연어 처리(NLP)에서 원-핫 인코딩은 단어를 벡터로 표현하는 기본적인 방법이다. 문장을 처리할 때는 각 단어를 원-핫 벡터로 변환하여 신경망에 입력할 수 있다.
예시:
from tensorflow.keras.preprocessing.text import Tokenizer
# 텍스트 데이터
texts = ["I love machine learning", "I love deep learning"]
# 토큰화
tokenizer = Tokenizer()
tokenizer.fit_on_texts(texts)
# 단어 인덱스 확인
word_index = tokenizer.word_index
print("단어 인덱스:", word_index)
# 문장을 시퀀스로 변환
sequences = tokenizer.texts_to_sequences(texts)
print("시퀀스:", sequences)
# 원-핫 인코딩
vocab_size = len(word_index) + 1 # 0은 패딩용
one_hot_results = tf.keras.utils.to_categorical(sequences, num_classes=vocab_size)
print("원-핫 인코딩 결과:")
for i, result in enumerate(one_hot_results):
print(f"문장 {i+1}:", result)
원-핫 인코딩의 데이터 구조 표현
원-핫 인코딩의 일반적인 형태는 다음과 같다:
[
[0. 1. 0. 0. 0. 0. 0. 0.] # 인덱스 1의 원-핫 벡터
[0. 0. 1. 0. 0. 0. 0. 0.] # 인덱스 2의 원-핫 벡터
[0. 0. 0. 1. 0. 0. 0. 0.] # 인덱스 3의 원-핫 벡터
[0. 0. 0. 0. 1. 0. 0. 0.] # 인덱스 4의 원-핫 벡터
[0. 0. 0. 0. 0. 1. 0. 0.] # 인덱스 5의 원-핫 벡터
[0. 0. 0. 0. 0. 0. 1. 0.] # 인덱스 6의 원-핫 벡터
[0. 0. 0. 0. 0. 0. 0. 1.] # 인덱스 7의 원-핫 벡터
]
이는 희소 행렬(sparse matrix) 형태로, 대부분의 값이 0이고 단 하나의 값만 1인 특징을 가진다.
원-핫 인코딩의 흐름도
graph TD
A[범주형 데이터] --> B[고유 범주 식별]
B --> C[차원 결정: 범주 수]
C --> D[각 범주별 벡터 생성]
D --> E[해당 범주 인덱스에 1 할당]
E --> F[나머지 인덱스에 0 할당]
F --> G[원-핫 벡터 완성]
원-핫 인코딩의 장단점
장점
- 구현 용이성: 간단한 개념과 구현 방법으로 쉽게 적용 가능
- 직관적 표현: 각 범주가 독립적으로 표현되어 직관적인 이해 가능
- 모델 호환성: 대부분의 머신러닝 알고리즘에 적용 가능
- 범주 간 동등성: 모든 범주가 동일한 가중치로 표현됨
단점
- 공간적 낭비: 범주의 수가 많아질수록 벡터의 차원이 커지며, 대부분이 0으로 구성되어 메모리 사용량 증가
- 계산 리소스 증가: 고차원 벡터로 인한 연산량 증가
- 저장 공간 비효율성: 대규모 데이터셋에서 심각한 저장 공간 문제 발생
- 의미적 한계: 단어나 범주 간의 유사성이나 관계를 표현할 수 없음
- '왕'과 '여왕'의 관계, '서울'과 '대한민국'의 관계 등 의미적 연관성 표현 불가
원-핫 인코딩의 한계 극복 방안
원-핫 인코딩의 한계를 극복하기 위해 단어의 잠재 의미를 반영하여 다차원 공간에 벡터화하는 다양한 기법이 등장했다:
1. 카운트 기반 벡터화
- LSA(Latent Semantic Analysis): 단어-문서 행렬에 특이값 분해(SVD)를 적용하여 차원 축소
- HAL(Hyperspace Analogue to Language): 단어 주변의 문맥 정보를 활용한 벡터화
flowchart LR
A[문서 집합] --> B[단어-문서 행렬]
B --> C[TF-IDF 가중치 적용]
C --> D[특이값 분해\nSVD]
D --> E[저차원 의미 공간]
2. 예측 기반 벡터화
- NNLM(Neural Network Language Model): 신경망을 이용한 언어 모델
- RNNLM(Recurrent Neural Network Language Model): 순환 신경망 기반 언어 모델
- Word2Vec: 대규모 코퍼스에서 단어의 문맥 정보를 학습
- CBOW(Continuous Bag of Words): 주변 단어로 중심 단어 예측
- Skip-gram: 중심 단어로 주변 단어 예측
- FastText: Word2Vec의 확장으로 부분 단어(subword) 정보도 활용
flowchart TD
A[입력 단어] --> B[임베딩 레이어]
B --> C[히든 레이어]
C --> D[출력 레이어]
D --> E[문맥 단어 예측]
F[학습 완료] --> G[임베딩 벡터 추출]
3. 실제 사례 비교
일반적인 단어 임베딩은 원-핫 인코딩과 달리 의미적 유사성을 벡터 공간에 표현할 수 있다:
# 원-핫 인코딩
'사과' = [1, 0, 0, 0, 0, 0, ...]
'배' = [0, 1, 0, 0, 0, 0, ...]
유사도(코사인 유사도) = 0 # 완전히 독립적으로 표현됨
# Word2Vec 임베딩
'사과' = [0.2, -0.3, 0.5, 0.1, ...]
'배' = [0.3, -0.2, 0.4, 0.2, ...]
유사도(코사인 유사도) = 0.92 # 의미적 유사성 표현 가능
원-핫 인코딩의 산업 응용 사례
1. 전자상거래 추천 시스템
제품 카테고리를 원-핫 인코딩하여 사용자 선호도 모델링:
# 제품 카테고리
categories = ['전자기기', '의류', '식품', '도서', '가구']
# 사용자 구매 이력을 원-핫 인코딩으로 표현
user_1_history = [1, 0, 0, 1, 0] # 전자기기, 도서 구매
user_2_history = [0, 1, 1, 0, 0] # 의류, 식품 구매
2. 의료 데이터 분석
환자 증상 및 질병 분류 코드를 원-핫 인코딩으로 변환:
# ICD-10 질병 코드 원-핫 인코딩
icd_codes = ['A00', 'A01', 'B20', 'C50', 'I21']
patient_1_diagnosis = [0, 1, 0, 0, 1] # A01, I21 진단
3. 자율주행 차량 의사결정 시스템
도로 상황 인식을 위한 객체 카테고리 인코딩:
# 도로 객체 카테고리
objects = ['차량', '보행자', '신호등', '정지 표지판', '장애물']
# 현재 인식된 객체들의 원-핫 인코딩
current_scene = [1, 1, 1, 0, 0] # 차량, 보행자, 신호등 감지
결론
원-핫 인코딩은 범주형 데이터를 기계학습 모델에 적용하기 위한 필수적인 전처리 기법이다. 구현이 간단하고 직관적이라는 장점이 있지만, 고차원 벡터로 인한 효율성 문제와 의미적 관계 표현의 한계가 존재한다. 이러한 한계를 극복하기 위해 Word2Vec, GloVe, BERT 등 다양한 임베딩 기법이 등장했으며, 데이터의 특성과 모델의 요구사항에 따라 적절한 인코딩 방식을 선택하는 것이 중요하다.
현대 AI 시스템에서는 원-핫 인코딩을 기본으로 하되, 필요에 따라 고급 임베딩 기법을 혼합하여 사용하는 하이브리드 접근법이 일반적이다. 특히 대규모 언어 모델(LLM)의 등장으로 맥락을 고려한 동적 임베딩이 주목받고 있으나, 기본적인 원-핫 인코딩의 개념은 여전히 딥러닝 모델의 기초가 되고 있다.
Keywords
One-Hot Encoding, 원-핫 인코딩, Vector Representation, 벡터 표현, Categorical Data, 범주형 데이터, Word Embedding, 단어 임베딩, Sparse Matrix, 희소 행렬, NLP, 자연어 처리, Feature Engineering, 특성 공학
'IT Professional Engineering > AI.ML' 카테고리의 다른 글
Padding: 병렬 처리를 위한 데이터 크기 일관성 확보 기법 (0) | 2025.04.16 |
---|---|
Integer Encoding: 텍스트 데이터를 머신러닝 알고리즘이 이해할 수 있는 숫자로 변환하는 기법 (0) | 2025.04.16 |
Regular Expression: 효율적인 문자열 패턴 처리 기법 (0) | 2025.04.16 |
Stopword: 자연어 처리에서 불필요한 단어 제거 기법 (0) | 2025.04.16 |
표제어 추출 & 어간 추출: 자연어 처리의 핵심 전처리 기법 (0) | 2025.04.16 |