명징직조지훈 2022. 10. 18. 00:54

다중 분류

둘 이상의 클래스 (0, 1, 2) 를 구별하기 위한 다중 분류

OvA one-versus-all OvR, one-versus-the-rest : 한 클래스만 구분하는 이진 분류기 n개의 분류기가 필요

OvO one-versus-one : 각 숫자의 조합마다 이진 분류기를 훈련시키는 것 n*(n-1)/2 개의 분류기가 필요

OvO 전략을 사용한 서포트 벡터 머신 분류기의 사용, decision_function() 메서드를 통해 샘플당 n개(3) 의 점수를 반환한다. 가장 높은 점수가 해당 클래스

서포트 벡터 머신 분류

서포트 벡터 머신 모델의 학습

from sklearn.svm import SVC
svm_clf = SVC()
svm_clf.fit(train_scaled, y_train)
svm_clf.predict(train_scaled)

SVD 분류 모델

확률적 경사 하강법 모델의 학습

from sklearn.linear_model import SGDClassifier

sgd_clf = SGDClassifier()
sgd_clf.fit(train_scaled, y_train)

결정 트리

from sklearn.tree import DecisionTreeClassifier

tree_clf = DecisionTreeClassifier()
tree_clf.fit(train_scaled, y_train)

결정 트리에서의 특성 중요도 확인

tree_clf.feature_importances_
>>>
array([0.05648488, 0.02086855, 0.00616249, 0.05811081, 0.00341367,
       0.        , 0.01886052, 0.09658933, 0.27716765, 0.11313937,
       0.01708945, 0.01441255, 0.01390808, 0.02761096, 0.01322437,
       0.        , 0.01768643, 0.22372224, 0.00440044, 0.0171482 ,
       0.        ])

각 모델들에 대한 교차 검증을 통한 확인

모델과, 레이블 데이터, 타겟 데이터와 검증 폴드의 개수를 입력받아 교차 검증 결과를 반환하는 간단한 함수 생성, 모델별 결과 확인

def cross_val (model, feature, target, cv):
  return cross_val_score(model, feature, target, cv=cv, scoring="accuracy")
  
svm_cross_score = cross_val(svm_clf, feature_train_scaled, target_train, 3)
svm_test_score = svm_clf.score(feature_test_scaled, target_test)

print(svm_cross_score, svm_test_score)
>>>
[0.90299824 0.91534392 0.90636042] 0.8943661971830986

sgd_cross_score = cross_val(sgd_clf, feature_train_scaled, target_train, 3)
sgd_test_score = sgd_clf.score(feature_test_scaled, target_test)

print(sgd_cross_score, sgd_test_score)
>>>
[0.86948854 0.89417989 0.90282686] 0.852112676056338

dt_cross_score = cross_val(tree_clf, feature_train_scaled, target_train, 3)
dt_test_score = tree_clf.score(feature_test_scaled, target_test)

print(dt_cross_score, dt_test_score)
>>>
[0.92239859 0.91887125 0.94169611] 0.9014084507042254

각 모델별 교차 검증 점수와 테스트 세트 점수를 확인할 수 있다.