使用混淆矩阵和插入符号统计的灵敏度和特异性的零 R 模型计算
Posted
技术标签:
【中文标题】使用混淆矩阵和插入符号统计的灵敏度和特异性的零 R 模型计算【英文标题】:Zero-R model calculation of Sensitivity and Specificity using Confusion Matrix and Statistics with Caret 【发布时间】:2021-11-12 12:39:57 【问题描述】:这是我从 R 中的confusionMatrix() 函数得到的结果,它基于零-R 模型。我可能错误地设置了函数,根据它的结果,我手动得到的结果不匹配,因为答案因随机种子而异,而confusionMatrix() 函数的灵敏度答案仅为 1.0000:
> sensitivity1 = 213/(213+128)
> sensitivity2 = 211/(211+130)
> sensitivity3 = 215/(215+126)
> #specificity = 0/(0+0) there were no other predictions
> specificity = 0
> specificity
[1] 0
> sensitivity1
[1] 0.6246334
> sensitivity2
[1] 0.6187683
> sensitivity3
[1] 0.6304985
有一条警告消息,但看起来它仍在运行并重构数据以匹配,因为它的顺序不同,这可能是基于训练和测试的排序和随机化。我试图返回并确保火车和测试没有带有负号或不同行数的反向排序。以下是插入符号的confusionMatrix() 函数的结果:
> confusionMatrix(as.factor(testDiagnosisPred), as.factor(testDiagnosis), positive="B")
Confusion Matrix and Statistics
Reference
Prediction B M
B 211 130
M 0 0
Accuracy : 0.6188
95% CI : (0.5649, 0.6706)
No Information Rate : 0.6188
P-Value [Acc > NIR] : 0.524
Kappa : 0
Mcnemar's Test P-Value : <2e-16
Sensitivity : 1.0000
Specificity : 0.0000
Pos Pred Value : 0.6188
Neg Pred Value : NaN
Prevalence : 0.6188
Detection Rate : 0.6188
Detection Prevalence : 1.0000
Balanced Accuracy : 0.5000
'Positive' Class : B
Warning message:
In confusionMatrix.default(as.factor(testDiagnosisPred), as.factor(testDiagnosis), :
Levels are not in the same order for reference and data. Refactoring data to match.
testDiagnosisPred 只是显示它猜测良性 (B) 作为数据集中每个癌症测试的诊断,这些因种子而异,因为实际的良性 (B) 和恶性 (M) 结果每次都是随机的。
testDiagnosisPred
B
341
> ## testDiagnosisPred
> ## B
> ## 228
>
> majorityClass # confusion matrix
B M
211 130
> ##
> ## B M
> ## 213 128
>
> # another seed's confusion matrix
> ## B M
> ## 211 130
下面是一些使用 head() 和 str() 函数的数据:
> head(testDiagnosisPred)
[1] "B" "B" "B" "B" "B" "B"
> head(cancerdata.train$Diagnosis)
[1] "B" "B" "M" "M" "M" "B"
> head(testDiagnosis)
[1] "B" "B" "M" "M" "M" "B"
>
> str(testDiagnosisPred)
chr [1:341] "B" "B" "B" "B" "B" "B" "B" "B" "B" "B" "B" "B" "B" "B" "B" "B" "B" "B" "B" "B" "B" "B" "B" "B" ...
> str(cancerdata.train$Diagnosis)
chr [1:341] "B" "B" "M" "M" "M" "B" "B" "B" "M" "M" "M" "B" "M" "M" "B" "M" "B" "B" "B" "M" "B" "B" "B" "B" ...
> str(testDiagnosis)
chr [1:341] "B" "B" "M" "M" "M" "B" "B" "B" "M" "M" "M" "B" "M" "M" "B" "M" "B" "B" "B" "M" "B" "B" "B" "B" ...
>
【问题讨论】:
您的问题是什么?你有什么问题? @akash87 如何在 R 中制作零 R 分类模型 @akash87 我不知道我的代码中的一行是否与零 R 分类模型或看起来像什么有关,我已经研究了几天并询问我的教授没有运气 @cocoakrispie93 查看此链接:r-bloggers.com/2020/04/…> @akash87 我已经检查了一个,我不确定这些函数来自什么或如何设置它们:library(OneR) ZeroR 【参考方案1】:混淆矩阵的混淆以及特异性和敏感性的计算是因为误读了混淆矩阵而不是垂直方向,正确答案来自插入符号中的confusionMatrix()函数,另一种了解方式是它是一个ZeroR 模型,经过进一步调查,它始终是 1.00 灵敏度和 0.00 特异性!那是因为 ZeroR 模型使用零规则和零属性,只是给出了多数预测。
> confusionMatrix(as.factor(testDiagnosisPred), as.factor(testDiagnosis), positive="B")
Confusion Matrix and Statistics
Reference
Prediction B M
B 211 130
M 0 0
Accuracy : 0.6188
Sensitivity : 1.0000
Specificity : 0.0000
当我进行这些手动特异性和敏感性计算时,我误读了水平方向而不是垂直方向的混淆矩阵:
> sensitivity1 = 213/(213+128)
> sensitivity2 = 211/(211+130)
> sensitivity3 = 215/(215+126)
> #specificity = 0/(0+0) there were no other predictions
> specificity = 0
> specificity
[1] 0
> sensitivity1
[1] 0.6246334
> sensitivity2
[1] 0.6187683
> sensitivity3
[1] 0.6304985
【讨论】:
以上是关于使用混淆矩阵和插入符号统计的灵敏度和特异性的零 R 模型计算的主要内容,如果未能解决你的问题,请参考以下文章
Python将classification_report的结论转化为字典(dict)形式并提取模型的灵敏度(sensitivity)特异度(specificity)PPV和NPV指标混淆矩阵图
寻找模型最优参数多模型交叉验证可视化指标计算多模型对比可视化(系数图误差图混淆矩阵校正曲线ROC曲线AUCAccuracy特异度灵敏度PPVNPV)
为多模型寻找模型最优参数多模型交叉验证可视化指标计算多模型对比可视化(系数图误差图混淆矩阵校正曲线ROC曲线AUCAccuracy特异度灵敏度PPVNPV)结果数据保存
拓端tecdat|R语言中的多类别问题的绩效衡量:F1-score 和广义AUC
R语言使用yardstick包的conf_mat函数计算多分类(Multiclass)模型的混淆矩阵并使用summary函数基于混淆矩阵输出分类模型评估的其它详细指标(kappanpv等13个)