选择逻辑模型预测的概率阈值以获得一定的特异性[关闭]

Posted

技术标签:

【中文标题】选择逻辑模型预测的概率阈值以获得一定的特异性[关闭]【英文标题】:Choosing probability threshold of logistic model predictions to obtain a certain specificity [closed] 【发布时间】:2019-04-07 11:00:13 【问题描述】:

我有一个逻辑预测模型,它为每个人生成一个病例的概率。模型 AUC 为 0.95。

有没有办法确定概率阈值可以给我 0.9 的特异性? (或任何其他任意指定的特异性或敏感性级别。)谢谢。

【问题讨论】:

【参考方案1】:

敏感性和特异性的经验值当然取决于数据集。您可以尝试使用predict 提取逻辑模型预测的类概率并设置不同的阈值以根据特异性对其进行校准,但请记住,为了使您的特异性数字在测试数据上保持准确,类的比例必须是同样分布在训练和测试人群中。在下面的示例中,我创建了一个函数,用于将训练数据的特异性映射到模拟数据集的逻辑模型概率响应阈值。

set.seed(100)
x = rnorm(1000)
y = sapply(x, function(zeta) rbinom(1, 1, plogis(zeta)))
data <- data.frame(x = x, y = y)
logistic_model <- glm(data = data, formula = y ~ 0 + x, family = "binomial")
summary(logistic_model)

# Call:
#   glm(formula = y ~ 0 + x, family = "binomial", data = data)
# 
# Deviance Residuals: 
#   Min       1Q   Median       3Q      Max  
# -2.4626  -0.9187   0.5383   1.0284   2.3236  
# 
# Coefficients:
#   Estimate Std. Error z value Pr(>|z|)    
# x  1.09347    0.08576   12.75   <2e-16 ***
#   ---
#   Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# 
# (Dispersion parameter for binomial family taken to be 1)
# 
# Null deviance: 1386.3  on 1000  degrees of freedom
# Residual deviance: 1163.2  on  999  degrees of freedom
# AIC: 1165.2
# 
# Number of Fisher Scoring iterations: 4


data$response <- predict(logistic_model, type = "response")
p_vals = seq(0,1,0.001)
specificity <- sapply(p_vals, function(p) sum(data$y == 0 & data$response < p)/sum(data$y == 0))
plot(p_vals, specificity, type = "l")

threshold_by_specificity <- function(spc)
  return(p_vals[sum(specificity <= spc)])

threshold_by_specificity(0.1)
##0.13
threshold_by_specificity(0.3)
##0.251

附:我很确定caret 包中有一个功能可以做到这一点,但我找不到它。

附言顺便说一句,逻辑模型指定给定特征向量的类别的概率分布,而获得敏感性和/或特异性的理论值将涉及相反的情况,即指定给定类别的特征向量分布的模型.要从逻辑模型中获得这一点,您需要假设数据的先验分布(或对其进行拟合)。如果没有更多详细信息,您应该如何去做,甚至是否需要这样做,都不清楚。

【讨论】:

是的,这就是代码完成的问题。犯一个错误,然后在整个代码中重复它。编译器不再充当拼写检查。 教计算机思考一直是一个梦想。 谢谢@ritwik33,你可以说我对此很陌生。是的,我的意思是规范/感知应用于特定的训练集。 CV/bootstrap 这个过程似乎是一个合理的想法? @bobmcpop 好吧,您可以对特异性估计使用交叉验证:计算未用于拟合逻辑模型的训练数据折叠(分区)的特异性,然后平均通过在每次训练时省略不同的折叠来获得这些值。你也可以做一些像袋外样本这样的事情,也就是说,你尝试使用替换数据的引导样本,并使用样本中不包含的训练观察来计算特异性,然后对几个引导样本进行平均。不过,我不确定这两个想法在理论上是否合理。

以上是关于选择逻辑模型预测的概率阈值以获得一定的特异性[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

SVM 模型将概率分数大于 0.1(默认阈值 0.5)的实例预测为正例

R语言glm拟合logistic回归模型:模型评估(模型预测概率的分组密度图混淆矩阵准确率精确度召回率ROCAUC)PRTPlot函数获取logistic模型最优阈值(改变阈值以优化)

使用逻辑回归模型获得 1 而不是 [0;1] 的预测概率

插入符号分类阈值

机器学习术语表

python基于模型的预测概率和标签信息可视化ROC曲线编写自定义函数计算约登值寻找最佳阈值(thresholdcutoff)可视化ROC曲线并在曲线中标记最佳阈值及其数值标签