【问题标题】:Error in calculating confusion matrix or contigency table for multiclassification using ranger使用 Ranger 计算多分类的混淆矩阵或列联表时出错
【发布时间】:2021-10-10 08:39:44
【问题描述】:

我正在调用 ranger 来对大型混合数据框架的多分类问题进行建模(其中一些分类变量的级别超过 53 个)。训练和测试运行没有任何问题。但是,解释混淆矩阵/列联表会遇到麻烦。

我使用虹膜数据来解释我面临的困难,将物种视为分类变量,

library(ranger)
library(caret)

# Data
idx = sample(nrow(iris),100)
data = iris

# Split data sets
Train_Set = data[idx,]
Test_Set = data[-idx,]

# Train
Species.ranger <- ranger(Species ~ ., ,data=Train_Set,importance="impurity", save.memory = TRUE, probability=TRUE)

# Test
probabilitiesSpecies <- predict(Species.ranger, data = Test_Set,type='response', verbose = TRUE)
or
probabilitiesSpecies <- as.data.frame(predict(Species.ranger, data = Test_Set,type='response', verbose = TRUE)$predictions)

遇到以下困难:

table(Test_Set$Species, probabilitiesSpecies$predictions)

Error in table(Test_Set$Species, probabilitiesSpecies$predictions) : 
all arguments must have the same length

caret::confusionMatrix(Test_Set$Species, probabilitiesSpecies$predictions)
or
caret::confusionMatrix(table(Test_Set$Species, max.col(probabilitiesSpecies)-1))
gives
Error: `data` and `reference` should be factors with the same levels.

然而,下面显示的二分类是有效的:

idx = sample(nrow(iris),100)
data = iris
data$Species = factor(ifelse(data$Species=="virginica",1,0))

Train_Set = data[idx,]
Test_Set = data[-idx,]

# Train
Species.ranger <- ranger(Species ~ ., ,data=Train_Set,importance="impurity", save.memory = TRUE, probability=TRUE)

# Test
probabilitiesSpecies <- as.data.frame(predict(Species.ranger, data = Test_Set,type='response', verbose = TRUE)$predictions)

caret::confusionMatrix(table(max.col(probabilitiesSpecies)-1, Test_Set$Species))

如何解决这个问题以进行多分类以获得混淆矩阵?我也将其设置为单独的线程 (Error while computing confusion matrix for multiclassification using ranger)

【问题讨论】:

    标签: r machine-learning classification confusion-matrix r-ranger


    【解决方案1】:

    ranger-documentation中,当probabilities = TRUE时说如下,

    使用概率选项和因子因变量生成概率森林。在这里,节点杂质用于分裂,就像在分类森林中一样。 预测是每个样本的类概率。 与其他实现相比,每棵树都会返回一个概率估计,并且这些估计是森林概率估计的平均值。有关详细信息,请参阅 Malley 等人。 (2012 年)。

    即。当设置为TRUE 时,您将获得概率估计值,然后您可以根据自己的阈值对其进行分类。但是,如果设置为FALSE,我不知道默认的决策规则。

    无论如何,你的方法应该如下,

    Species.ranger <- ranger(
            Species ~ .,
            data = Train_Set,
            importance ="impurity",
            save.memory = TRUE, 
            probability = FALSE
    )
    

    然后可以通过以下方式在confusionMatrix 中评估其性能,

    probabilitiesSpecies <- predict(
            Species.ranger,
            data = Test_Set,
            verbose = TRUE
            )
    
    table(
            probabilitiesSpecies$predictions,
            Test_Set$Species
    ) %>% confusionMatrix()
    
    

    输出

    Confusion Matrix and Statistics
    
                
                 setosa versicolor virginica
      setosa         17          0         0
      versicolor      0         16         1
      virginica       0          0        16
    
    Overall Statistics
                                              
                   Accuracy : 0.98            
                     95% CI : (0.8935, 0.9995)
        No Information Rate : 0.34            
        P-Value [Acc > NIR] : < 2.2e-16       
                                              
                      Kappa : 0.97            
                                              
     Mcnemar's Test P-Value : NA              
    
    Statistics by Class:
    
                         Class: setosa Class: versicolor Class: virginica
    Sensitivity                   1.00            1.0000           0.9412
    Specificity                   1.00            0.9706           1.0000
    Pos Pred Value                1.00            0.9412           1.0000
    Neg Pred Value                1.00            1.0000           0.9706
    Prevalence                    0.34            0.3200           0.3400
    Detection Rate                0.34            0.3200           0.3200
    Detection Prevalence          0.34            0.3400           0.3200
    Balanced Accuracy             1.00            0.9853           0.9706
    

    【讨论】:

    • 感谢您的解决,我仍然想知道如何通过混淆矩阵解释概率 = TRUE 的情况,就像您在上面通过设置概率 = FALSE 所做的那样
    • 当概率=FALSE 时,confusion.matrix 显示为 integer[3x3](S3:table) 作为 Species.ranger 的一部分。预测也是 Species.ranger 和 probabilitiesSpecies 中的类型因子,而 forest 的类型是 list[9](S3:ranger.forest)。相反,在 Species.ranger 和 probabilitiesSpecies 中的预测都是 double 类型,当probability=TRUE 时,forest 是 list[10](S3:forest) 类型,另外还出现了 terminal.class.counts。此外,confusion.matrix 不会出现在 Species.ranger 下。
    • 我不确定这是一种“解决方法”,因为它类似于文档中给出的示例!要获得概率 = FALSE 的类,我假设您必须自己指定阈值!我没有看到任何其他方式,但也许你会从阅读这篇论文中受益。
    猜你喜欢
    • 2021-10-09
    • 2018-04-01
    • 2017-09-25
    • 2018-04-09
    • 2018-03-02
    • 2019-07-07
    • 2020-06-23
    • 2018-10-21
    相关资源
    最近更新 更多