我在从caret
混淆矩阵值重现灵敏度和特异性参数时遇到问题。(提前道歉,这是不可重现的,但我希望我展示足够的代码来清晰;除了pROC
引用之外,它应该能够被任何(0,1(个真相和预测向量复制(。
从 https://en.wikipedia.org/wiki/Sensitivity_and_specificity
:
- 灵敏度(又名召回率,又名 TPR(= TP/(TP + FN(
- 特异性(又称选择性又称 TNR(= TN/(TN + FP(
- 精度(又称阳性预测值或 PPV(= TP/(TP + FP(
我的困惑矩阵:
> cm = confusionMatrix(factor(y_pred),factor(y_test))
> cm$table
Reference
Prediction 0 1
0 8883 374
1 1440 1640
我从中获取
> TP=1640; FP=1440; FN=374; TN=8883
> cm$byClass
Sensitivity Specificity Pos Pred Value Neg Pred Value
0.8605057 0.8142999 0.9595981 0.5324675
Precision Recall F1 Prevalence
0.9595981 0.8605057 0.9073544 0.8367512
Detection Rate Detection Prevalence Balanced Accuracy
0.7200292 0.7503445 0.8374028
> TP / (TP + FN) #sensitivity aka Recall aka TPR
[1] 0.8142999
> TN / (TN + FP) #Specificity
[1] 0.8605057
> TP / (TP + FP) #precision aka PPV
[1] 0.5324675
> TN / (TN + FN) # NPV
[1] 0.9595981
看起来返回的数据被错误标记 - 特异性和灵敏度已被交换,Pos Pred 值和 Neg Pred 值也是如此。
与pROC
交叉检查:
> best_thr = coords(pROC_obj,x='best',input='threshold',transpose=TRUE)
> best_thr
threshold specificity sensitivity
0.2204595 0.8605057 0.8142999
似乎验证了confustionMatrix
灵敏度和特异性值是否已交换。
最令人担忧的是,当我尝试验证它时,我将要检索的 F1 值远远偏离:
> cm$byClass[7]
F1
0.9073544
> TP / (TP + (FP+FN)/2) # F1
[1] 0.6438948
我正在使用带有(新安装的(pROC
和caret
包的 R 版本 3.5.3。 我的计算是否做错了,或者caret confusionMatrix
实际上可能返回了错误的值(尤其是 F1(? (我认为我更有可能是错的,但pROC coords
同意我的观点,不同意confusionMatrix
。
我在"y_pred"和"y_test"中有两个值(0和1(。 我想预测 1s。 例如:
y_pred = c(0,1,0,0,1,1,0)
y_test = c(0,0,0,0,1,1,0)
当我执行时:
cm = confusionMatrix(factor(y_pred),factor(y_test), positive="1")
输出正确。