网易首页 > 网易号 > 正文 申请入驻

使用阈值调优改进分类模型性能

0
分享至

阈值调优是数据科学中一个重要且必要的步骤。它与应用程序领域密切相关,并且需要一些领域内的知识作为参考。在本文中将演示如何通过阈值调优来提高模型的性能。


用于分类的常用指标

一般情况下我们都会使用准确率accuracy来评价分类的性能,但是有很多情况下accuracy 不足以报告分类模型的性能,所以就出现了很多其他的指标:精确度Precision、召回率Recall、F1 分数F1 score和特异性Specificity。除此以外,还有 ROC 曲线、ROC AUC 和 Precision-Recall 曲线等等。

让我们首先简单解释这些指标和曲线的含义:

精确度Precision:所有正例中真正正例的数量。 P=TP/(TP+FP)

召回率Recall:正例数超过真正例数加上假负例数。 R=TP/(TP+FN)

F1 分数F1 score:Precision 和 Recall 之间的调和平均值。

特异性Specificity:真负例的数量超过真负例的数量加上假正例的数量。Spec=TN(TN+FP)

(ROC) 曲线:该曲线显示了真正例率和假正例率之间的权衡。代表模型的性能。

ROC曲线下面积(AUC):ROC曲线下面积。如果这个面积等于 1,我们就有了一个完美的分类器。如果它等于 0.5,那么就是一个随机的分类器。

Precision-Recall曲线:这条曲线显示了不同阈值下的精度和召回值。它用于可视化 Precision 和 Recall 之间的权衡。

一般来说,我们必须考虑所有这些指标和曲线。为了将这些内容显示在一起查看,这里定义了一个方法:

def make_classification_score(y_test, predictions, modelName):
tn, fp, fn, tp = confusion_matrix(y_test, predictions).ravel() # ravel() used to convert to a 1-D array
prec=precision_score(y_test, predictions)
rec=recall_score(y_test, predictions)
f1=f1_score(y_test, predictions)
acc=accuracy_score(y_test, predictions)
# specificity
spec=tn/(tn+fp)
score = {'Model': [modelName], 'Accuracy': [acc], 'f1': [f1], 'Recall': [rec], 'Precision': [prec], \
'Specificity': [spec], 'TP': [tp], 'TN': [tn], 'FP': [fp], 'FN': [fn], 'y_test size': [len(y_test)]}
df_score = pd.DataFrame(data=score)
return df_score

“预测概率”技巧

当我们测试和评估模型时,将预测的 Y 与测试集中的 Y 进行比较。 但是这里不建议使用 model.predict(X_test) 方法,直接返回每个实例的标签,而是直接返回每个分类的概率。例如sklearn 提供的 model.predict_proba(X_test) 的方法来预测类概率。 然后我们就可以编写一个方法,根据决策阈值参数返回每个实例的最终标签。

def probs_to_prediction(probs, threshold):
pred=[]
for x in probs[:,1]:
if x>threshold:
pred.append(1)
else:
pred.append(0)
return pred

如果设置thresh = 0.5 那么则和调用 model.predict(X_test) 方法得到的结果是相同的,但是使用概率我们可以测试不同的阈值的性能表现。

如果改变阈值则会改变模型的性能。这里可以根据应用程序领域选择一个阈值来最大化重要的度量(通常是精度或召回率),比如在kaggle的比赛中经常会出现thresh = 0.4xx的情况。

选择重要的度量

最大化的重要指标是什么呢?如何确定?

在二元分类任务中,我们的模型会出现两种类型的错误:

第一类错误:预测Y为True,但它实际上是False。也称为假正例错误。

第二类错误:预测Y为False,但它实际上是True。也称为假负例错误。

错误分类实例的数量决定了模型的好坏。但这些错误并不同等重要,对于不用的领域有着不同的要求,比如医学的检测和金融的风控中,需要尽量减小假负例也就是避免第二类错误,需要最小化假负例的数量,那么最大化的重要指标是召回率。

同理,如果要避免第一类错误,我们需要最小化假正例的数量,所以最大化的重要指标是精度。

为了最大化指标,我们可以移动阈值,直到我们在所有指标之间达成良好的平衡,这时就可以使用Precision-Recall曲线,当然也可以使用ROC曲线。

但是要说明的是,我们不能最大化所有指标,因为通过指标的定义就能看到这是不可能的。

阈值优化

假设我们正在处理一个二元分类任务的逻辑回归模型。我们已经进行了训练、超参数调优和测试阶段。该模型已经过交叉验证。也就是说,基本上能做的事情我们都已经做了,但是还是希望能够有一些其他的方式来优化模型,那么则可以试试调整模型的阈值。

对于sklearn来说使用model.predict_proba(X_test)方法来获得类概率,如果使用神经网络的化一般都会输出的是每个类的概率,所以我们这里以sklearn为例,使用这个概率值:

  • 计算ROC AUC,它等于0.9794
  • 计算并绘制ROC曲线
  • 计算并绘制精度-召回率曲线

下面的代码块表示这些步骤:

def probs_to_prediction(probs, threshold):
pred=[]
for x in probs[:,1]:
if x>threshold:
pred.append(1)
else:
pred.append(0)
return pred
# getting predicted probability values
probability = model.predict_proba(X_test)
# calculate ROC AUC score. AUC = 0.9794
print("Logit: ROC AUC = %.4f" % roc_auc_score(y_test, probability[:, 1]))
# calculate and plot the ROC curve
model_fpr, model_tpr, _ = roc_curve(y_test, probability[:, 1])
plt.plot(model_fpr, model_tpr, marker='.', label='Logit')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate (recall)')
plt.legend()
plt.title("ROC Curve")
plt.show()
# calculate and plot the Precision-Recall curve
model_precision, model_recall, thresholds = precision_recall_curve(y_test, probability[:, 1])
plt.plot(model_recall, model_precision, marker='.', label='Logit')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.legend()
plt.title('Precision-Recall Curve')
plt.show()

下图的曲线。可以看到模型的性能很好。

在本例中,假设在我们的实际应用中FP的成本> FN的成本,所以选择一个阈值在不降低召回率的情况下最大化精度。使用Precision-Recall曲线来对一个可能的阈值进行初始选择。在下面的代码中,绘制了带有候选阈值的Precision-Recall曲线。

plt.plot(model_recall, model_precision, marker='.', label='Logit')
plt.plot(model_recall[43000], model_precision[43000], "ro", label="threshold")
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.legend()
plt.title('Precision and Recall values for a chosen Threshold')
plt.show()

这样就可以使用选定的阈值来获得最终的分类标签并计算性能指标。并且可以多次进行选择不同阈值进行对比。

print("Threshold value = %.4f" % thresholds[43000])
# results with the chosen threshold
predictions = probs_to_prediction(probability, thresholds[43000])
make_classification_score(y_test, predictions, "logit, custom t")

下图中可以看到,所选的阈值以召回率为代价来最大化精度。根据我们应用的决策阈值,相同的模型可以表现出一些不同的性能。

通过调整阈值并进行结果的对比,一旦对结果满意,模型就可以投入到生产中了。

总结

为分类模型选择最重要的评价指标并不容易。这种选择通常与应用程序领域有关,必须考虑错误分类的代价。在某些情况下,可能有必要咨询领域专家确定哪些错误代表最大的风险。

模型的行为很大程度上受到阈值选择的影响,我们可以应用不同的技术来评估模型并调优阈值以获得预期的结果。

https://avoid.overfit.cn/post/81f1646e48c341358391a9a1d3a2dcfd

作者:Edoardo Bianchi

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
世锦赛:世界亚军2-7连输六局,赵心童十连胜,丁俊晖面临挑战

世锦赛:世界亚军2-7连输六局,赵心童十连胜,丁俊晖面临挑战

许钇很机智
2026-04-19 07:58:47
争冠天王山战前!阿森纳官网前瞻客战曼城:这是我们一生一次的机会

争冠天王山战前!阿森纳官网前瞻客战曼城:这是我们一生一次的机会

生活新鲜市
2026-04-19 08:16:07
解放后损失最大俘虏逃跑事件,劫走一架飞机带走3名我军中层干部

解放后损失最大俘虏逃跑事件,劫走一架飞机带走3名我军中层干部

鹤羽说个事
2026-04-16 22:07:31
同名同姓同身份证尾号,山东一女子称被异地法院错判,万元存款被强制执行,损失3年利息

同名同姓同身份证尾号,山东一女子称被异地法院错判,万元存款被强制执行,损失3年利息

封面新闻
2026-04-18 16:24:02
恒大集团许家印坑的最惨的9位大佬

恒大集团许家印坑的最惨的9位大佬

地产微资讯
2026-03-29 19:08:15
事出反常必有妖!日军舰闯台海,中国“打而不打”背后藏一盘大棋

事出反常必有妖!日军舰闯台海,中国“打而不打”背后藏一盘大棋

阿芒娱乐说
2026-04-18 10:05:25
第10艘船出事,美军全面封锁,严禁中伊原油交易,中国打出反制牌

第10艘船出事,美军全面封锁,严禁中伊原油交易,中国打出反制牌

寻墨阁
2026-04-19 01:50:02
胡锡进给沃尔沃汽车做广告,评论区全翻车了……

胡锡进给沃尔沃汽车做广告,评论区全翻车了……

麦杰逊
2026-04-17 11:51:26
特朗普:美伊正在对话,“伊朗又想封锁海峡,但无法要挟我们,今天结束前会有消息”

特朗普:美伊正在对话,“伊朗又想封锁海峡,但无法要挟我们,今天结束前会有消息”

澎湃新闻
2026-04-19 01:00:04
江西“射里头”火了!全国奇葩地名大赏

江西“射里头”火了!全国奇葩地名大赏

深度报
2026-04-18 21:53:14
高股息+破净+国企改革!2026年二季度,这5只压舱石标的值得收藏

高股息+破净+国企改革!2026年二季度,这5只压舱石标的值得收藏

小白鸽财经
2026-04-18 20:30:03
看了宋宁峰的某鱼账号,发现他审美品味挺高,网友:没觉得他缺钱

看了宋宁峰的某鱼账号,发现他审美品味挺高,网友:没觉得他缺钱

情感大头说说
2026-04-18 20:50:37
导游骂此人是遵义会议唯一支持博古的人,游客:我父亲一无是处?

导游骂此人是遵义会议唯一支持博古的人,游客:我父亲一无是处?

大运河时空
2026-04-18 08:35:03
7天242人死亡!中国游客亲历泰国泼水节,怒诉街头摩的飙至七八十码

7天242人死亡!中国游客亲历泰国泼水节,怒诉街头摩的飙至七八十码

刘哥谈体育
2026-04-19 06:56:49
成都“牵手门”事件女主现今状况曝光,太惨了......

成都“牵手门”事件女主现今状况曝光,太惨了......

许三岁
2026-03-17 07:34:05
这种小吃“比砒霜还毒”?怎么还有人在买卖!

这种小吃“比砒霜还毒”?怎么还有人在买卖!

果壳
2026-04-18 20:10:46
反转!穆里尼奥拒绝英超豪门!他愿重返伯纳乌

反转!穆里尼奥拒绝英超豪门!他愿重返伯纳乌

澜归序
2026-04-19 00:43:29
二手车市场满屏“九成新”,车商实锤猫腻,我们全成了接盘侠

二手车市场满屏“九成新”,车商实锤猫腻,我们全成了接盘侠

洞见小能手
2026-04-16 16:21:52
记录报:穆里尼奥成为皇马新帅候选,弗洛伦蒂诺有意和他会面

记录报:穆里尼奥成为皇马新帅候选,弗洛伦蒂诺有意和他会面

懂球帝
2026-04-19 05:29:08
辞去央视铁饭碗,带着儿子嫁给张译,20年过去,才知道她有多明智

辞去央视铁饭碗,带着儿子嫁给张译,20年过去,才知道她有多明智

秋姐居
2026-04-18 22:04:49
2026-04-19 09:35:01
deephub incentive-icons
deephub
CV NLP和数据挖掘知识
1975文章数 1461关注度
往期回顾 全部

科技要闻

传Meta下月拟裁8000 大举清退人力为AI腾位

头条要闻

女子与情人在车上发生关系后被杀 还被灌农药伪造殉情

头条要闻

女子与情人在车上发生关系后被杀 还被灌农药伪造殉情

体育要闻

时隔25年重返英超!没有人再嘲笑他了

娱乐要闻

刘德华回应潘宏彬去世,拒谈丧礼细节

财经要闻

华谊兄弟,8年亏光85亿

汽车要闻

奇瑞威麟R08 PRO正式上市 售价14.48万元起

态度原创

游戏
教育
亲子
公开课
军事航空

让老粥批直呼“计划有变”的岁兽代理人,到底是什么东西?

教育要闻

中考数学真题,别想太简单了

亲子要闻

不必过度忧虑人口问题,30年内人造子宫就会像试管婴儿一样司空见惯

公开课

李玫瑾:为什么性格比能力更重要?

军事要闻

解放军护卫舰与外舰缠斗20小时 细节披露

无障碍浏览 进入关怀版