Python构建xgboost模型-auc模型验证,判黑、判白生产阈值确定

本文详细介绍了AUC(AreaUnderCurve)模型评估在二值分类中的重要性,以及如何通过ROC曲线展示模型性能。同时,讨论了实际应用中如何确定判黑和判白的阈值,以达到高准确率和合理覆盖率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、auc模型评估

        评价二值分类器的指标很多,比如precision、recall、F1 score、P-R曲线等。但这些指标或多或少只能反映模型在某一方面的性能。相比而言,ROC曲线则有很多优点,经常作为评估二值分类器最重要的指标之一。

        ROC曲线(Receiver Operating Characteristic Curve)中文名为“受试者工作特征曲线”:

        横坐标:假阳性率(False Positive Rare)

        FPR = \frac{FP}{FP+TN} = \frac{FP}{N}

        其中FP是N个负样本中被分类器预测为正样本的个数,N是真实的负样本的数量

        纵坐标:真阳性率(Ture Positive Rare)

        TPR = \frac{TP}{TP+FN} = \frac{TP}{P}

        其中TP是P个正样本中被分类器预测为正样本的个数,P是真实的正样本的数量

        

        AUC(Area Under Curve)被定义为ROC曲线下的面积,显然这个面积的数值不会大于1。

又由于ROC曲线一般都处于y=x这条直线的上方,所以AUC的取值范围在0.5和1之间。

        使用AUC值作为评价标准是因为很多时候ROC曲线并不能清晰的说明哪个分类器的效果更好,而作为一个数值,对应AUC更大的分类器效果更好。AUC越大,说明分类器越可能把真正的正样本排在前面,分类性能越好。

       画auc的代码案例:

def model_metrics(clf_model, x, y):
    '''
    clf_model为训练的模型
    x为训练或验证模型时的x指标
    y为训练或验证模型时的y指标
    '''
    y_predict = clf_model.predict(x)
    y_prob = clf_model.predict_proba(x)[:,1]
    fpr,tpr,_ = roc_curve(y, y_prob, pos_label=1)
    # 计算模型相关评估指标并输出
    metrics = {'AUC':auc(fpr, tpr),'KS':max(tpr-fpr),
               'f1':f1_score(y, y_predict),'P':precision_score(y, y_predict),'R':recall_score(y, y_predict)
              }
    # 计算auc值
    roc_auc = auc(fpr, tpr)
    # 画ROC曲线
    plt.plot(fpr, tpr, 'k--', label='ROC (area = {0:.2f})'.format(roc_auc), lw=2)
    # 设置x、y轴的上下限,以免和边缘重合,更好的观察图像的整体
    plt.xlim([-0.05, 1.05])         
    plt.ylim([])
    plt.xlabel('False Positive Rate')
    plt.ylabel('True Positi-0.05, 1.05ve Rate')         
    plt.title('ROC Curve')
    plt.legend(loc="lower right")
    return metrics

        输出结果范例:

# 结果输出代码
print('train',model_metrics(clf_model, model_train_x, model_train_y))
print('test',model_metrics(clf_model, model_test_x, model_test_y))

# 最终打印的结果
train {'AUC': 0.7448060698987978, 'KS': 0.34680829553474385, 'f1': 0.44916101789087676, 'P': 0.49570762815795927, 'R': 0.41060544494108087}
test {'AUC': 0.7028704576433618, 'KS': 0.33433224615156487, 'f1': 0.32562399816807874, 'P': 0.3744075829383886, 'R': 0.2880875202593193}

roc趋势图:

二、实际应用时判黑、判白阈值的确定

        主要是通过模型预测出每个数据y的预测值,同时与y的实际值进行比较,计算判黑、判白阈值确定时的对应准确率、覆盖率,然后根据实际生产的需要选择合理的阈值。

1、判黑阈值确定

def predict_data_threshold_black_get(clf_model, predict_data, index, y):
    '''
    clf_model: 表示模型
    predict_data:训练或者测试数据的x指标
    index: 每列数据的行标签
    y : 每列数据的真实y值,与预测值进行比较
    '''
    # 模型预测每个y标签
    x_prob = clf_model.predict_proba(predict_data)
    pos_prob = []
    neg_prob = []
    # 获取每列数据正负标签预测概率
    for single_prob in x_prob:
        pos_prob.append(single_prob[0])
        neg_prob.append(single_prob[1])
    # 获取预测表
    predict_data_black_result = pd.DataFrame({
        'index': index,
        'pos_prob': pos_prob,
        'neg_prob': neg_prob,
        'true_y': y
    })
    
    # 阈值计算
    threshod_list = [0.85,0.84,0.83,0.82,0.81,0.80,0.79,0.78,0.77,0.76,0.75,0.74,0.73,0.72,0.71,0.70,0.68,0.66,0.64,0.62,0.60,0.58,0.56]
    # 基于可能设置的阈值遍历拿到所有的评估指标(主要每个阈值下都需要有正、负数据,否则报错)
    for threshod_single in threshod_list:
        result_value = predict_data_black_result[predict_data_black_result['neg_prob'] > threshod_single][[
                       'docuno','is_invergt_case']].groupby(['is_invergt_case']).count()
        # 总实际判黑占比
        black_ratio = len(predict_data_black_result[predict_data_black_result['is_invergt_case']==1])/len(predict_data_black_result)
        print('判黑阈值:', threshod_single,'阈值下判黑准确率:', result_value['docuno'][1]/(result_value['docuno'][0]+result_value['docuno'][1]),
              '阈值下判灰转判黑率:', result_value['docuno'][1]/len(predict_data_black_result), '总的判黑占比:', black_ratio)
    return predict_data_black_result
    

2、判白阈值确定

   和确定判黑阈值性质一致,主要区别在于阈值设定相反

# 判白情况统计
def predict_data_threshold_white_get(clf_model, predict_data, index, y):
    x_prob = model.predict_proba(predict_data)
    pos_prob = []
    neg_prob = []
    for single_prob x_prob:
        pos_prob.append(single_prob[0])
        neg_prob.append(single_prob[1])
    # 获取预测表
    predict_data_white_result = pd.DataFrame({
        'index': index,
        'pos_prob': pos_prob,
        'neg_prob': neg_prob,
        'y': y
    })
    
    # 阈值计算
    threshod_list = [0.03,0.04,0.05,0.055,0.06,0.07,0.08,0.09,0.1,0.11,0.12,0.13,0.14,0.15,0.16,0.17,0.18,0.19,0.2,0.21,0.22,0.23,0.24,0.25,0.26,0.27,0.28,0.29,0.3]
    for threshod_single in threshod_list:
        # 注意该处时小于阈值
        result_value = predict_data_white_result[predict_data_white_result['neg_prob'] < threshod_single][[
                       'docuno','is_invergt_case']].groupby(['is_invergt_case']).count()
        # 总实际判白占比
        white_ratio = len(predict_data_white_result[predict_data_white_result['is_invergt_case']==0])/len(predict_data_white_result)
        print('判白阈值:', threshod_single,'阈值下判白准确率:', result_value['docuno'][0]/(result_value['docuno'][0]+result_value['docuno'][1]),
              '阈值下判灰转判白率:', result_value['docuno'][0]/len(predict_data_white_result), '总的判白占比:',white_ratio)
    return predict_data_white_result
    

3、判白阈值确定范例

# 阈值确定相关指标输出范例
判白阈值: 0.03 阈值下判白准确率: 0.9984375 阈值下判灰转判白率: 0.12994407727503812 总的判白占比: 0.856532791052364
判白阈值: 0.04 阈值下判白准确率: 0.9976539589442815 阈值下判灰转判白率: 0.17295373665480426 总的判白占比: 0.856532791052364
判白阈值: 0.05 阈值下判白准确率: 0.9973586899101955 阈值下判灰转判白率: 0.19196746314184038 总的判白占比: 0.856532791052364
判白阈值: 0.055 阈值下判白准确率: 0.9969356486210419 阈值下判灰转判白率: 0.19847483477376715 总的判白占比: 0.856532791052364
判白阈值: 0.06 阈值下判白准确率: 0.9961240310077519 阈值下判灰转判白率: 0.2090493136756482 总的判白占比: 0.856532791052364
判白阈值: 0.07 阈值下判白准确率: 0.9954853273137697 阈值下判灰转判白率: 0.22419928825622776 总的判白占比: 0.856532791052364
判白阈值: 0.08 阈值下判白准确率: 0.9948387096774194 阈值下判灰转判白率: 0.2351804778851042 总的判白占比: 0.856532791052364
判白阈值: 0.09 阈值下判白准确率: 0.9946743138058173 阈值下判灰转判白率: 0.24687341128622267 总的判白占比: 0.856532791052364
判白阈值: 0.1 阈值下判白准确率: 0.9929105947223317 阈值下判灰转判白率: 0.2563294356888663 总的判白占比: 0.856532791052364
判白阈值: 0.11 阈值下判白准确率: 0.9924156238149412 阈值下判灰转判白率: 0.2660904931367565 总的判白占比: 0.856532791052364
判白阈值: 0.12 阈值下判白准确率: 0.9918729220539343 阈值下判灰转判白率: 0.2730045754956787 总的判白占比: 0.856532791052364
判白阈值: 0.13 阈值下判白准确率: 0.9906642728904848 阈值下判灰转判白率: 0.28052872394509404 总的判白占比: 0.856532791052364
判白阈值: 0.14 阈值下判白准确率: 0.9898352611286365 阈值下判灰转判白率: 0.2871377732587697 总的判白占比: 0.856532791052364
判白阈值: 0.15 阈值下判白准确率: 0.9889655172413793 阈值下判灰转判白率: 0.2916115912557194 总的判白占比: 0.856532791052364
判白阈值: 0.16 阈值下判白准确率: 0.9885096316323082 阈值下判灰转判白率: 0.2974072191154042 总的判白占比: 0.856532791052364
判白阈值: 0.17 阈值下判白准确率: 0.9880834160873883 阈值下判灰转判白率: 0.3035078800203355 总的判白占比: 0.856532791052364
判白阈值: 0.18 阈值下判白准确率: 0.9869451697127938 阈值下判灰转判白率: 0.3074733096085409 总的判白占比: 0.856532791052364
判白阈值: 0.19 阈值下判白准确率: 0.9855630413859481 阈值下判灰转判白率: 0.31235383833248603 总的判白占比: 0.856532791052364
判白阈值: 0.2 阈值下判白准确率: 0.9845279444269024 阈值下判灰转判白率: 0.3170310116929334 总的判白占比: 0.856532791052364
判白阈值: 0.21 阈值下判白准确率: 0.9831723278279838 阈值下判灰转判白率: 0.32079308591764105 总的判白占比: 0.856532791052364
判白阈值: 0.22 阈值下判白准确率: 0.9834050399508297 阈值下判灰转判白率: 0.3253685815963396 总的判白占比: 0.856532791052364
判白阈值: 0.23 阈值下判白准确率: 0.9815375302663438 阈值下判灰转判白率: 0.3297407219115404 总的判白占比: 0.856532791052364
判白阈值: 0.24 阈值下判白准确率: 0.9805796235434717 阈值下判灰转判白率: 0.3337061514997458 总的判白占比: 0.856532791052364
判白阈值: 0.25 阈值下判白准确率: 0.9784533648170012 阈值下判灰转判白率: 0.33706151499745807 总的判白占比: 0.856532791052364
判白阈值: 0.26 阈值下判白准确率: 0.9775967413441955 阈值下判灰转判白率: 0.3416370106761566 总的判白占比: 0.856532791052364
判白阈值: 0.27 阈值下判白准确率: 0.9763127853881278 阈值下判灰转判白率: 0.34783934926283683 总的判白占比: 0.856532791052364
判白阈值: 0.28 阈值下判白准确率: 0.9725643896976484 阈值下判灰转判白率: 0.3532282663955262 总的判白占比: 0.856532791052364
判白阈值: 0.29 阈值下判白准确率: 0.9708310401761144 阈值下判灰转判白率: 0.35871886120996443 总的判白占比: 0.856532791052364
判白阈值: 0.3 阈值下判白准确率: 0.9695006747638326 阈值下判灰转判白率: 0.3652262328418912 总的判白占比: 0.856532791052364

如上输出结果,假定我们需要确定判断通过的准确率不能低于98%,那么我们的阈值最大只能设定为0.24,对应的正确判白占比为33.37%,其中实际的白有85.65%

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值