다중 분류

다중 분류(Multinomial classifier)는 두 개 이상의 클래스를 분류한다. 다중 분류를 가능하게 하는 다양한 전략을 살펴보자.

  1. OvR(One-versus-the-Rest) 또는 OvA(One-versus-All): 이항(이진) 분류기 10개를 훈련해서 각 분류기의 결정 점수 중 가장 높은 것을 선택.
  2. OvO(One-versus-One): 0과 1 구별, 0과 2 구별 등과 같이 각 숫자의 조합마다 이진 분류기 훈련. 클래스가 N개라면 분류기는 $\frac{N \times (N-1)}{2}$ 개가 필요.

다중 클래스 분류에 이진 분류 알고리즘을 선택하면 사이킷런이 알고리즘에 따라 자동으로 OvR 또는 OvO를 선택한다. 물론 특정 전략을 사용하도록 설정할 수도 있다.


오류 분석

오차 행렬을 컬러 그래프로 나타내면 시각적 효과가 더해져 분석하기가 쉬워진다.

# 오차 행렬을 컬러 그래프로 나타내기
from sklearn.metrics import ConfusionMatrixDisplay
y_train_pred = cross_val_predict(sgd_clf, X_train_scaled, y_train, cv=3)
ConfusionMatrixDisplay.from_predictions(y_train, y_train_pred)
plt.show()



행과 열로 정규화를 할 수도 있고, 올바른 예측에 대한 가중치를 0으로 만들 수도 있다.


다중 레이블 분류

지금까지는 각 샘플이 하나의 클래스에만 할당되었다. 하지만 3명의 사람이 등장하는 사진에서 얼굴 인식 프로그램을 가동한다고 해보자. 하나의 샘플(사잔 한 장)마다 여러 개의 클래스(사람 A, 사람 B, 사람 C의 존재 여부)를 출력해야할 것이다. 이처럼 여러 개의 이진 꼬리표를 출력하는 분류 시스템을 다중 레이블 분류(Multilabel classification)라고 한다.

손글씨 예시에서는 숫자가 7 이상인지와 홀수인지를 동시에 판별하는 코드를 구현하였다. 분류기는 KNeighborsClassifier()를 사용하였다. 모든 분류기가 다중 레이블 분류를 지원하지는 않는다.

다중 레이블 분류를 지원하지 않는 분류기를 사용하고 싶다면 ClassifierChain 클래스를 사용하면 된다. 이 분류기의 아이디어는 먼저 레이블 하나 당 하나의 모델을 학습시키고, 그렇게 학습한 여러 모델들을 체인으로 연결해서 하나의 모델이 예측을 할 때 입력 특성과 앞 모델의 예측을 사용할 수 있도록 하는 것이다.


다중 출력 분류

다중 출력 분류(Multioutput classification)는 다중 레이블 분류에서 한 레이블이 다중 클래스가 될 수 있도록 일반화한 것이다. 앞서 예시로 본 얼굴 인식 프로그램으로 돌아간다면, 다중 출력 분류는 사람의 존재 여부와 더불어 그 사람의 인종이 무엇인지까지 구분하는 분류라고 할 수 있다.

손글씨 예시에서는 이미지의 노이즈를 감소시키는 코드를 구현하였다. 여러 픽셀이 모여 만들어지는 이미지는 픽셀당 한 레이블을 가진다고 할 수 있고, 각 픽셀(레이블)은 0~255까지의 픽셀 강도를 가지므로 다중 출력 분류의 예시로 적절하다.

자세한 구현 방법들은 코드를 참고하자.

코드 보러가기



별도의 출처 표시가 있는 이미지를 제외한 모든 이미지는 강의자료에서 발췌하였음을 밝힙니다.

댓글남기기