sklearn 모델 품질 측정하기

햄도·2021년 5월 10일
0

퓨쳐스킬 과제 수행중 헷갈리는 부분이 있었다. 모델의 품질을 평가할 때 어떤 것은 score 메소드로, 어떤것은 accuracy_score로, 어떤것은 confusion matrix로, 어떤것은 roc curve로 측정하는데 계산방법이나 인자가 조금씩 달라 정리해봤다.

score

먼저 모델의 품질을 평가할 때 각 모델에서 구현한 score 메소드를 사용할 수 있다. 이것은 모델에 따라 계산방식이 달라진다.

sklearn에서 주로 사용되는 인터페이스에는 estimator, predictor, transformer, model이 있고 한 클래스는 여러 인터페이스를 구현할 수 있다. 각각의 특징은 아래와 같다.

  • Estimator
    • base object로 fit 메소드를 구현한다.
  • Predictor
    • 지도학습이나 몇 비지도학습에서 predict 메소드를 구현한다.
    • 분류 알고리즘은 보통 predict_probadecision_function , 또는 두가지 모두를 구현해 예측값이 얼마나 확실한지를 제공하기도 한다.
  • Transformer
    • 데이터 전처리 시 사용할 수 있도록 transform 이나 fit_transform 을 제공한다.
  • Model
    • 얼마나 fit이 잘 되었는지 확인할 수 있도록 score 메서드를 구현한다.
  • 참고

score 메서드는 모델 인터페이스를 구현한 클래스에 존재하며, 모델이 얼마나 잘 훈련되었는지, 처음 보는 데이터에 대해 얼마나 예측을 잘 수행할 수 있는지 판단할 수 있도록 구현한 메서드이고 점수가 높을수록 좋다.

sklearn.metrics.accuracy_score, precision_score, recall_score, f1_score

  • 정답 label과 예측한 label을 받아 각 점수를 반환한다.
  • multilabel 분류에서 사용하는 경우, 정답 label과 예측한 label이 정확하게 일치하는 경우에만 맞는것으로 처리한다.
  • GridSearchCV나 cross_val_score 사용 시 모델의 성능을 평가하기 위한 scoring parameter로 전달할 수도 있다.

sklearn.metrics.confusion_matrix

  • 정답 label과 예측한 label을 받아 confusion matrix를 반환한다.
  • binary case에서 tn, fp, fn, tp 등을 계산하기 위해 다음과 같이 사용할 수도 있다.
    tn, fp, fn, tp = confusion_matrix(y_test, y_pred).ravel()

sklearn.metrics.precision_recall_curve

  • 정답과 예측 확률을 인자로 받아 threshold, precision, recall에 해당하는 세 개의 array을 반환한다.
  • precision과 recall값은 plot했을때 그래프가 항상 y축에서 시작하도록 하기 위해 맨 마지막에 각각 1, 0이 붙는다.

sklearn.metrics.average_precision_score

  • 정답과 예측 확률을 인자로 받아 avaerage precision을 반환한다.
  • precision-recall 그래프 선 아래쪽의 면적을 계산하는 방법으로, 두 알고리즘의 성능을 정량적으로 비교할 수 있다.
  • precision: 양성이라 예측한 것 중 실제 양성인것의 비율, TP/(TP+FP)
  • recall: 실제 양성인것중 양성이라 예측한것의 비율, TP/(TP+FN), tpr과 같다

sklearn.metrics.roc_curve

  • 정답과 예측 확률을 인자로 받아 fpr, tpr, threshold에 해당하는 세 개의 array를 반환한다.
  • fpr: 실제 음성인데 양성이라고 잘못 예측된 비율, FP/(TN+FP), 이때 TN+FP는 negative 의미
  • tpr: 실제 양성이고 양성이라고 잘 예측된 비율, TP/(TP+FN), 이때 TP+FN은 positive 의미
  • precision과 recall은 fpr과 tpr처럼 비례하지 않는다.
  • roc_curve: fpr과 tpr 둘다 양성을 많이 예측할수록 높아지기 때문에 비례한다. FPR 대비 TPR이 좋게 나오도록 해야하는데, 즉 이 fpr과 tpr로 curve를 그렸을 때 curve 아래 면적이 클수록 좋으며 (fpr이 조금만 높아져도 tpr이 큰폭으로 오름) 이것을 시각적으로 확인하기 위해 roc_curve를 이용한다.

sklearn.metrics.auc

  • curve의 좌표를 받아 curve 아래 면적(area under the curve)을 계산하는 일반적인 메소드이다.
    • roc_auc_score를 이용해 roc_curve 아래의 면적을 계산할수도 있고, 아래와 같이 aucroc_curve 에서 반환된 fpr, tpr을 전달해도 된다.
        fpr, tpr, t = roc_curve(y_test, pred[:, 1])
        auc = auc(fpr, tpr)
  • average_precision_score와는 다르다. recall과 precision을 전달한다고 똑같은 결과가 나오지 않는다. average_precision_score는 각 threshold에서 recall의 변화량을 weight로 하여 precision의 가중평균을 계산한다.

그래서 뭐가 다른가?

score 메소드는 테스트셋과 정답을 넘기면 모델이 알아서 계산해주니 헷갈릴 것도 없었지만 sklearn의 metrics 모듈 안에 있는 함수들은 어떤 인자를 넣어줘야 하는지가 헷갈렸다.

정리해보니 confusion matrix, precision, recall 등 label 정답과 오답을 판단해 점수를 내는 지표들은 predict의 결과 label을 받는다. 반면 precision_recall_curve나 roc_curve등 threshold에 따라 달라지는 점수를 보고싶은 경우 predict_proba의 결과로 나온 확률을 인자로 넘겨야 한다.

참고

profile
developer hamdoe

0개의 댓글