一、auc模型评估
评价二值分类器的指标很多,比如precision、recall、F1 score、P-R曲线等。但这些指标或多或少只能反映模型在某一方面的性能。相比而言,ROC曲线则有很多优点,经常作为评估二值分类器最重要的指标之一。
ROC曲线(Receiver Operating Characteristic Curve)中文名为“受试者工作特征曲线”:
横坐标:假阳性率(False Positive Rare)
其中FP是N个负样本中被分类器预测为正样本的个数,N是真实的负样本的数量
纵坐标:真阳性率(Ture Positive Rare)
其中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%