数据挖掘建模中最后一步就是对模型进行效果评估,验证模型的性能,让你的模型具有说服力,本文对分类模型的评估做了汇总,并结合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()