Sci-kit 学习功能选择阈值以获得更高的召回率而不是精度

数据挖掘 机器学习 神经网络 深度学习 分类 scikit-学习
2021-10-03 07:22:37

当我们更关心不应该有假阴性时,尽可能……即。更高的召回率(视频是否适合儿童),我们应该使用(接收器操作特性)ROC(曲线下面积)AUC,并尝试最大化它。

Scikit-Learn 提供了一个函数来直接计算:

from sklearn.metrics import roc_auc_score
roc_auc_score(y_train_5, y_scores)

同样,当我们更关心误报而不是误报时,例如商店吊装案例,我们应该怎么办?

我们应该尝试最大化召回率而忽略精度还是有更好的指标?

我在某处读过“使用精度与召回曲线并获得最大值”但不太确定这意味着什么......你能解释一下吗?

如果 sci-kit learn 中有这个指标的直接函数,就像上面第一种情况一样,请告诉我。

2个回答

至于 scikit 中实现更高召回率的特定阈值的功能,我认为没有。

但是,根据您使用的模型,您可以改变模型的概率输出阈值以获得更高的召回率。

例如,假设您使用的是随机森林逻辑回归分类器模型,那么您可以predict_proba在数据集上使用该函数;这将返回属于特定类的每个样本的概率。如果您随后从使用阈值的输出创建一个新数组predict_proba,则模型在对新的未见数据进行分类时将具有您期望的准确度的召回率。

例如二进制分类的伪代码

clf = sklearn.ensemble.RandomForestClassifier()
model = fit(X,y) # fit model to training datset
probs = model.predict_proba(X_new) # prediction on a new dataset X_new

threshold = 0.7 # threshold we set where the probability prediction must be above this to be classified as a '1'
classes = probs[:,1] # say it is the class in the second column you care about predictint
classes[classes>=threshold] = 1
classes[classes<threshold] = 0

最简单的方法是更换标签。另一种方法是将更重要的类的重要性设置为更高的值,这样成本函数就会朝方向移动,以更加注意您想要的标签。您可以设置class_weight看看这里这里