分类模型的效果评估

数据挖掘建模中最后一步就是对模型进行效果评估,验证模型的性能,让你的模型具有说服力,本文对分类模型的评估做了汇总,并结合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()
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值