원-핫 인코딩: 범주형 데이터를 벡터의 한 자리로 표현하기

원-핫 인코딩의 원리와 Scikit-learn·TensorFlow 구현, 장단점, LSA·Word2Vec 등 한계 극복 기법과 산업 응용 사례를 정리한다.

2026-08-14 · 최초 발행 2025-05-23

벡터의 정확히 한 자리에만 불을 켠다

원-핫 인코딩(One-Hot Encoding)은 기계학습과 딥러닝에서 범주형 데이터를 수치 벡터로 변환하는 대표적인 기법이다. 단어 집합(vocabulary)의 크기를 벡터의 차원으로 설정하고, 표현하고자 하는 단어의 인덱스 위치에만 1을 부여하고 나머지 모든 인덱스에는 0을 부여하는 방식으로 작동한다. 이렇게 표현된 벡터를 원-핫 벡터(One-Hot vector)라 부른다.

기본 개념은 다음과 같다.

  1. 표현하려는 모든 범주의 개수만큼 벡터 차원을 설정
  2. 해당 범주를 나타내는 인덱스의 값만 1로 표시
  3. 나머지 모든 인덱스는 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]로 표현된다.

Scikit-learn과 TensorFlow로 만들어보기

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인 특징을 가진다.

간단하지만 비싼 표현

구현이 간단하고 각 범주가 독립적으로 표현되어 직관적으로 이해할 수 있으며, 대부분의 머신러닝 알고리즘에 적용할 수 있고 모든 범주가 동일한 가중치로 표현된다는 장점이 있다. 반면 범주의 수가 많아질수록 벡터의 차원이 커지고 대부분이 0으로 구성돼 메모리 사용량이 늘어나며, 고차원 벡터로 인한 연산량 증가와 대규모 데이터셋에서의 저장 공간 문제가 뒤따른다. 무엇보다 '왕'과 '여왕'의 관계, '서울'과 '대한민국'의 관계처럼 단어나 범주 간의 유사성·관계를 표현할 수 없다는 의미적 한계가 있다.

잠재 의미를 담으려는 시도들

원-핫 인코딩의 한계를 극복하기 위해 단어의 잠재 의미를 반영하여 다차원 공간에 벡터화하는 다양한 기법이 등장했다.

카운트를 세어 벡터를 만드는 방법

  • LSA(Latent Semantic Analysis): 단어-문서 행렬에 특이값 분해(SVD)를 적용하여 차원 축소
  • HAL(Hyperspace Analogue to Language): 단어 주변의 문맥 정보를 활용한 벡터화
문서 집합단어-문서 행렬TF-IDF 가중치 적용특이값 분해SVD저차원 의미 공간

다음 단어를 예측하며 벡터를 만드는 방법

  • NNLM(Neural Network Language Model): 신경망을 이용한 언어 모델
  • RNNLM(Recurrent Neural Network Language Model): 순환 신경망 기반 언어 모델
  • Word2Vec: 대규모 코퍼스에서 단어의 문맥 정보를 학습. CBOW(Continuous Bag of Words)는 주변 단어로 중심 단어를 예측하고, Skip-gram은 중심 단어로 주변 단어를 예측한다.
  • FastText: Word2Vec의 확장으로 부분 단어(subword) 정보도 활용
입력 단어임베딩 레이어히든 레이어출력 레이어문맥 단어 예측학습 완료임베딩 벡터 추출

일반적인 단어 임베딩은 원-핫 인코딩과 달리 의미적 유사성을 벡터 공간에 표현할 수 있다.

# 원-핫 인코딩
'사과' = [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  # 의미적 유사성 표현 가능

추천 시스템부터 자율주행까지

전자상거래 추천 시스템

제품 카테고리를 원-핫 인코딩하여 사용자 선호도를 모델링한다.

# 제품 카테고리
categories = ['전자기기', '의류', '식품', '도서', '가구']

# 사용자 구매 이력을 원-핫 인코딩으로 표현
user_1_history = [1, 0, 0, 1, 0]  # 전자기기, 도서 구매
user_2_history = [0, 1, 1, 0, 0]  # 의류, 식품 구매

의료 데이터 분석

환자 증상 및 질병 분류 코드를 원-핫 인코딩으로 변환한다.

# ICD-10 질병 코드 원-핫 인코딩
icd_codes = ['A00', 'A01', 'B20', 'C50', 'I21']
patient_1_diagnosis = [0, 1, 0, 0, 1]  # A01, I21 진단

자율주행 차량 의사결정 시스템

도로 상황 인식을 위해 객체 카테고리를 인코딩한다.

# 도로 객체 카테고리
objects = ['차량', '보행자', '신호등', '정지 표지판', '장애물']

# 현재 인식된 객체들의 원-핫 인코딩
current_scene = [1, 1, 1, 0, 0]  # 차량, 보행자, 신호등 감지

기본이지만 여전히 기초인 이유

원-핫 인코딩은 범주형 데이터를 기계학습 모델에 적용하기 위한 필수적인 전처리 기법이다. 구현이 간단하고 직관적이라는 장점이 있지만, 고차원 벡터로 인한 효율성 문제와 의미적 관계 표현의 한계 때문에 Word2Vec, GloVe, BERT 등 다양한 임베딩 기법이 등장했다. 현대 AI 시스템에서는 원-핫 인코딩을 기본으로 하되 필요에 따라 고급 임베딩 기법을 혼합하는 하이브리드 접근법이 일반적이며, 대규모 언어 모델(LLM)의 등장으로 맥락을 고려한 동적 임베딩이 주목받는 지금도 원-핫 인코딩의 개념은 여전히 딥러닝 모델의 기초로 남아 있다.

원-핫 인코딩범주형 데이터벡터 표현Word2VecNLP