본문 바로가기
정보/IT 지식 정보

범주형 데이터 인코딩이란?매핑부터 원-핫 인코딩까지 완전 정리 [7편]

by 안다니. 2026. 3. 27.
반응형
데이터 인코딩

 

머신러닝 모델에 문자열 데이터를 넣을 수 없는 이유와, 변환하는 3가지 방법을 다룹니다

시리즈: 머신러닝 밑바닥부터 구현하기
1~6편: 퍼셉트론 → ADALINE → SGD → 로지스틱 회귀 → SVM → 결정 트리
7편: 범주형 데이터 인코딩 · 8편: 스케일링과 규제 · 9편: 특성 선택

왜 인코딩이 필요한가?

머신러닝 모델은 숫자만 이해합니다. "green", "red", "blue" 같은 문자열이나 "M", "L", "XL" 같은 범주형 데이터는 그대로 넣을 수 없습니다. 이런 데이터를 숫자로 변환하는 과정을 인코딩(encoding)이라고 합니다.

간단해 보이지만, 변환 방법을 잘못 선택하면 모델이 엉뚱한 패턴을 학습할 수 있습니다. 이번 편에서는 상황에 맞는 올바른 인코딩 방법을 다룹니다.

실습에 사용할 예시 데이터를 먼저 만들어봅니다.

df = pd.DataFrame([
    ['green', 'M',  10.1, 'class2'],
    ['red',   'L',  13.5, 'class1'],
    ['blue',  'XL', 15.3, 'class2']])
df.columns = ['color', 'size', 'price', 'classlabel']
color size price classlabel
green M 10.1 class2
red L 13.5 class1
blue XL 15.3 class2

여기서 color, size, classlabel은 문자열이라 모델에 바로 넣을 수 없습니다. 각각 성격이 다르기 때문에 인코딩 방법도 달라야 합니다.

순서가 있는 데이터 — 딕셔너리 매핑

size 열은 M < L < XL이라는 순서가 있습니다. 이런 데이터를 순서형(ordinal) 데이터라고 합니다. 순서 관계를 유지하면서 숫자로 바꿔야 합니다.

매핑 딕셔너리 생성
size_mapping = {'XL': 3, 'L': 2, 'M': 1}
df['size'] = df['size'].map(size_mapping)
변환 결과
M → 1, L → 2, XL → 3으로 변환됩니다. 숫자의 크기 관계가 원래 데이터의 순서를 반영합니다.

역변환도 간단합니다. 키와 값을 뒤집은 딕셔너리를 만들면 됩니다.

inv_size_mapping = {v: k for k, v in size_mapping.items()}
df['size'].map(inv_size_mapping)
# 1 → M, 2 → L, 3 → XL

클래스 레이블 인코딩 — LabelEncoder

classlabel 열은 분류 대상(타깃)입니다. class1, class2 같은 문자열을 0, 1로 바꿔야 합니다. 직접 딕셔너리를 만들 수도 있지만, scikit-learn의 LabelEncoder를 쓰면 더 편합니다.

from sklearn.preprocessing import LabelEncoder

class_le = LabelEncoder()
df['classlabel'] = class_le.fit_transform(df['classlabel'].values)
변환 결과
class1 → 0, class2 → 1로 자동 매핑됩니다.
class_le.inverse_transform([0, 1])로 언제든 원래 레이블로 복원할 수 있습니다.
class_le.classes_로 어떤 클래스가 있는지 확인할 수 있습니다.

순서가 없는 데이터 — 원-핫 인코딩

반응형

color 열은 green, red, blue인데, 이 사이에 순서가 없습니다. 만약 green=1, red=2, blue=3으로 매핑하면 모델이 "blue(3)는 green(1)보다 3배 크다"고 잘못 해석할 수 있습니다.

순서 없는 데이터에 숫자 매핑을 쓰면 안 되는 이유: 모델이 숫자의 크기 관계를 학습합니다. green=1, red=2, blue=3이면 "red는 green과 blue의 중간"이라는 관계가 만들어지지만, 색상에는 그런 순서가 없습니다.

이 문제를 해결하는 것이 원-핫 인코딩(One-Hot Encoding)입니다. 각 카테고리를 별도의 이진(0/1) 열로 만듭니다.

Pandas get_dummies
pd.get_dummies(df, columns=['color'])
변환 결과
color 열 하나가 color_blue, color_green, color_red 세 개의 열로 바뀝니다.
green이면 [0, 1, 0], red이면 [0, 0, 1], blue이면 [1, 0, 0]이 됩니다.
숫자의 크기 비교가 불가능하므로 순서 문제가 해결됩니다.
scikit-learn OneHotEncoder
from sklearn.preprocessing import OneHotEncoder

class_ohe = OneHotEncoder()
class_ohe.fit_transform(y).toarray()
# array([[0., 1.],   ← class2
#        [1., 0.],   ← class1
#        [0., 1.]])  ← class2

scikit-learn의 OneHotEncoder는 파이프라인에 통합하기 좋고, dtype 파라미터로 출력 타입(float, int 등)도 지정할 수 있습니다.

어떤 인코딩을 써야 하는가?

순서형 데이터 (M < L < XL) → 딕셔너리 매핑 또는 OrdinalEncoder
순서 관계가 숫자로 보존됨
명목형 데이터 (red, green, blue) → 원-핫 인코딩 (get_dummies / OneHotEncoder)
순서 없는 카테고리를 안전하게 변환
클래스 레이블은?
타깃(y)은 LabelEncoder로 간단히 정수 변환하면 됩니다. 대부분의 scikit-learn 분류 모델은 정수 레이블을 기대합니다. 원-핫 인코딩은 주로 특성(X)에 사용합니다.

7편 핵심 정리

머신러닝 모델은 숫자만 처리할 수 있으므로, 문자열 데이터는 반드시 인코딩이 필요합니다.

순서형 데이터는 딕셔너리 매핑으로 순서를 보존하며 변환합니다.

명목형 데이터는 원-핫 인코딩으로 순서 없는 이진 벡터로 변환합니다.

다음 편에서는 숫자 데이터의 스케일을 맞추는 정규화, 표준화와 과적합을 방지하는 L1 규제를 다룹니다.

다음 글 예고
👉 8편: 정규화 vs 표준화, 그리고 L1 규제 — 데이터 스케일링의 모든 것
Min-Max 스케일링과 표준화의 차이, L1 규제가 가중치를 0으로 만드는 원리를 코드로 확인합니다.

머신러닝 밑바닥부터 구현하기 시리즈 [7편]

반응형

댓글