You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在交叉验证中计算灵敏度(Recall)与特异度?代码实现咨询

如何在交叉验证中计算特异度并修改你的Python代码

首先先明确交叉验证里灵敏度和特异度的完整计算逻辑:

  • 灵敏度(Sensitivity,也就是你代码里的Recall):衡量模型对正样本的识别能力,计算公式为:
    灵敏度 = 真阳性(TP) / (真阳性(TP) + 假阴性(FN))
    
    简单说就是,所有真实为正的样本里,被模型正确预测为正的比例。
  • 特异度(Specificity):衡量模型对负样本的识别能力,计算公式为:
    特异度 = 真阴性(TN) / (真阴性(TN) + 假阳性(FP))
    
    也就是所有真实为负的样本里,被模型正确预测为负的比例。

接下来看代码修改:scikit-learn的cross_validate默认没有内置的特异度评分项,所以我们需要自定义一个评分函数,用make_scorer包装后加入到scoring列表中。同时注意你原来的代码里用scores.keys()[2]这种索引方式很不可靠(字典在旧版Python里是无序的),建议直接用key名称访问结果。

修改后的完整代码如下:

import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_validate
from sklearn.metrics import make_scorer, confusion_matrix

# 自定义特异度计算函数
def specificity_score(y_true, y_pred):
    # 拆解混淆矩阵的四个值:真阴性、假阳性、假阴性、真阳性
    tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()
    # 计算特异度
    return tn / (tn + fp)

# 定义要评估的指标:召回率(灵敏度)、精确率、特异度
scoring = ['recall', 'precision', make_scorer(specificity_score, name='specificity')]

print("-----------------------------------------LR---------------------------------")
clf = LogisticRegression()
# 执行交叉验证
scores = cross_validate(clf, traindata, trainlabel, cv=3, scoring=scoring, return_train_score=False)

# 打印所有交叉验证结果
print("交叉验证所有结果:")
print(scores)

# 分别打印各指标的均值
print("\n精确率(Precision)均值:")
print(np.mean(scores['test_precision']))

print("\n灵敏度(Sensitivity/Recall)均值:")
print(np.mean(scores['test_recall']))

print("\n特异度(Specificity)均值:")
print(np.mean(scores['test_specificity']))

代码修改说明:

  1. 新增了specificity_score函数:通过混淆矩阵拆解出真阴性(TN)和假阳性(FP),代入特异度公式计算。
  2. 用make_scorer把自定义函数转换成scikit-learn能识别的评分器,指定name参数让结果里的key更清晰。
  3. 替换了原来的索引访问方式,直接用scores['test_xxx']来获取对应指标的交叉验证结果,避免因字典顺序问题导致的错误。
  4. 优化了打印输出的可读性,让结果更直观。

内容的提问来源于stack exchange,提问作者Vinayakumar R

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:43:06