【问题标题】:Predicting Probabilities for GBM with caret library使用插入符号库预测 GBM 的概率
【发布时间】:2014-07-27 16:32:42
【问题描述】:

一个类似的问题是asked 但是答案中的链接指向随机森林示例,它似乎不适用于我的情况。

这是我正在尝试做的一个例子:

gbmGrid <-  expand.grid(interaction.depth = c(5, 9),
                    n.trees = (1:3)*200,
                    shrinkage = c(0.05, 0.1))

fitControl <- trainControl(
                       method = "cv",
                       number = 3,
                       classProbs = TRUE)

gbmFit <- train(strong~.-Id-PlayerName, data = train[1:10000,],
             method = "gbm",
             trControl = fitControl,
             verbose = TRUE,
             tuneGrid = gbmGrid)
gbmFit

一切都很好,我得到了最好的参数。现在,如果我进行预测:

predictStrong = predict(gbmFit, newdata=train[11000:50000,])

我得到一个预测的二进制向量,这很好:

[1] 0 1 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 1 1 0 0 0 1 ...

但是,当我尝试获取概率时,我得到一个错误:

predictStrong = predict(gbmFit, newdata=train[11000:50000,], type="prob")

Error in `[.data.frame`(out, , obsLevels, drop = FALSE) : 
undefined columns selected

问题出在哪里?

附加信息:

traceback()
5: stop("undefined columns selected")
4: `[.data.frame`(out, , obsLevels, drop = FALSE)
3: out[, obsLevels, drop = FALSE]
2: predict.train(gbmFit, newdata = train[11000:50000, ], type = "prob")
1: predict(gbmFit, newdata = train[11000:50000, ], type = "prob")

版本:

R version 3.1.0 (2014-04-10) -- "Spring Dance"
Copyright (C) 2014 The R Foundation for Statistical Computing
Platform: x86_64-unknown-linux-gnu (64-bit)

caret version: 6.0-29

编辑: 我也见过this topic,我没有收到关于变量名的错误,尽管我有几个带下划线的变量名,我认为它是有效的,因为我使用make.names 并获得与原创。

colnames(train) == make.names(colnames(train))
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

【问题讨论】:

  • train 数据集从何而来?没有它,此代码将无法运行。
  • 你应该显示str(train$strong)的结果。我怀疑您正在进行回归(而不是分类),因为预测值似乎是数字。对于分类,将strong 设为非“0”和“1”级别的因子。
  • MrFlick,很遗憾我不能分享数据。 @topepo 我要到周日才能检查,我很确定这是 0 级和 1 级的因素,但是当我能够检查时,我会回复你。当然我想做一个分类,而不是回归。谢谢。
  • 如果它是一个因子,您应该在拟合模型时看到一个警告,即因子水平值可能会导致错误(因为它们不是有效的变量名称)。
  • @topepo 问题是,正如你所说的那样,水平是“0”和“1”,将水平改变为“强”和“弱”我得到了你所说的概率。谢谢你。请提供正式的答案,以便我给予您信任并结束问题。

标签: r r-caret


【解决方案1】:

当请求类概率时,train 将它们放入一个数据框中,每个类都有一个列。如果因子水平不是有效的变量名称,它们会自动更改(例如,"0" 变为 "X0")。 train 在这种情况下发出警告,类似于“至少有一个类级别不是有效的 R 变量名称。如果生成类概率,这可能会导致错误。”

【讨论】:

    【解决方案2】:

    正如上面的 topepo 解释的那样,函数被生成的变量名弄糊涂了。

    如果你运行:

    make.names(levels(traintestClass_subset))
    

    结果与您在结果变量中标记类的方式不同,而不是会发生此问题。只需确保上述代码生成的名称与您提供给您的因素的类名称一致,它应该可以工作。

    【讨论】:

      【解决方案3】:

      这是关键:

      我得到一个预测的二进制向量,这很好:

      [1] 0 1 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 1 1 0 0 0 1 ...

      您的因子标签可以解释为数字。我不知道为什么,但是例如,如果您将 'a' 上的 0 和 'b' 上的 1 更改为 1,它将正常工作。

      【讨论】:

        猜你喜欢
        • 2017-06-22
        • 1970-01-01
        • 1970-01-01
        • 2021-06-22
        • 2014-06-15
        • 2013-08-26
        • 2015-06-30
        • 2020-01-25
        • 1970-01-01
        相关资源
        最近更新 更多