원핫 인코딩(One-Hot Encoding)
머신러닝이나 딥러닝을 공부하다 보면 자주 접하게 되는 개념 중 하나가 원핫 인코딩(One-Hot Encoding)입니다. 데이터 전처리 단계에서 범주형 데이터를 숫자로 바꿔야 할 때 유용하게 사용되죠. 이 글에서는 원핫 인코딩이 무엇인지, 왜 필요한지, 그리고 어떻게 디코딩하는지까지 한 번에 정리해드립니다.
원핫 인코딩이란?
원핫 인코딩(One-Hot Encoding)은 범주형 데이터를 이진 벡터(binary vector)로 표현하는 방법입니다.
예를 들어, 다음과 같은 카테고리가 있다고 해봅시다:
['사과', '바나나', '포도']
이를 원핫 인코딩하면 아래와 같이 표현됩니다:
과일 | 원핫 벡터 |
---|---|
사과 | [1, 0, 0] |
바나나 | [0, 1, 0] |
포도 | [0, 0, 1] |
즉, 하나의 값만 1이고 나머지는 0인 벡터로 표현하는 것이 특징입니다.
왜 원핫 인코딩을 사용할까?
기계는 문자열을 이해하지 못하므로, 문자열을 숫자 또는 벡터 형태로 변환해야 합니다. 예를 들어 "사과 = 1, 바나나 = 2, 포도 = 3"처럼 숫자로만 바꾸면, 기계는 이 숫자들 사이에 '순서'나 '크기'가 있다고 오해할 수 있습니다. 이럴 경우 학습에 부정적인 영향을 줄 수 있습니다.
하지만 원핫 인코딩은 모든 카테고리를 동등하게 표현해주기 때문에 이런 문제를 방지할 수 있습니다.
디코딩
원핫 인코딩된 데이터를 다시 원래의 값으로 되돌리는 작업을 디코딩이라고 합니다.
예를 들어 [0, 1, 0]
이라는 벡터가 주어졌을 때, 이것이 '바나나'라는 것을 알아내는 과정이죠.
디코딩 방법은 간단합니다:
- 벡터에서
1
이 있는 인덱스를 찾는다. - 그 인덱스에 해당하는 카테고리 값을 불러온다.
파이썬 코드로 예를 들어보면 다음과 같습니다:
categories = ['사과', '바나나', '포도']
one_hot = [0, 1, 0]
index = one_hot.index(1)
decoded = categories[index]
print(decoded) # 바나나
실무에서는 어떻게 쓰일까?
- 텍스트 분류
- 이미지 레이블링
- 챗봇에서 사용자 의도 분류
- 음성 인식에서 단어 분류
등 다양한 분야에서 원핫 인코딩은 필수적으로 활용됩니다.
주의할 점
- 차원이 커질 수 있음: 카테고리 개수가 많아지면 벡터 차원이 커져 메모리 낭비가 발생할 수 있습니다.
- 이런 경우에는
Label Encoding
,Embedding
등의 다른 방법을 고려해볼 수 있어요.
마무리
원핫 인코딩은 범주형 데이터를 벡터로 바꾸는 매우 직관적이고 강력한 방법입니다.
디코딩 역시 간단하지만, 항상 카테고리의 순서 정보를 같이 관리해야 정확하게 역변환할 수 있어요.
'AI > Machine Learning' 카테고리의 다른 글
머신러닝에서 L1, L2 규제 (0) | 2025.04.13 |
---|---|
분류 vs 회귀 모델 평가 지표 (2) | 2025.04.13 |
머신러닝에서의 정규화(Regularization) (0) | 2025.04.09 |
데이터 변환 (0) | 2025.04.08 |
로그(log)와 지수(exp)의 관계 (1) | 2025.04.08 |