핸즈온머신러닝&딥러닝

MNIST 활용, 분류 3

threegopark 2021. 5. 27. 13:01
728x90

다중 분류

 

다중 분류기(다항 분류기) : 둘 이상의 클래스 구별

 

종류

  • SGD분류기, 랜덤 포레스트 분류기, 나이브 베이즈 분류기 등...
  • 이진 분류기 (로지스틱 회귀분류기 or 서포트 벡터 머신 분류기 등) 의 조합을 통해서 다중 분류가 가능하다.                             
  •  OvR (One - versus - rest) : 특정 숫자 하나만을 구분하는 이진 분류기 10개를 훈련시켜 10개의 클래스에서 "결정 점수가 가장 높은" 것을 선택하는 방식                                                                                                                                                                               
  •  OvO (One -versus - one) : 0과 1 구별, 1과 2 구별 등 각 숫자의 조합마다 이진 분류기 훈련시키는 방식 --> (N개의 클래스, 총 N*(N-1)/2개의 분류기 필요)

--> 다중 클래스 작업 시 이진 분류 알고리즘을 선택하면 자동으로 OvO 혹은 OvR 실행 (다중 분류기는 별도로 적용할 필요가 없음)

 

이진 분류기인 서포트 벡터 머신 활용

from sklearn.svm import SVC
svm_clf = SVC()
svm_clf.fit(X_train, y_train)
svm_clf.predict([some_digit])

--> 0에서 9까지의 원래 타깃 클래스(y_train)를 사용해 SVC훈련

--> OvO 전략을 사용해 10개의 이진 분류기를 훈련시키고 결정 점수를 얻어 가장 높은 점수를 가진 클래스 선택

 

some_digit_scores = svm_clf.decision_function([some_digit])
some_digit_scores

5번째 클래스의 결정 점수 (9.3132)가 가장 높음 --> 5를 예측하였음

np.argmax(some_digit_scores)

 

OvO 대신에 OvR 전략을 사용하도록 강제할 수 있음 (SVC 기반으로 OvR전략 사용하는 예제)

from sklearn.multiclass import OneVsRestClassifier

ove_clf = OneVsRestClassifier(SVC())
ove_clf.fit(X_train, y_train)
ove_clf.predict([some_digit])

 

 

다중 분류기 훈련 예제(SGD 분류기)

from sklearn.model_linear import SGDClassifier

sgd_clf = SGDClassifier(random_state = 42)
sgd_clf.fit(X_train, y_train)
sgd_clf.predict([some_digit])
sgd_clf.decision_function([some_digit])

--> 이진 분류와 다르게 ovo, ovr 설정하지 않아도 된다.

--> 5를 some_digit로 지정하였는데 3의 결정 점수가 높다... (실제 교재에서도 5와 3의 점수가 높았다.)

 

 

스케일링 및 교차 검증을 통한 분류기 평가

from sklearn.preprocessing import StandardScaler
import numpy as np
from sklearn.model_selection import cross_val_score

scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train.astype(np.float64))
cross_val_score(sgd_clf, X_train_scaled, y_train, cv = 3, scoring = "accuracy")

 

다중 분류기

from sklearn.neighbors import KNeighborsClassifier

y_train_large = (y_train >= 7)
y_train_odd = (y_train % 2 == 1)
y_multilabel = np.c_[y_train_large, y_train_odd]

knn_clf = KNeighborsClassifier()
knn_clf.fit(X_train, y_multilabel)

knn_clf.predict([some_digit])

--> 1. 큰 수(7,8,9) 인가? => 2. 홀수인가?  즉, 두 가지의 클래스를 동시에 판별하는 분류기이다.

--> 5에 대하여 1. 큰 수 인가? 는 False, 2. 홀수인가? 는 True로 정확하게 분류하였다.

 

 

'핸즈온머신러닝&딥러닝' 카테고리의 다른 글

모델 훈련 2(경사 하강법)  (0) 2021.06.01
모델 훈련 (수정 필요)  (0) 2021.05.30
MNIST 활용, 분류 2  (0) 2021.05.19
MNIST 활용, 분류  (0) 2021.05.18
캘리포니아 주택 가격 예측2  (0) 2021.05.16