在R中运行Caret包时出现错误

4

我正在尝试构建一个模型,以预测电子商务网站上的产品是否会被售出,输出结果为1或0。

我的数据包含一些分类变量,其中一个变量有大量水平,几个是二元变量,另外一个是连续变量(价格),输出变量为1或0,表示产品清单是否被售出。

以下是我的代码:

inTrainingset<-createDataPartition(C$Sale, p=.75, list=FALSE)
CTrain<-C[inTrainingset,]
CTest<-C[-inTrainingset,]


gbmfit<-gbm(Sale~., data=C,distribution="bernoulli",n.trees=5,interaction.depth=7,shrinkage=      .01,)
plot(gbmfit)


gbmTune<-train(Sale~.,data=CTrain, method="gbm")


ctrl<-trainControl(method="repeatedcv",repeats=5)
gbmTune<-train(Sale~.,data=CTrain, 
           method="gbm", 
           verbose=FALSE, 
           trControl=ctrl)


ctrl<-trainControl(method="repeatedcv", repeats=5, classProbs=TRUE, summaryFunction =    twoClassSummary)
gbmTune<-trainControl(Sale~., data=CTrain, 
                  method="gbm", 
                  metric="ROC", 
                  verbose=FALSE , 
                  trControl=ctrl)



  grid<-expand.grid(.interaction.depth=seq(1,7, by=2), .n.trees=seq(100,300, by=50),  .shrinkage=c(.01,.1))

  gbmTune<-train(Sale~., data=CTrain, 
           method="gbm", 
           metric="ROC", 
           tunegrid= grid, 
           verebose=FALSE,
           trControl=ctrl)



  set.seed(1)
  gbmTune <- train(Sale~., data = CTrain,
               method = "gbm",
               metric = "ROC",
               tuneGrid = grid,
               verbose = FALSE,
               trControl = ctrl)

我遇到了两个问题。第一个问题是当我尝试添加summaryFunction=twoClasssummary并进行调整时,出现以下情况:

Error in trainControl(Sale ~ ., data = CTrain, method = "gbm", metric = "ROC",  : 
  unused arguments (data = CTrain, metric = "ROC", trControl = ctrl)

如果我决定绕过summaryFunction,那么第二个问题是当我尝试运行模型时,会出现以下错误:
Error in evalSummaryFunction(y, wts = weights, ctrl = trControl, lev = classLevels,  : 
  train()'s use of ROC codes requires class probabilities. See the classProbs option of trainControl()
In addition: Warning message:
In train.default(x, y, weights = w, ...) :
  cannnot compute class probabilities for regression

我尝试在Excel中将输出变量从数值1或0更改为文本值,但这没有任何影响。

请帮忙解决它将此模型解释为回归模型的问题,或者是我遇到的第一个错误信息。

谢谢!

Will
will@nubimetrics.com


请查看如何创建可重现的示例。您已经包含了大量代码,但没有提供样本数据,因此我们无法运行它以重现相同的错误。这使得帮助您变得更加困难。 - MrFlick
好的,我会做到的!谢谢。 - Will Bunker
@WillBunker 如果您只使用内置数据集之一,验证您的错误是否仍然存在,并告诉我们要使用哪个数据集,那么它就非常接近可重现了。您可以运行data()来查看caret中的数据集,例如GermanCredit - Hack-R
好的,太棒了。我会用GermanCredit运行它并尝试一下。感谢您的考虑。 - Will Bunker
@WillBunker 很酷!我也在做同样的事情。顺便问一下,gbm是什么?它不是来自于caret包吗?更新:啊,我明白了,它来自于gbm包,似乎是梯度提升。 - Hack-R
2个回答

5
你的结果是:
Sale = c(1L, 0L, 1L, 1L, 0L))

尽管gbm期望以这种方式进行,但这是一种编码数据的不太自然的方法。几乎每个其他函数都使用因子。
因此,如果您将train纳入数字0/1数据,则它会认为您想进行回归分析。如果您将其转换为因子并使用“0”和“1”作为级别(如果需要类概率),则应该看到警告,说明“至少有一个类别级别不是有效的R变量名称;如果生成类别概率,这可能会导致错误,因为变量名称将被转换为...”。这不是一个闲言碎语的警告。
请使用有效的R变量名称作为因子级别,您就可以正常运行了。

嗨Max,感谢你的建议。我不确定为什么在使用dp(head)后数据显示出那样的情况。实际上,我正在运行caret包的数据编码为Sale:0/1,但是像Hack-R指出的那样,我认为我的问题是认为我可以将traincontrol用作train。 - Will Bunker

3

我能够使用data(GermanCredit)数据集重现您的错误。

您的错误来自于将trainControl用作gbmtrain或其他内容。

如果您使用?trainControl查看文档,则会发现它要求的输入与您提供的输入非常不同。

以下代码可行:

require(caret)
require(gbm)
data(GermanCredit)

# Your dependent variable was Sale and it was binary
#   in place of Sale I will use the binary variable Telephone 

C      <- GermanCredit
C$Sale <- GermanCredit$Telephone

inTrainingset<-createDataPartition(C$Sale, p=.75, list=FALSE)
CTrain<-C[inTrainingset,]
CTest<-C[-inTrainingset,]
set.seed(123)
seeds <- vector(mode = "list", length = 51)
for(i in 1:50) seeds[[i]] <- sample.int(1000, 22)

gbmfit<-gbm(Sale~Age+ResidenceDuration, data=C,
            distribution="bernoulli",n.trees=5,interaction.depth=7,shrinkage=      .01,)
plot(gbmfit)


gbmTune<-train(Sale~Age+ResidenceDuration,data=CTrain, method="gbm")


ctrl<-trainControl(method="repeatedcv",repeats=5)
gbmTune<-train(Sale~Age+ResidenceDuration,data=CTrain, 
               method="gbm", 
               verbose=FALSE, 
               trControl=ctrl)


ctrl<-trainControl(method="repeatedcv", repeats=5, classProbs=TRUE, summaryFunction =    twoClassSummary)

# gbmTune<-trainControl(Sale~Age+ResidenceDuration, data=CTrain, 
#                       method="gbm", 
#                       metric="ROC", 
#                       verbose=FALSE , 
#                       trControl=ctrl)

gbmTune <- trainControl(method = "adaptive_cv", 
                      repeats = 5,
                      verboseIter = TRUE,
                      seeds = seeds)

grid<-expand.grid(.interaction.depth=seq(1,7, by=2), .n.trees=seq(100,300, by=50),  .shrinkage=c(.01,.1))

gbmTune<-train(Sale~Age+ResidenceDuration, data=CTrain, 
               method="gbm", 
               metric="ROC", 
               tunegrid= grid, 
               verebose=FALSE,
               trControl=ctrl)



set.seed(1)
gbmTune <- train(Sale~Age+ResidenceDuration, data = CTrain,
                 method = "gbm",
                 metric = "ROC",
                 tuneGrid = grid,
                 verbose = FALSE,
                 trControl = ctrl)

根据您想要实现的目标,您可能希望重新指定一下,但归根结底,问题只在于您将trainControl用作train


@WillBunker 不用谢。我所说的重新指定是指您可以根据自己的喜好设置选项,例如方法和选择X变量。我那里的内容应该可以工作,但我没有您的原始数据集,因此不知道哪些选择是理想的。要进行您所说的预测,您只需要在“train”语句中指定回归即可。因此,将拟合模型的系数应用于验证数据以获得预测结果。对于回归模型,可以使用“predict”、“prediction”、“predictOMatic”等方法来完成此操作。为您的问题点赞+1。 - Hack-R
没错,我之前用过predict函数,虽然不是在caret中使用的,但我猜它的运行方式应该和其他R包类似。感谢你的澄清。 - Will Bunker
谢谢提供这个资源!当我使用“seeds=seeds”运行它时,出现了未使用的参数错误。 - Will Bunker
@WillBunker 不用谢。您是说您把 seeds=seeds 放入了您的 predict 语句中吗?我没有在那个链接中看到它作为一个选项,所以我认为它应该是一个未使用的参数。不过,也许我有什么地方理解错误? - Hack-R
不好意思,我应该澄清一下。当我尝试运行你上面粘贴的代码时,使用德国数据集会出现“未使用的参数,seeds=seeds”的错误。如果方便的话,我可以在Skype上快速向你展示。 - Will Bunker
显示剩余7条评论

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