본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

원 핫 인코딩(One-hot encoding)은 범주형(categorical) 데이터를 머신 러닝 알고리즘에서 사용할 수 있도록 수치형 데이터로 변환하는 기법 중 하나이다. 각 범주를 이진 벡터의 고유한 위치에 1로 표시하고, 나머지는 0으로 처리하여 범주 간의 순서 또는 크기 의미를 제거한다.

범주형 데이터는 대부분 문자열로 표현되며, 모델 학습에 직접 사용할 수 없다. 이를 해결하기 위해 원 핫 인코딩을 적용하면 각 범주는 서로 독립적인 이진 변수로 변환되므로, 범주 간의 잘못된 거리 정보를 피할 수 있다.

  • 예: '사과', '바나나', '포도' 세 가지 범주가 있을 때
    • 사과 → [1, 0, 0]
    • 바나나 → [0, 1, 0]
    • 포도 → [0, 0, 1]
  • 범주 수만큼 차원이 증가
  • 범주 간 순서나 우선순위가 포함되지 않음
  • 희소 행렬(sparse matrix)을 생성함

pandas를 사용한 예시

편집 원본 편집
import pandas as pd

df = pd.DataFrame({'과일': ['사과', '바나나', '사과', '포도']})
encoded = pd.get_dummies(df['과일'])
print(encoded)

scikit-learn을 사용한 예시

편집 원본 편집
from sklearn.preprocessing import OneHotEncoder

encoder = OneHotEncoder(sparse=False)
X = [['사과'], ['바나나'], ['사과'], ['포도']]
encoded = encoder.fit_transform(X)
print(encoded)
  • 범주형 데이터를 정량적으로 표현 가능
  • 범주 간 불필요한 순서를 부여하지 않아 모델의 오해를 방지
  • 대부분의 머신 러닝 모델에서 효율적으로 사용됨
  • 범주의 수가 많을 경우 차원이 급격히 증가 (차원의 저주)
  • 희소 행렬로 인해 메모리 비효율 발생 가능
  • 테스트 데이터에 훈련 데이터에 없던 범주가 등장하면 에러 발생 가능
  • Label Encoding – 범주를 정수값으로 변환하나, 순서가 부여되어 잘못된 해석 가능
  • Binary Encoding – 차원 수를 줄이기 위해 각 범주를 2진수로 인코딩
  • Target Encoding – 범주의 통계값(예: 평균)을 대신 사용

범주형 인코딩 기법 비교

편집 원본 편집

범주가 k 개인 변수를 수치로 바꾸는 주요 기법을 비교하면 다음과 같다.

기법 방법 만들어지는 열 특징
레이블 인코딩(Label Encoding) 각 범주를 0, 1, 2, … 정수에 대치한다 1개 없는 순서·크기가 생겨 선형 모형이 오해할 수 있다. 트리 계열 모형이나 순서가 있는 변수에 알맞다
원 핫 인코딩 범주마다 열을 만들고 해당 열만 1 로 표시한다 k 개 순서 정보가 없다. 대부분이 0 인 희소(sparse) 데이터가 되고, 범주가 많으면 차원이 크게 늘어난다
바이너리 인코딩(Binary Encoding) 레이블 인코딩한 정수를 2진수로 바꿔 자릿수마다 열을 만든다 약 log₂k 개 원 핫보다 열이 훨씬 적어 메모리를 덜 쓰고 학습이 빠르다
타깃 인코딩(Target Encoding, 평균 인코딩) 범주마다 종속변수(타깃) 값의 평균으로 대치한다 1개 범주가 매우 많을 때 유용하다. 타깃 정보가 입력에 새어 들어가 과적합되기 쉬워 교차 검증 방식으로 계산하거나 전체 평균 쪽으로 평활화한다
빈도 인코딩(Frequency Encoding) 범주의 출현 횟수나 비율로 대치한다 1개 빈도가 같은 범주는 구분되지 않는다
  • 타깃 인코딩은 종속변수의 평균을 쓴다. "종속변수 값들의 표준편차를 활용한다" 는 틀리다.
  • 원 핫 인코딩 결과는 희소 데이터다. 바이너리 인코딩은 같은 범주를 훨씬 적은 열로 나타내므로 원 핫 인코딩보다 모델 학습 속도가 빠르다.