🧠 다중 품종 분류 이해하기
- 이미지 분류나 텍스트 분류 문제를 다루다 보면 두 개 이상의 클래스를 구분해야 하는 다중 분류(Multi-class Classification) 상황을 자주 만나게 됩니다.
- 예를 들어, 꽃의 종류를
setosa
,versicolor
,virginica
중 하나로 분류하거나, 손글씨 숫자(0~9)를 인식하는 문제 등에서 이런 방식이 사용됩니다.
이 글에서는 다중 분류를 제대로 이해하기 위해 꼭 알아야 할 세 가지 개념을 다룹니다:
- 🎯 원-핫 인코딩 (One-Hot Encoding)
- 🧠 소프트맥스 함수 (Softmax)
- 🔥 categorical_crossentropy 손실 함수
✅ 1. 원-핫 인코딩 (One-Hot Encoding)
다중 분류 문제에서는 정답(label)이 단일 숫자(예:
2
)로 되어 있으면 모델이 이를 제대로 해석하기 어렵습니다. 그래서 정답 벡터를 확실하게 표현하기 위해 원-핫 인코딩을 사용합니다.예: 클래스가 3개일 때
클래스 | 원-핫 인코딩 |
0 | [1, 0, 0] |
1 | [0, 1, 0] |
2 | [0, 0, 1] |
📌 이렇게 하면 모델의 출력값(예측 확률 분포)과 비교할 수 있는 동일한 구조의 벡터가 됩니다.
✅ 2. 소프트맥스 함수 (Softmax)
모델의 마지막 출력층에서는 클래스별 점수(logit)를 출력합니다. 이 점수를 확률 분포로 변환하기 위해 사용하는 것이 바로 소프트맥스 함수입니다.
소프트맥스는 모든 클래스에 대해 0~1 사이의 값을 출력하며, 합이 1이 되도록 정규화합니다.
공식:
softmax(zᵢ) = exp(zᵢ) / Σ exp(zⱼ)
예:
import numpy as np
logits = np.array([2.0, 1.0, 0.1])
probs = np.exp(logits) / np.sum(np.exp(logits))
print(probs) # [0.659, 0.242, 0.099] -> 다 합치면 1
📌 이렇게 하면 모델이 각 클래스에 대해 몇 % 확신하는지를 알 수 있습니다.
✅ 3. categorical_crossentropy 손실 함수
- 모델이 얼마나 틀렸는지를 측정하려면 손실 함수(loss function)가 필요합니다.
- 다중 분류에서 자주 사용하는 함수는 categorical_crossentropy입니다.
- 이 함수는 예측한 소프트맥스 확률 분포와 원-핫 인코딩된 정답 벡터 간의 차이를 계산합니다.
공식:
Loss = -Σ (y_trueᵢ * log(y_predᵢ))
예:
from tensorflow.keras.losses import categorical_crossentropy
y_true = [[0, 1, 0]]
y_pred = [[0.7, 0.2, 0.1]]
loss = categorical_crossentropy(y_true, y_pred)
print(loss.numpy()) # 약 1.609
📌 정답에 가까운 확률일수록 손실이 작아지며, 틀릴수록 손실이 커집니다.
✅ 전체 흐름 요약
- 정답 데이터를 원-핫 인코딩으로 변환
- 모델 출력층에 소프트맥스 함수 사용 → 각 클래스 확률 출력
- 손실 함수로 categorical_crossentropy 사용 → 예측 정확도 학습
🔧 실전 예: Keras 코드로 다중 품종 분류
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.utils import to_categorical
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
# 1. 데이터 준비
X, y = load_iris(return_X_y=True)
y_encoded = to_categorical(y) # 원-핫 인코딩
X_train, X_test, y_train, y_test = train_test_split(X, y_encoded, test_size=0.2)
# 2. 모델 설계
model = Sequential([
Dense(10, activation='relu', input_shape=(4,)),
Dense(3, activation='softmax') # 클래스 수 만큼 노드, softmax 활성화
])
# 3. 컴파일
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
# 4. 학습
model.fit(X_train, y_train, epochs=50, validation_data=(X_test, y_test))
✨ 마무리
다중 분류 모델을 설계할 때, 단순히 아키텍처만 고려해서는 안 됩니다.
입력 데이터의 인코딩 방식, 출력 함수, 손실 함수가 모두 함께 설계되어야 모델이 제대로 학습되고 평가될 수 있습니다.
- 원-핫 인코딩: 정답 형식
- 소프트맥스: 모델 출력 확률 변환
- categorical_crossentropy: 학습 기준
이 세 가지가 유기적으로 연결될 때, 모델은 정확하고 일반화 가능한 다중 분류 성능을 얻게 됩니다.
Share article