如何在交叉验证中计算灵敏度(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']))
代码修改说明:
- 新增了
specificity_score函数:通过混淆矩阵拆解出真阴性(TN)和假阳性(FP),代入特异度公式计算。 - 用
make_scorer把自定义函数转换成scikit-learn能识别的评分器,指定name参数让结果里的key更清晰。 - 替换了原来的索引访问方式,直接用
scores['test_xxx']来获取对应指标的交叉验证结果,避免因字典顺序问题导致的错误。 - 优化了打印输出的可读性,让结果更直观。
内容的提问来源于stack exchange,提问作者Vinayakumar R
相关产品推荐
相关产品推荐

