1. 程式人生 > >分類模型的效果評估

分類模型的效果評估

資料探勘建模中最後一步就是對模型進行效果評估,驗證模型的效能,讓你的模型具有說服力,本文對分類模型的評估做了彙總,並結合Sklearn講解如何繪製ROC曲線、PR曲線。

混淆矩陣
在這裡插入圖片描述
真正例TP(True Positive)、假負例FN(False Negative)
假正例FP(False Positive)、真負例TN(True Negative)
分類評價指標說明:

  1. 精準率(Precision)也稱查準率,表示模型預測結果為正樣本的樣例中,真實情況為正樣本的樣例所佔比例。
    precision= \frac{TP}{TP+FP}
  2. 召回率(Recall)也稱查全率,表示真實情況為正樣本的樣例中,被模型預測為正樣本的比例。
    在這裡插入圖片描述
  3. 準確率(Accuracy)表示模型預測準的樣例佔總樣本的比例。但是在實際建模中,很少使用這麼指標,因為在正樣本和負樣本不均衡時,假如正樣本950個,負樣本50個,這是隨意亂猜都為正樣本,準確率也可以的高達95%,因此在樣本分佈不均時,一般不看這個指標,而是採用F1指標。
    在這裡插入圖片描述
  4. F1也稱F1_score,它是基於精準率和召回率的調和平均值。P指的是Precision,R指的是Recall
    在這裡插入圖片描述
  5. Fβ對精準率和召回率設定不同的權重,區別對待,
    當β>1時更看重召回率(查全率);當β<1時更看重精準率(查準率);當β=1時即為F1值。
    在這裡插入圖片描述
  6. 真正例率TPR、假正例率FPR
    在這裡插入圖片描述
  7. ROC_AUC表示ROC曲線下方的面積,橫軸FPR,縱軸TPR,這才是實際建模中經常使用的衡量分類模型的效果的指標。
    在這裡插入圖片描述
  8. PR_AUC表示PR曲線下方的面積,橫軸Precision、縱軸Recall
    在這裡插入圖片描述
    9.以上指標針對二分類,判斷多分類指標時,使用以下方法:
  • 對各個混淆矩陣分別計算Precision和Recall,從而使用巨集精準率macro_precison、巨集召回率macro_recall、巨集F1 macro_F1
    在這裡插入圖片描述

    在這裡插入圖片描述
  • 對各混淆矩陣中對應元素(TP、FN、FP、TN)分別求平均值,從而使用微精準率micro_precison、微召回率micro_recall、微F1 micro_F1
    在這裡插入圖片描述
    在這裡插入圖片描述

利用Python畫ROC曲線

def draw_roc(y_test, prob_test_list, clf_name='None'):
    '''畫roc_auc曲線'''
    fpr0, tpr0, _ = roc_curve(y_test, prob_test_list[0])
    fpr1, tpr1, _ = roc_curve(y_test, prob_test_list[1])

    roc_auc0 = auc(fpr0, tpr0)
    roc_auc1 = auc(fpr1, tpr1)
    plt.title('ROC_AUC_CURVE')
    plt.plot(fpr0, tpr0, 'b', label='RF AUC = %0.2f' % roc_auc0)
    plt.plot(fpr1, tpr1, 'g', label='LR AUC = %0.2f' % roc_auc1)
    plt.legend(loc='lower right')
    plt.plot([0, 1], [0, 1], 'r--')
    plt.xlim([0, 1])
    plt.ylim([0, 1])
    plt.ylabel('True Positive Rate')
    plt.xlabel('False Positive Rate')
    plt.show()
    plt.savefig('../pic/%s_roc_auc.png' % clf_name)

畫K-Fold 的ROC曲線

def draw_k_fold_roc(X,Y,clf,clf_name):
    '''k折roc_auc曲線,X,Y為陣列ndarray格式'''
    cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=None)
    prob_list=[]
    label_list=[]
    for train, test in cv.split(X, Y):
        print(X[train])
        pred_prob=clf.fit(X[train],Y[train]).predict_proba(X[test])[:,1]
        prob_list.append(pred_prob)
        label_list.append(Y[test])

    plt.title('ROC_AUC_CURVE')
    for i in range(5):
        fpr, tpr, _ = roc_curve(label_list[i], prob_list[i])
        roc_auc = auc(fpr, tpr)
        plt.plot(fpr, tpr, i, label='%s AUC = %0.2f' % (clf_name,roc_auc),alpha=0.5)

    plt.legend(loc='lower right')
    plt.plot([0, 1], [0, 1], 'r--')
    plt.xlim([0, 1])
    plt.ylim([0, 1])
    plt.ylabel('True Positive Rate')
    plt.xlabel('False Positive Rate')
    plt.show()
    plt.savefig('../pic/%s_kfold_roc_auc.png' % clf_name)

利用Python畫PR曲線

def get_pr_roc_and_coords(model_list,X_train,y_train,X_test,y_test,save_dir):
    # 畫出訓練集和驗證集的AUC圖以及PR曲線圖
    pr_coord_all=pd.DataFrame()
    roc_coord_all=pd.DataFrame()
    model_reports=[]
    clf_confu_matrixs=[]
    for model_info in model_list:
        model=model_info.get('model')
        model_name=model_info.get('model_name')
        model_fullname=model_info.get('model_fullname')
        model.fit(X_train,y_train)

        # pred_train_label=model.predict(X_train)
        pred_train_prob=model.predict_proba(X_train)[:,1]
        pred_test_label=model.predict(X_test)
        pred_test_prob=model.predict_proba(X_test)[:,1]


        # 畫訓練集和驗證集的roc_auc圖
        plt.figure()
        fpr_train, tpr_train, thresholds_roc_train = roc_curve(y_train, pred_train_prob)
        fpr_test, tpr_test, thresholds_roc_test = roc_curve(y_test, pred_test_prob)
        roc_auc_train = auc(fpr_train, tpr_train)
        roc_auc_test = auc(fpr_test, tpr_test)

        plt.plot(fpr_train, tpr_train, lw=2, alpha=0.8, color="r",
                 label='(train AUC = %0.3f)' % (roc_auc_train))
        plt.plot(fpr_test, tpr_test, lw=2, alpha=0.8, color="b",
                 label='(validation AUC = %0.3f)' % (roc_auc_test))
        plt.plot([0, 1], [0, 1], linestyle='--', lw=2, color='r',
                 label='Reference Line', alpha=.8)
        plt.legend(loc="lower right")
        plt.xlim([0, 1])
        plt.ylim([0, 1])
        plt.xlabel('False Positive Rate')
        plt.ylabel('True Positive Rate')
        plt.title('%s ROC_curve'%model_fullname)
        plt.savefig(save_dir+'/%s_roc.png'%model_name)
        # plt.show()
        plt.close()


        # 畫訓練集和驗證集的pr曲線
        plt.figure()
        precision_train, recall_train, thresholds_pr_train = precision_recall_curve(y_train, pred_train_prob)
        precision_test, recall_test, thresholds_pr_test = precision_recall_curve(y_test, pred_test_prob)
        AP_train = average_precision_score(y_train, pred_train_prob)
        AP_test = average_precision_score(y_test, pred_test_prob)

        plt.plot(recall_test, precision_test, lw=2, alpha=0.8, color="b",
                 label='(validation set AUC = %0.3f)' % (AP_test))
        plt.plot(recall_train, precision_train, lw=2, alpha=0.8, color="r",
                 label='(train set AUC = %0.3f)' % (AP_train))
        plt.legend(loc="upper right")
        plt.xlim([0, 1])
        plt.ylim([0, 1])
        plt.xlabel('Recall')
        plt.ylabel('Precision')
        plt.title('%s PR_Curve'%model_fullname)
        plt.savefig(save_dir+'/%s_pr.png'%model_name)
        # plt.show()
        plt.close()