반응형

핸즈 온 머신러닝 (Hands-On Machine Learning with Scikit-Learn & TensorFlow) / 오렐리앙 제론 지음 , 박해선 옮김

을 읽고, 추후 기억을 되살릴 수 있게끔 나만의 방법으로 내용을 리뷰한다. 따라서 리뷰의 내용 별 비중이 주관적일 수 있다.


챕터 3. 분류

 

일반적인 지도 학습 중 2장에서 회귀를 다루었다면 3장에서는 분류를 다룬다.

3.1 MNIST

머신러닝을 공부할 때 많은 경우에 MNIST 데이터셋 분류하기로 공부를 시작한다. 이 데이터셋은 7만장의 28 by 28 이미지 파일로 이루어져 있으며 각각의 이미지 파일은 0 부터 9 까지의 숫자 중 하나를 뜻한다. sklearn.datasets 에 포함되어있다.

 

데이터는 dictionary 형태로 불러와지는데 'DESCR'에 데이터 설명, 'data'와 'target'에 X와 y 데이터가 들어있다. 각각의 데이터를 (28,28)으로 reshape한 후 plot시켜보면 이미지를 확인할 수 있다. 7만개의 데이터 중 뒤의 10000개가 테스트세트로 나누어져있다.

 

3.2 이진 분류기 훈련

숫자 5를 식별하는 binary classifier를 먼저 만들어 본다. 사용할 분류 모델은 SGD (Stochasti Gradient Descent)이다.

 

https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.SGDClassifier.html

 

sklearn.linear_model.SGDClassifier — scikit-learn 0.22.1 documentation

 

scikit-learn.org

from sklearn.linear_model import SGDClassifier

sgd_clf = SGDClassifier(max_iter=5, random_state=25)
sgd_clf.fit(X_train, y_train_5)

 

3.3 성능 측정

분류기 평가는 회귀모델 평가보다 훨씬 어렵고 다양하다.

 

3.3.1 교차 검증을 사용한 정확도 측정

https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.cross_val_score

 

sklearn.model_selection.cross_val_score — scikit-learn 0.22.1 documentation

 

scikit-learn.org

sklearn의 cross_val_score를 이용하여 예측기의 정확도를 판단할 수 있다. 그런데 이 데이터는 숫자 5가 아닐 확률이 90%이기 때문에 단순히 accuracy를 비교하는 것은 큰 의미를 가지지 못할 수 있다.

 

3.3.2 오차 행렬

따라서 분류기의 성능을 평가 할 때에 confusion matrix를 조사하는 것이 좋은 방법이다. 

https://scikit-learn.org/stable/modules/generated/sklearn.metrics.confusion_matrix

 

sklearn.metrics.confusion_matrix — scikit-learn 0.22.1 documentation

 

scikit-learn.org

confusion matrix의 행은 실제 클래스를 나타내고, 열은 예측한 클래스를 나타낸다.

 

위 예제의 경우 실제로 '1' class인데 '2' class로 분류되는게 1개있음을 알 수 있다.

 

특히 binary classifier에서 false negative / false positive / true negative / true positive 라는 용어를 사용하는데, true와 false는 분류의 정답 여부이고, positive와 negative는 예측 클래스의 음성/양성이다. 실제로 양성인 클래스를 음성으로 분류했다면 false negative가 되는 것이다.

 

이를 이용한 몇 가지 지표가 더 있다.

 

정밀도 (precision) : TP / (TP + FP)

- 양성이라고 예측한 것 중 정확도

 

재현율 (recall) : TP / (TP + FN)

- 실제 양성 중 정확도

 

3.3.3 정밀도와 재현율

정밀도와 재현율 모두 높으면 좋은 지표이지만 한 쪽만 높은 것은 경우에 따라 좋지 않을 수 있다. 따라서 둘을 조화평균한 F1 Score를 사용하기도 한다.

 

하지만 경우에 따라 재현율이 높은 경우여야 할 수도있고 정밀도가 높은 경우여야 할 수도 있다. 아쉽게도 둘 모두 높이는 것은 쉽지 않으므로 한 쪽을 상대적으로 포기해야하는데, 이를 정밀도/재현율 트레이드오프 라고 한다.

 

3.3.4 정밀도/재현율 트레이드오프

SGD Classifier는 결정 함수를 사용하여 샘플의 점수를 계산하고, 특정 값을 기준으로 class를 0 또는 1로 분류한다. 따라서 이 기준을 변화시킴에 따라 정밀도와 재현율이 변화할 수 있다. 기준을 엄격하게 할 수록 재현율은 항상 감소하지만, 정밀도는 대체로 증가할 뿐 항상 증가하지는 않는다.

predict() method 대신 decision_function() method를 호출하면 샘플의 점수를 얻을 수 있다. 

 

 

https://scikit-learn.org/stable/modules/generated/sklearn.metrics.precision_recall_curve.html

 

sklearn.metrics.precision_recall_curve — scikit-learn 0.22.1 documentation

 

scikit-learn.org

또한 샘플의 점수를 이용하여 precision recall curve를 그래프로 나타낼 수 있다.

 

3.3.5 ROC곡선

ROC Curve (receiver operating characteristic) 도 binary classifier에서 널리 사용하는 그래프이다. false positive rate에 대한 true positive rate의 그래프로, 실제 음성 중 양성으로 분류한 비율과 실제 양성 중 양성으로 분류한 비율의 그래프이다.

 

https://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_curve.html

 

sklearn.metrics.roc_curve — scikit-learn 0.22.1 documentation

 

scikit-learn.org

 

ROC curve는 항상 증가함수이고, 곡선 아래의 면적(AUC)이 넓을 수록 좋은 분류기라고 할 수 있다. 완전한 랜덤 분류기의 면적은 0.5이고 가장 이상적인 분류기의 면적은 1이다. roc_auc_score 함수를 사용하면 면적을 구할 수 있다.

 

만약 RandomForestClassifier의 AUC를 구하고 싶다면, 결정 함수 값을 구해야 하는데 랜덤포레스트 분류기의 경우 predict_proba() 로 분류 확률을 구하는 것이 좋다.

 

 

3.4 다중 분류

multiclass classifier는 여러 개의 class 중 하나로 구별하는 것이다. 이는 binary classifier로도 구현할 수 있는데, 숫자 별 이진분류기 10개를 훈련시켜 가장 높은 결정 점수를 클래스로 선택하는 방법이 OvA 전략이고, 서로 다른 두 숫자로 구별하는 이진분류기 45개를 훈련시켜 투표하는 방법이 OvO 전략이다. OvO 전략의 분류기 개수는 많지만 한 분류에 해당하는 데이터가 작다는 특징이 있다.

 

다중 클래스 분류 작업에 이진 분류 알고리즘을 선택하면 사이킷런이 자동으로 감지해 OvA 혹은 OvO를 적용한다. 다중 클래스 분류의 경우에도 사용하는 method는 거의 동일하다.

 

3.5 에러 분석

가능성이 높은 모델을 찾은 후 모델의 성능을 개선하는 방법 중 하나는 에러의 종류를 분석하는 것이다.

confusion matrix를 만든 후 이미지로 표현하면 어느 경우에 오차가 많이 나는지 시각화 할 수 있다. 이 때에 각 값을 행의 합으로 나눈 후 대각선을 제외하고 이미지로 표현하면 에러 비율을 더 잘 시각화할 수 있다. MNIST에서 8과 9의 경우 분류가 잘 안되고 있음을 알 수 있고, 3과 5가 서로 혼돈된다는 점을 알 수 있다. 실제로 3과 5의 이미지들을 표현해보면 구분하기 힘들어보이는데, 선형 모델인 SGD를 사용하여 이 점이 부각된 것이다.

 

 

3.6 다중 레이블 분류

multilabel classification은 얼굴 인식 분류기와 같이, 여러 개의 binary label을 출력하는 분류 문제이다. f1_score를 구할 때를 제외하고는 대부분 비슷하다. f1_score를 구할 때 label 별 가중치를 설정할 수 있다. 

 

https://scikit-learn.org/stable/modules/generated/sklearn.metrics.f1_score.html

 

sklearn.metrics.f1_score — scikit-learn 0.22.1 documentation

 

scikit-learn.org

 

3.7 다중 출력 분류

multioutput-multiclass classification 문제. 다중 레이블 분류에서 한 레이블이 다중 클래스가 될 수 있는 일반적인 문제이다. 

반응형