使用caret库预测GBM的概率

6

有类似的问题被提出,然而回答中的链接指向随机森林示例,在我的情况下似乎不起作用。

这里是我正在尝试做的示例:

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

编辑: 我也看到了这个主题,虽然我的变量名中有几个带下划线的变量名,但我并没有收到关于变量名的错误提示,我认为这是有效的,因为我使用了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”数据集从哪里来?没有它,这段代码无法运行。 - MrFlick
你应该展示 str(train$strong) 的结果。我猜测你正在进行回归(而不是分类),因为预测值似乎是数字。对于分类,将 strong 设为一个因子,其级别不是 "0" 和 "1"。 - topepo
MrFlick,很抱歉我无法分享数据。@topepo 我要等到周日才能够检查,但我相当确定它是具有0和1级别的因子,但在我能够核实之前我会回复你的。当然,我想做的是分类,而不是回归。谢谢。 - enedene
如果它是一个因子,当你拟合模型时应该会看到一个警告,因为因子水平值可能会导致错误(因为它们不是有效的变量名)。 - topepo
1
@topepo,问题就像你所说的那样,级别是“0”和“1”,将级别更改为“强”和“弱”,我得到了你所说的概率。谢谢。请提供正式答案,以便我可以给你信用并关闭问题。 - enedene
3个回答

9

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


1
作为topepo上面解释的,该函数被生成的变量名称所混淆。
如果运行:
make.names(levels(traintestClass_subset))

如果您在结果变量中标记类别的方式与您的代码生成的名称不同,则会出现此问题。只需确保代码上方生成的名称与您提供给因子的类别名称相对应,就可以解决此问题。

0

这是关键:

我得到了一个二进制预测向量,非常好:

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

您的因子标签可以被解释为数字。我不知道为什么,但如果您将0更改为'a',将1更改为'b',那么它将在没有错误的情况下工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接