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

时间:2018-11-03 12:47:22

标签: r classification probability logistic-regression prediction

我有一个逻辑预测模型,该模型为每个人提供了成为案例的可能性。模型AUC为0.95。

有没有一种方法可以确定给我0.9特异性的阈值? (或其他任意指定的特异性或敏感性水平。)谢谢。

1 个答案:

答案 0 :(得分:2)

敏感性和特异性的经验值当然取决于数据集。您可以尝试使用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

P.S。我很确定caret包中有一个函数可以执行此操作,但是我找不到它。

P.P.S。顺便说一句,逻辑模型为给定特征向量的类别指定了概率分布,而获得敏感性和/或特异性的理论值将涉及相反的情况,即,为给定类别的特征向量指定分布的模型。为了从逻辑模型中获得此信息,您需要假设数据的先验分布(或与之拟合)。没有更多细节,您将如何去做甚至是否需要它还不清楚。