Machine learning “再创造”;“多分类摘要”;来自最终模型混淆矩阵的统计信息

Machine learning “再创造”;“多分类摘要”;来自最终模型混淆矩阵的统计信息,machine-learning,random-forest,r-caret,roc,Machine Learning,Random Forest,R Caret,Roc,下面是一个基于三个结果iris数据集的随机林,使用Zach Mayer的插入符号中的multiClassSummary函数: require('caret') data(iris) ir.dat <- iris tc<-trainControl("repeatedcv", repeats=5, num=2, selectionFunction="oneSE", returnData=T, classProbs = T,

下面是一个基于三个结果iris数据集的随机林,使用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
另外,我知道当有两个以上的结果类别时,
multiclassssummary
函数使用一对所有的方法来计算这些边际统计数据。然而,当我试图从给定的混淆矩阵手动重新创建计算时,我的结果并不相同。例如,我计算:

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

在我的计算中,每门课都会有一个“转折点”,作为积极和消极的结果。显然,这些结果与模型的输出不匹配,也没有太多意义,因为它们都具有相同的值。有谁能解释一下在多类情况下如何从模型混淆矩阵计算这些边缘统计信息吗?

请注意,
ir.train$finalModel$conflusion
是由使用OOB统计信息的
randomForest
包生成的,与
ir.train$results
。这是基于外部重采样过程

有人能解释一下在多类情况下如何从模型混淆矩阵计算这些边际统计数据吗

当然

>多类摘要##为空间编辑
函数(数据,lev=NULL,model=NULL)
{
## 

你是否有关于编程的问题,你应该在
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
> 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>
}