分類模型的效果評估
阿新 • • 發佈:2018-12-22
資料探勘建模中最後一步就是對模型進行效果評估,驗證模型的效能,讓你的模型具有說服力,本文對分類模型的評估做了彙總,並結合Sklearn講解如何繪製ROC曲線、PR曲線。
混淆矩陣
真正例TP(True Positive)、假負例FN(False Negative)
假正例FP(False Positive)、真負例TN(True Negative)
分類評價指標說明:
- 精準率(Precision)也稱查準率,表示模型預測結果為正樣本的樣例中,真實情況為正樣本的樣例所佔比例。
- 召回率(Recall)也稱查全率,表示真實情況為正樣本的樣例中,被模型預測為正樣本的比例。
- 準確率(Accuracy)表示模型預測準的樣例佔總樣本的比例。但是在實際建模中,很少使用這麼指標,因為在正樣本和負樣本不均衡時,假如正樣本950個,負樣本50個,這是隨意亂猜都為正樣本,準確率也可以的高達95%,因此在樣本分佈不均時,一般不看這個指標,而是採用F1指標。
- F1也稱F1_score,它是基於精準率和召回率的調和平均值。P指的是Precision,R指的是Recall
- Fβ對精準率和召回率設定不同的權重,區別對待,
當β>1時更看重召回率(查全率);當β<1時更看重精準率(查準率);當β=1時即為F1值。
- 真正例率TPR、假正例率FPR
- ROC_AUC表示ROC曲線下方的面積,橫軸FPR,縱軸TPR,這才是實際建模中經常使用的衡量分類模型的效果的指標。
- 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()