我正在尝试构建一个模型来预测某个产品是否会在电子商务网站上以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,然后调整我得到这个:
trainControl出错(Sale~。,data = CTrain,method =“gbm”,metric =“ROC”,: 未使用的参数(data = CTrain,metric =“ROC”,trControl = ctrl)
如果我决定绕过summaryFunction,第二个问题是,当我尝试运行模型时,我得到了这个错误:
evalSummaryFunction中的错误(y,wts = weights,ctrl = trControl,lev = classLevels,: train()使用ROC代码需要类概率。查看trainControl()的classProbs选项 另外:警告信息: 在train.default(x,y,weights = w,...)中: 无法计算回归的类概率
我尝试将输出变量从数值1或0更改为excel中的文本值,但这没有什么区别。
如何解决将此模型解释为回归或我遇到的第一条错误消息这一事实,将非常感谢任何帮助。
最佳,
威尔 will@nubimetrics.com
答案 0 :(得分:4)
你的结果是:
Sale = c(1L, 0L, 1L, 1L, 0L))
虽然gbm
期望这样,但对数据进行编码却是非常不自然的方式。几乎所有其他功能都使用因子。
因此,如果您提供train
数字0/1数据,则认为您要进行回归。如果你将它转换为一个因子并使用“0”和“1”作为级别(如果你想要类概率),你应该看到一个警告说“至少有一个类级别不是有效的R变量名称” ;如果生成类概率,这可能会导致错误,因为变量名称将转换为...“。那不是空闲的警告。
使用有效R变量名称的因子级别,你应该没问题。
最高
答案 1 :(得分:2)
我能够使用data(GermanCredit)
数据集重现您的错误。
您的错误来自于使用trainControl
,就好像它是gbm
,train
或其他内容。
如果您使用?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
一样。< / p>