【问题标题】:Ranger Predicted Class Probability of each row in a data frameRanger 预测数据框中每一行的类别概率
【发布时间】:2020-07-11 21:23:35
【问题描述】:

关于这个链接Predicted probabilities in R ranger package,我有一个问题。

假设我有一个混合数据框 df(由因子和数值变量组成),我想使用 ranger 进行分类。我将此数据框拆分为测试集,并将训练集拆分为 Train_Set 和 Test_Set。 BiClass 是我的预测因子变量,由 0 和 1(2 个级别)组成

我想使用 ranger 使用以下命令计算类概率并将其附加到数据框:

Biclass.ranger <- ranger(BiClass ~ ., ,data=Train_Set, num.trees = 500, importance="impurity", save.memory = TRUE, probability=TRUE)

probabilities <- as.data.frame(predict(Biclass.ranger, data = Test_Set, num.trees = 200, type='response', verbose = TRUE)$predictions)

数据框概率是由 2 列(0 和 1)组成的数据框,其行数等于 Test_Set 中的行数。

这是否意味着,如果我附加或附加此数据框,即作为最后两列的 Test_Set 的概率,它会显示每一行为 0 或 1 的概率?我的理解正确吗?

我的第二个问题,当我尝试通过

计算混淆矩阵时
pred = predict(Biclass.ranger, data=Test_Set, num.trees = 500, type='response', verbose = TRUE)
table(Test_Set$BiClass, pred$predictions)

我收到以下错误: 表中的错误(Test_Set$BiClass,pred$predictions): 所有参数的长度必须相同

我做错了什么?

【问题讨论】:

    标签: r classification probability random-forest r-ranger


    【解决方案1】:

    对于您的第一个问题,是的,它显示每行为 0 或 1 的概率。使用以下示例:

    library(ranger)
    idx = sample(nrow(iris),100)
    data = iris
    data$Species = factor(ifelse(data$Species=="versicolor",1,0))
    Train_Set = data[idx,]
    Test_Set = data[-idx,]
    
    mdl <- ranger(Species ~ ., ,data=Train_Set,importance="impurity", save.memory = TRUE, probability=TRUE)
    probabilities <- as.data.frame(predict(mdl, data = Test_Set,type='response', verbose = TRUE)$predictions)
    

    我们可以随时检查他们是否同意:

    par(mfrow=c(1,2))
    boxplot(probabilities[,"0"] ~ Test_Set$Species,ylab="Prob 0",xlab="Actual label")
    boxplot(probabilities[,"1"] ~ Test_Set$Species,ylab="Prob 1",xlab="Actual label")
    

    不是最好的情节,但有时如果标签被翻转,你会看到一些奇怪的东西。我们需要找到具有最大概率的列并分配标签,为此我们这样做:

    max.col(probabilities) - 1
    [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 0
    [39] 0 0 0 0 0 0 0 0 0 0 0 0
    

    这会遍历每一行概率返回 1 或 2,具体取决于哪一列具有最大概率,我们只需从中减去 1 即可得到 0,1。对于混淆矩阵:

    caret::confusionMatrix(table(max.col(probabilities) - 1,Test_Set$Species))
    Confusion Matrix and Statistics
    
    
         0  1
      0 31  2
      1  0 17
    
                   Accuracy : 0.96            
                     95% CI : (0.8629, 0.9951)
        No Information Rate : 0.62            
        P-Value [Acc > NIR] : 2.048e-08 
    

    在你的情况下,你可以这样做:

    confusionMatrix(table(max.col(probabilities)-1,Test_Set$BiClass))
    

    【讨论】:

    • 抱歉,您能说得更具体一点吗...如果您使用probability=TRUE 运行ranger,您将不会得到confusionMatrix。如果您以probability=TRUE 运行它,那么如果您将预测的标签应用到插入符号上,您会得到相同的结果
    • 这似乎与您发布的这个问题是一个单独的问题,我建议如果问题仍然存在,您将其作为另一个问题发布,关于插入符号和游侠混淆矩阵之间的区别,并提供可重复的示例跨度>
    • 抱歉,刚刚发现confusionMatrix来自caret包。
    • 好的,我现在明白你的意思了。抱歉有点冗长。应该先预测,然后参考,rdocumentation.org/packages/caret/versions/6.0-86/topics/…。使用 table() 查看最后一个示例
    • 对不起,我为您输入错误,对于您的数据,请执行confusionMatrix(table(Tmax.col(probabilities)-1,Test_Set$BiClass, )),我现在更正了,再次抱歉混乱
    猜你喜欢
    • 2019-09-03
    • 2018-04-19
    • 2018-12-24
    • 1970-01-01
    • 2022-01-07
    • 2019-09-16
    • 2020-11-17
    • 2020-08-25
    • 1970-01-01
    相关资源
    最近更新 更多