首页 文章

在R中运行Caret包时出错

提问于
浏览
3

我正在尝试构建一个模型来预测某个产品是否会在电子商务网站上以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

2 回答

  • 4

    你的结果是:

    Sale = c(1L, 0L, 1L, 1L, 0L))
    

    尽管 gbm 期望这样,但对数据进行编码却是非常不自然的方式 . 几乎所有其他功能都使用因子 .

    因此,如果您提供 train 数字0/1数据,它会认为您要进行回归 . 如果将此转换为因子并使用"0"和"1"作为级别(如果您需要类概率),您应该看到一个警告,其中显示"At least one of the class levels are not valid R variables names; This may cause errors if class probabilities are generated because the variables names will be converted to..." . 这不是一个空闲的警告 .

    使用有效R变量名称的因子级别,你应该没问题 .

    马克斯

  • 1

    我能够使用 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 .

相关问题