【问题标题】:Create a binary outcome with random forest使用随机森林创建二元结果
【发布时间】:2023-04-04 06:49:02
【问题描述】:

我有一个如下所示的数据集:

 TEAM1         TEAM2     EXPG1  EXPG2         Gewonnen    
 ADO Den Haag  Groningen 1.5950 1.2672        1

我现在尝试根据EXPG1EXPG2 预测列Gewonnen。因此,我创建了一个训练和测试集,并正在创建以下模型(全部使用 rcaret):

modFit <- train(Gewonnen~ EXPG1 + EXPG2, data=training, method="rf", prox=TRUE)

我现在无法制作混淆矩阵,因为我的数据有更多引用。这是真的,因为当我这样做时:

pred <- predict(modFit, testing)
head(print)

上面写着:0.5324000 0.7237333 0.2811333 0.8231000 0.8299333 0.9792000

因为我想制作一个混淆矩阵,所以我无法将它们变成 0/1,但我觉得在模型中也应该有一个选项来执行此操作。

关于我应该在此模型中进行哪些更改以创建 0/1 值的任何想法。我在文档中找不到它:

modFit <- train(Gewonnen~ EXPG1 + EXPG2, data=training, method="rf", prox=TRUE)

【问题讨论】:

  • 随机森林你使用什么包?您的问题的答案是您需要在分类模式下运行随机森林。您现在正在回归模式下运行它。

标签: r machine-learning random-forest


【解决方案1】:

这个答案有点投机,因为您省略了有关数据集的一些关键细节,而且我没有广泛使用 caret 包。话虽如此,您似乎在 regression 模式下运行随机森林,这意味着您最终将得到一个连续函数。这意味着预测可以具有01 或介于01 之间的任何值的响应值。如果您的Gewonnen 列只有01 的值,并且您希望预测值也以这种方式表现,那么您可以尝试将Gewonnen 转换为分类变量。正如this article discusses,这可能会告诉随机森林以分类模式而不是回归模式运行。

Gewonnen <- as.factor(Gewonnen)

这会像您以前一样构建随机森林,并且您应该有您想要的响应。

【讨论】:

    【解决方案2】:

    首先,正如 Tim Biegeleisen 所说,您应该将您的 Gewonnen 变量转换为一个因子(在训练和测试集中),如果它还没有的话:

    training$Gewonnen <- as.factor(training$Gewonnen)
    testing$Gewonnen <- as.factor(testing$Gewonnen)
    

    之后,caret 函数predict 中的type 选项决定了您对二元分类问题的响应类型,即类标签或概率。这是来自 caret documentation 的可重现示例,使用包 mlbench 中的 Sonar 数据集:

    library(caret)
    library(mlbench)
    data(Sonar)
    str(Sonar$Class)
    # Factor w/ 2 levels "M","R": 2 2 2 2 2 2 2 2 2 2 ...
    
    set.seed(998)
    inTraining <- createDataPartition(Sonar$Class, p = .75, list = FALSE)
    training <- Sonar[ inTraining,]
    testing  <- Sonar[-inTraining,]
    
    modFit <- train(Class ~ ., data=training, method="rf", prox=TRUE)
    
    pred <- predict(modFit, testing, type="prob") # for class probabilities
    head(pred)
    #        M     R
    # 5  0.442 0.558
    # 10 0.276 0.724
    # 11 0.096 0.904
    # 12 0.360 0.640
    # 20 0.654 0.346
    # 21 0.522 0.478
    
    pred2 <- predict(modFit, testing, type="raw") # for class labels
    head(pred2)
    # [1] R R R R M M
    # Levels: M R
    

    对于混淆矩阵,您需要类标签(即上面的pred2):

    confusionMatrix(pred2, testing$Class)
    # Confusion Matrix and Statistics
    
    #           Reference
    # Prediction  M  R
    #          M 25  6
    #          R  2 18
    

    【讨论】:

    • 我赞成你,因为你提供了我不知道并且找不到自己的实施细节。而且你自己也承认了我的回答,这在如今的 SO 上很少见。
    • @TimBiegeleisen Thanx,这就是我一直在做的事情! :-) 也投了赞成票,因为我认为您的回答基本上就是所要求的。
    猜你喜欢
    • 2018-02-05
    • 2020-03-30
    • 2016-08-10
    • 2021-05-29
    • 2016-09-30
    • 2015-11-27
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    相关资源
    最近更新 更多