
머신러닝 모델에 문자열 데이터를 넣을 수 없는 이유와, 변환하는 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)
역변환도 간단합니다. 키와 값을 뒤집은 딕셔너리를 만들면 됩니다.
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)
class_le.inverse_transform([0, 1])로 언제든 원래 레이블로 복원할 수 있습니다.class_le.classes_로 어떤 클래스가 있는지 확인할 수 있습니다.순서가 없는 데이터 — 원-핫 인코딩
color 열은 green, red, blue인데, 이 사이에 순서가 없습니다. 만약 green=1, red=2, blue=3으로 매핑하면 모델이 "blue(3)는 green(1)보다 3배 크다"고 잘못 해석할 수 있습니다.
이 문제를 해결하는 것이 원-핫 인코딩(One-Hot Encoding)입니다. 각 카테고리를 별도의 이진(0/1) 열로 만듭니다.
pd.get_dummies(df, columns=['color'])
green이면 [0, 1, 0], red이면 [0, 0, 1], blue이면 [1, 0, 0]이 됩니다.
숫자의 크기 비교가 불가능하므로 순서 문제가 해결됩니다.
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 등)도 지정할 수 있습니다.
어떤 인코딩을 써야 하는가?
순서 관계가 숫자로 보존됨
순서 없는 카테고리를 안전하게 변환
7편 핵심 정리
머신러닝 모델은 숫자만 처리할 수 있으므로, 문자열 데이터는 반드시 인코딩이 필요합니다.
순서형 데이터는 딕셔너리 매핑으로 순서를 보존하며 변환합니다.
명목형 데이터는 원-핫 인코딩으로 순서 없는 이진 벡터로 변환합니다.
다음 편에서는 숫자 데이터의 스케일을 맞추는 정규화, 표준화와 과적합을 방지하는 L1 규제를 다룹니다.
👉 8편: 정규화 vs 표준화, 그리고 L1 규제 — 데이터 스케일링의 모든 것
Min-Max 스케일링과 표준화의 차이, L1 규제가 가중치를 0으로 만드는 원리를 코드로 확인합니다.
머신러닝 밑바닥부터 구현하기 시리즈 [7편]
'정보 > IT 지식 정보' 카테고리의 다른 글
| 순차 후진 선택(SBS)으로최적의 특성 조합 찾기 [9편] (0) | 2026.03.30 |
|---|---|
| 정규화 vs 표준화, 그리고 L1 규제데이터 스케일링의 모든 것 [8편] (0) | 2026.03.30 |
| 결정 트리와 랜덤 포레스트란?트리 기반 분류 완전 정리 [6편] (0) | 2026.03.27 |
| SVM이란? 선형 SVM부터 커널 트릭까지 완전 정리 [5편] (0) | 2026.03.27 |
| scikit-learn으로 퍼셉트론과 로지스틱 회귀 구현하기 [4편] (0) | 2026.03.26 |
댓글