다중 품종 분류 (Multi-class Classification)

KangHo Lee's avatar
Jun 20, 2025
다중 품종 분류 (Multi-class Classification)

🧠 다중 품종 분류 이해하기

  • 이미지 분류나 텍스트 분류 문제를 다루다 보면 두 개 이상의 클래스를 구분해야 하는 다중 분류(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
📌 정답에 가까운 확률일수록 손실이 작아지며, 틀릴수록 손실이 커집니다.

✅ 전체 흐름 요약

  1. 정답 데이터를 원-핫 인코딩으로 변환
  1. 모델 출력층에 소프트맥스 함수 사용 → 각 클래스 확률 출력
  1. 손실 함수로 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

devleekangho