(Scikit-learn) Binary classification 평가

dcafplz·2022년 11월 13일
0

Scikit-learn

목록 보기
7/10
  1. 시각화

    1. 혼동행렬 시각화

      from sklearn.metrics import (confusion_matrix, ConfusionMatrixDisplay, plot_confusion_matrix)
      
      # 단순 행렬 조회
      confusion_matrix(y_train, pred_train)
      
      # 시각화1
      plot_confusion_matrix(dummy_model,
                           x_test, y_test,
                           display_labels=["Neg", "Pos"],
                           cmap='Blues')
      
      # 시각화2
      cm = confusion_matrix(y_test, pred_test)
      disp = ConfusionMatrixDisplay(cm, )
      disp.plot()
    2. Graphviz를 통한 tree구조 시각화
      https://velog.io/@dcafplz/Scikit-learn-Graphviz%EB%A5%BC-%ED%86%B5%ED%95%9C-tree%EA%B5%AC%EC%A1%B0-%EC%8B%9C%EA%B0%81%ED%99%94

  2. 평가

    from sklearn.metrics import accuracy_score, recall_score, precision_score, f1_score, confusion_matrix, ConfusionMatrixDisplay
    
    def print_metrics_classification(y, pred, title=None):
        """
        정답(target)과 모델이 추론한 값을 받아 정확도, 재현율, 정밀도, f1 점수를 출력
        [parameter]
            y: ndarray - 정답(target)
            pred: ndarray - 모델이 추론한 결과
            title: str - 출력할 내용의 title. 기본값: None = 출력안한다.
        [return value]
        [exception]
        """
        if title:
            print(title)
        print('정확도(accuracy):', accuracy_score(y, pred))
        print('재현율(recall):', recall_score(y, pred))
        print('정밀도(precision)', precision_score(y, pred))
        print('F1점수:', f1_score(y, pred))
    from sklearn.metrics import classification_report
    
    result = classification_report(y_train, pred_train_tree)
    print(result)
    • 정확도(Accuracy)
      모든 값에서 예측한 것 중 실제 값과 일치하는 비율
    • 정밀도(Precision)
      Positive(양성)으로 예측 한 것 중 실제 Positive(양성)인 비율
    • 재현률(Recall)
      실제 Positive(양성)인 것 중에 Positive(양성)로 예측 한 것의 비율
    • F1점수(F1 Score)
      정밀도와 재현률의 조화평균 점수
    1. PR Curve, AP score
      X축에 재현율, Y축에 정밀도를 놓고 임계값이 1 → 0 변화할때 두 값의 변화를 선그래프로 그린 곡선과, 그 면적을 더해 점수화 한 지표
       from sklearn.metrics import PrecisionRecallDisplay
       import matplotlib.pyplot as plt
       
       model_pos = model.predict_proba(x_test)[:,1]
       precisions, recalls, thresh = precision_recall_curve(y_test, model_pos)
       
       # PR Curve
       disp = PrecisionRecallDisplay(precisions, recalls)
       disp.plot()
       plt.show()
       
       # AP Score
       from sklearn.metrics import average_precision_score
       
       ap_score = average_precision_score(y_test, model_pos)
       disp = PrecisionRecallDisplay(precisions, recalls, average_precision=ap_score)
       disp.plot()
       plt.show()
    2. ROC, AUC score
      X축에 FPR(False Positive Rate-위양성율)(실제 음성중 양성으로 잘못 예측 한 비율)
      Y축에 TPR(True Positive Rate-재현율)(실제 양성중 양성으로 맞게 예측한 비율)
       from sklearn.metrics import roc_curve, RocCurveDisplay
       fprs, tprs, thresh = roc_curve(y_test, model_pos)
       
       from sklearn.metrics import roc_auc_score
       model_auc = roc_auc_score(y_test, model_pos)
       
       disp = RocCurveDisplay(fpr=fprs, tpr=tprs, roc_auc=model_auc, estimator_name='Model')
       disp.plot()
       plt.show()
  3. 임계값(Threshold) 변경을 통한 재현율, 정밀도 변환

    # 임계값에 따른 precision, recall 자동 배분해주는 함수
    from sklearn.metrics import precision_recall_curve
    
    precision_list, recall_list, threshold_list = precision_recall_curve(y_test, pred_test_proba[:,1])
    for thresh, pre, recall in zip(threshold_list, precision_list, recall_list):
        print(round(thresh, 3), round(pre, 3), round(recall, 3), sep='\t')
    # 시각화
    import matplotlib.pyplot as plt
    
    plt.figure(figsize=(8,7))
    plt.plot(threshold_list, precision_list, marker='o', label='정밀도')
    plt.plot(threshold_list, recall_list, marker='x', label='재현율')
    
    plt.grid(True)
    plt.legend(loc='upper left', bbox_to_anchor=(1,1))
    plt.show()

0개의 댓글