在R中运行插入符号包时出错
我试图建立一个模型来预测产品是否会在电子商务网站上销售,输出值是1还是0 我的数据是一些分类变量,一个有大量的级别,一对二进制,一个连续的(价格),输出变量为1或0,无论产品列表是否售出 这是我的代码:在R中运行插入符号包时出错,r,r-caret,R,R Caret,我试图建立一个模型来预测产品是否会在电子商务网站上销售,输出值是1还是0 我的数据是一些分类变量,一个有大量的级别,一对二进制,一个连续的(价格),输出变量为1或0,无论产品列表是否售出 这是我的代码: inTrainingset<-createDataPartition(C$Sale, p=.75, list=FALSE) CTrain<-C[inTrainingset,] CTest<-C[-inTrainingset,] gbmfit<-gbm(Sale~.,
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)
如果我决定绕过Summary函数,第二个问题是,当我尝试运行该模型时,会出现以下错误:
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@nubimetrics.com我能够使用
数据(GermanCredit)
数据集重现您的错误
您的错误来自于使用列车控制
,好像它是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)
require(插入符号)
需要(gbm)
数据(德国信贷)
#你的因变量是Sale,它是二进制的
#在销售的地方,我将使用二进制变量电话
C你的结果是:
Sale = c(1L, 0L, 1L, 1L, 0L))
尽管gbm
希望这样,但对数据进行编码是非常不自然的。几乎所有其他函数都使用因子
所以,如果你给了train
数字0/1数据,它认为你想要做回归。如果您将其转换为因子,并使用“0”和“1”作为级别(如果您想要类概率),您应该看到一条警告,说明“至少有一个类级别不是有效的R变量名称;如果生成类概率,这可能会导致错误,因为变量名称将转换为…”。这不是一个无用的警告
使用有效的R变量名的因子级别,应该可以
Max请退房。您包含了大量代码,但没有样本数据,因此我们无法运行它来重现相同的错误。这让我很难帮助你。好的,我会的!Thanks@WillBunker如果您可以使用其中一个内置数据集,验证您的错误是否仍然存在,并让我们知道使用哪一个数据集,那么它非常接近于可再现性。您可以运行
data()
查看caret
中的数据集,如GermanCredit
OK cool。我会和德国信贷部合作,试试看。谢谢你的考虑。@willbunk酷!我也在做同样的事情。顺便问一下,gbm是什么?它不是来自软件包插入符号。更新:啊,我从包gbm
中看到了它,看起来是梯度增强的好吧,我想我愚蠢地认为我正在研究的例子足够相似,所以我可以用我的数据集复制相同的问题。非常感谢你。当你说“重新指定”时,你有什么进一步的建议吗?我的问题的答案很简单,预测产品上市的结果:销售或不销售,执行自然要复杂得多。再次感谢你的帮助,不客气。通过重新指定,我的意思是您可以根据自己的喜好设置选项,例如方法和选择X变量。我这里的东西应该有用,但我没有你的原始数据集,所以我真的不知道哪些选择是理想的。要进行您所说的预测,您只需要在train
语句中指定的回归。因此,采用拟合模型,将系数应用于验证数据,以获得预测。对于回归模型,这可以通过predict
,prediction
,predictOMatic
等来完成。对于这个问题,我给了你+1。对,我以前使用过predict函数,不是在插入符号中,但我假设它以与其他r包类似的方式运行。谢谢你的澄清。@willnp。这可能有助于特定于插入符号的预测:感谢您的资源!当我使用“seeds=seeds?嘿,Max,谢谢你的输入”运行它时,我得到了一个错误的、未受支持的参数。我不确定为什么在使用dp(head)后数据会显示为那样.我实际运行插入符号包的数据编码为Sale:0/1,但我认为我的问题是,正如Hack-R所指出的,我认为我可以将traincontrol用作train。
Sale = c(1L, 0L, 1L, 1L, 0L))