用插入符号库预测GBM的概率

时间:2014-06-06 11:53:59

标签: r r-caret

类似的问题是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

3 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:1)

正如上面解释的那样,函数被生成的变量名混淆了。

如果你跑:

make.names(levels(traintestClass_subset))

并且结果与您在结果变量中标记类的方式不同,此问题将发生。只需确保上面的代码生成的名称与您为因子提供的类名一致,它应该可以正常工作。

答案 2 :(得分: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 ...

您的因子标签可以解释为数字。我不知道为什么,但是如果你在'a'上改0,在'b'上改1,那么它将没有错误。