【R语言】预测模型最合适阈值Cutoff选取及其它指标计算

本文介绍了如何使用pROC包在R中评估模型预测的性能,通过计算AUC并确定最佳阈值,分别针对正负样本进行正向和负向分类。通过两个方法展示了如何找到最大化敏感性和特异性组合的cutoff,并提供了关键指标如AUC、敏感性和特异性的计算和报告。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

library(pROC)
# label: 金标准,0 1 变量
# pred: 模型预测值,连续变量

# 方法一
cal_metrics <- function(label, pred){
  roc.p=pROC::roc(label, pred)
  if (roc.p$auc>0.5){
    cutoff=roc.p$thresholds[which.max(roc.p$sensitivities+roc.p$specificities)]
    sensitivity=roc.p$sensitivities[which.max(roc.p$sensitivities+roc.p$specificities)]
    specificity=roc.p$specificities[which.max(roc.p$sensitivities+roc.p$specificities)]
    df=data.frame(type='positive classification',
                  auc=round(roc.p$auc,3),cutoff=cutoff,
                  sensitivity=sensitivity,specificity=specificity)
    return(df)
  }
  else{
    cutoff=roc.p$thresholds[which.min(roc.p$sensitivities+roc.p$specificities)]
    sensitivity=roc.p$sensitivities[which.min(roc.p$sensitivities+roc.p$specificities)]
    specificity=roc.p$specificities[which.min(roc.p$sensitivities+roc.p$specificities)]
    df=data.frame(type='negative classification',
                  auc=1-round(roc.p$auc,3),cutoff=cutoff,
                  sensitivity=1-sensitivity,specificity=1-specificity)
    return(df)
  }
}

# 方法二:
roc.p=pROC::roc(label, pred)
cutoff=roc.p$thresholds[which.max(roc.p$sensitivities+roc.p$specificities)]

pred_b = as.integer(pred > cutoff)
cft = table(pred_b, label)

cm = confusionMatrix(cft, positive = "1", mode = "everything")
paste0('cutoff: ', cutoff)
print(roc.p$auc)
print(cm)

参考文献

  1. https://github.com/cran/cutoff/blob/master/R/roc.R
  2. https://www.jianshu.com/p/c61feeb8b36f
### Top-P 的定义及作用 Top-P 是一种用于控制自然语言生成模型输出多样性的技术。它基于累积概率分布来筛选可能的下一个词候选集。具体来说,Top-P 方法会选择最小数量的 token,使得这些 token 的累计概率达到或超过指定的概率阈值 P[^1]。 #### 定义 在大模型中,Top-P 表示按概率截断采样方法的一种形式。当模型预测下一步单词时,会计算所有可能单词的概率分布。Top-P 并不固定选取前 K 个最高概率的单词(如 Top-K),而是动态调整范围,直到所选单词集合的总概率至少等于设定的 P 值为止。这意味着如果某些高概率单词占据了大部分可能性,则其他低概率选项会被排除在外。 #### 作用 Top-P 的主要目的是平衡生成文本的质量与多样性之间的关系。相比传统的贪婪算法总是挑选最大概率词语或者固定的 Top-K 抽取方式,Top-P 能够更灵活地适应不同场景下的需求: - **提高质量**:通过设置较高的 P 值可以减少噪声干扰项被选择的机会,从而提升整体连贯性和逻辑性。 - **增加创造性**:适当降低 P 值可以让一些不太常见但仍然合理的词汇有机会进入考虑范畴,进而增强表达的新颖度和趣味性。 下面是一个简单的 Python 实现例子展示如何利用 numpy 库实现基本版 top-p 功能: ```python import numpy as np def top_p_filtering(logits, top_p=0.9): sorted_indices = np.argsort(-logits) # Sort logits descendingly sorted_logits = logits[sorted_indices] cumulative_probs = np.cumsum(np.exp(sorted_logits)) / np.sum(np.exp(sorted_logits)) cutoff_index = next(i for i,p in enumerate(cumulative_probs) if p >= top_p) filtered_indices = sorted_indices[:cutoff_index+1] return filtered_indices[np.random.choice(len(filtered_indices), size=None)] ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值