2014-10-15 5 views
3

Я пытаюсь построить модель, чтобы предсказать, будет ли продукт продаваться на веб-сайте электронной торговли с 1 или 0, являющимся результатом.Ошибки при запуске пакета Caret в R

Мои данные представляют собой несколько категориальных переменных: один с большим количеством уровней, пару двоичных и один непрерывный (цена) с выходной переменной 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 (Продажа ~, данных = CTrain, метод = "GBM", метрический = "РПЦ",:. неиспользованными аргументы (данные = CTrain, метрика = «РПЦ», trControl = Ctrl)

вторая проблема, если я решу выполняется в обход summaryFunction, когда я пытаюсь запустить модель я получаю эту ошибку:

ошибка в evalSummaryFunction (y, wts = weight, ctrl = trControl, lev = classLevels,: Для использования кодов ROC для использования (() ROC требуется класс вероятности. См. параметр classProbs для trainControl() Кроме того: предупреждение: В train.default (х, у, вес = ш, ...): cannnot вычисления вероятности класса для регрессии

Я попытался изменить выходную переменную с числовым значением 1 или 0 , только текстовое значение, в excel, но это не изменило ситуацию.

Любая помощь будет принята с благодарностью за то, как исправить факт, что она интерпретирует эту модель как регрессию или первое сообщение об ошибке, с которым я сталкиваюсь.

Бест,

Will [email protected]

+0

Пожалуйста, ознакомьтесь с [как сделать воспроизводимый пример] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). Вы включили кучу кода, но без выборочных данных, поэтому мы не можем запустить его, чтобы воспроизвести ту же ошибку. Это затрудняет вам помощь. – MrFlick

+0

Правильно, я сделаю это! Спасибо –

+0

@WillBunker, это довольно близко к воспроизводимому, если вы можете просто использовать один из встроенных наборов данных, убедитесь, что ваши ошибки все еще существуют с этими данными, и дайте нам знать, какой из них использовать. Вы можете запустить 'data()', чтобы увидеть наборы данных в 'caret', например' GermanCredit' –

ответ

1

Я был в состоянии воспроизвести вашу ошибку, используя 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.

+0

Хорошо, я думаю, я был глуп, чтобы предположить, что пример, с которым работал, был достаточно похож, поэтому я мог бы воспроизвести ту же проблему с моим набором данных. Большое спасибо. Когда вы говорите, уточните, есть ли у вас предложения двигаться вперед? Ответ на мой вопрос прост, предскажите результат листинга продукта: Sale или No Sale, исполнение намного сложнее, естественно. Спасибо еще раз за помощь. –

+0

@WillBunker Добро пожаловать. Посредством respiseify я имел в виду, что вы можете установить параметры по своему вкусу, такие как метод, и выбрать свои X-переменные. То, что у меня там, должно работать, но у меня нет оригинального набора данных, поэтому я не знаю, какой выбор идеален. Чтобы сделать предсказание, о котором вы говорите, вам просто нужен регресс, который указывается в инструкциях 'train'. Поэтому возьмите свои модели и примените коэффициенты к данным валидации, чтобы получить прогнозы. С регрессионными моделями это можно сделать с помощью «прогноза», «предсказания», «предсказания» и т. Д. Дал вам +1 для вопроса. –

+0

Правильно, я использовал функцию предсказания раньше, а не в карете, но я предполагаю, что она работает аналогично другим r-пакетам. Спасибо за разъяснения. –

4

Ваш результат:

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

Хотя gbm ожидает его таким образом, это довольно неестественно способ кодирования данных. Почти каждая другая функция использует факторы.

Так что если вы дадите train числовые данные 0/1, он думает, что вы хотите сделать регрессию. Если вы преобразуете это в коэффициент и используете «0» и «1» в качестве уровней (и если вы хотите вероятности класса), вы должны увидеть предупреждение, в котором говорится: «По крайней мере, один из уровней класса не является допустимым именем переменных R ; Это может вызвать ошибки, если генерируются вероятности класса, потому что имена переменных будут преобразованы в ... ". Это не простое предупреждение.

Используйте уровни факторов, которые являются действительными именами переменных R, и вы должны быть в порядке.

Max

+0

Эй, Макс, спасибо за вход. Я не уверен, почему данные оказались таким же, как после использования dp (head).Данные, которые я на самом деле запускаю в каретном пакете, кодируются как Sale: 0/1, но я думаю, что моя проблема, так как Hack-R, указывала, что я могу использовать traincontrol в качестве поезда. –

Смежные вопросы