gpt4 book ai didi

machine-learning - 从最终模型混淆矩阵重新创建 "multiClassSummary"统计数据

转载 作者:行者123 更新时间:2023-11-30 09:00:41 25 4
gpt4 key购买 nike

下面是使用插入符号中 Zach Mayer 的 multiClassSummary 函数在三结果鸢尾花数据集上构建的随机森林:

require('caret')

data(iris)
ir.dat <- iris

tc<-trainControl("repeatedcv", repeats=5, num=2,
selectionFunction="oneSE",
returnData=T, classProbs = T,
summaryFunction=multiClassSummary,
savePredictions = T)

ir.train <- train(Species ~ .,
data = ir.dat,
method = "rf",
trControl = tc)


## Results

ir.train$finalModel$confusion

setosa versicolor virginica class.error
setosa 50 0 0 0.00
versicolor 0 47 3 0.06
virginica 0 4 46 0.08

ir.train$bestTune
ir.train$results[1,c(4,6:7)]

Accuracy Mean_Sensitivity Mean_Specificity
0.952 0.952 0.976

现在,我想了解如何根据模型的混淆矩阵计算这些边际统计数据(或者它们是否是根据给定的混淆矩阵计算的)。我知道每个性能指标的公式,它们是:

Sensitivity = sum(True Positive)/sum(Condition Positive)
Specificity= sum(True Negative)/sum(Condition Negative)
Accuracy = Sensitivity + Specificity // sum(Total Population)

此外,我知道当存在两个以上结果类别时,multiClassSummary 函数使用一对多方法来计算这些边际统计数据。然而,当我尝试根据给定的混淆矩阵手动重新创建计算时,我的结果并不相同。例如我计算:

Sensitivity = (50/50) + (47/50) + (46/50) = 2.86/3 = 0.9533
Specificity = (50/50) + (47/50) + (46/50) = 2.86/3 = 0.9533
Accuracy = Sensitivity + Specificity//150 = 0.9533

在我的计算中,每个类(class)都以“回合”作为积极和消极的结果。显然,这些结果与模型的输出不匹配,而且它们也没有多大意义,因为它们都具有相同的值。谁能阐明如何在多类情况下从模型混淆矩阵计算这些边际统计数据?

最佳答案

请注意,ir.train$finalModel$confusion 是由 randomForest 包使用 OOB 统计数据生成的,与 使用的混淆矩阵没有直接关系ir.train$结果。这是基于外部重采样过程的。

Can anyone shed some light on how these marginal statistics are calculated from the model confusion matrix in a multiClass situation?

当然!

> multiClassSummary ## Edited for space
function (data, lev = NULL, model = NULL)
{
## <snip>
has_class_probs <- all(lev %in% colnames(data))
if (has_class_probs) {
lloss <- mnLogLoss(data = data, lev = lev, model = model)
requireNamespaceQuietStop("ModelMetrics")
prob_stats <- lapply(levels(data[, "pred"]), function(x) {
obs <- ifelse(data[, "obs"] == x, 1, 0)
prob <- data[, x]
AUCs <- try(ModelMetrics::auc(obs, data[, x]), silent = TRUE)
return(AUCs)
})
roc_stats <- mean(unlist(prob_stats))
}
CM <- confusionMatrix(data[, "pred"], data[, "obs"])
if (length(levels(data[, "pred"])) == 2) {
class_stats <- CM$byClass
}
else {
class_stats <- colMeans(CM$byClass)
names(class_stats) <- paste("Mean", names(class_stats))
}
overall_stats <- if (has_class_probs)
c(CM$overall, logLoss = lloss, ROC = roc_stats)
else CM$overall
if (length(levels(data[, "pred"])) > 2)
names(overall_stats)[names(overall_stats) == "ROC"] <- "Mean_AUC"

## <snip>
}

关于machine-learning - 从最终模型混淆矩阵重新创建 "multiClassSummary"统计数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40346851/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com