2013-08-23 3 views
24

Я построил модель с использованием функции каретки. Когда обучение было закончено, я получил следующее предупреждение:Ошибка при попытке предсказать вероятности классов в R - caret

Предупреждения Сообщения: В train.default (х, у, вес = ш, ...): По крайней мере один из уровней классов не действительно R имена переменных; Это может привести к ошибкам, если вероятности класса генерируются, поскольку имена переменных будут преобразованы в: X0, X1

Имена переменных:

 str(train) 
'data.frame': 7395 obs. of 30 variables: 
$ alchemy_category    : Factor w/ 13 levels "arts_entertainment",..: 2 8 6 6 11 6 1 6 3 8 ... 
$ alchemy_category_score  : num 3737 2052 4801 3816 3179 ... 
$ avglinksize     : num 2.06 3.68 2.38 1.54 2.68 ... 
$ commonlinkratio_1    : num 0.676 0.508 0.562 0.4 0.5 ... 
$ commonlinkratio_2    : num 0.206 0.289 0.322 0.1 0.222 ... 
$ commonlinkratio_3    : num 0.0471 0.2139 0.1202 0.0167 0.1235 ... 
$ commonlinkratio_4    : num 0.0235 0.1444 0.0426 0 0.0432 ... 
$ compression_ratio    : num 0.444 0.469 0.525 0.481 0.446 ... 
$ embed_ratio     : num 0 0 0 0 0 0 0 0 0 0 ... 
$ frameTagRatio     : num 0.0908 0.0987 0.0724 0.0959 0.0249 ... 
$ hasDomainLink     : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ... 
$ html_ratio     : num 0.246 0.203 0.226 0.266 0.229 ... 
$ image_ratio     : num 0.00388 0.08865 0.12054 0.03534 0.05047 ... 
$ is_news      : Factor w/ 2 levels "0","1": 2 2 2 2 2 1 2 1 2 1 ... 
$ lengthyLinkDomain    : Factor w/ 2 levels "0","1": 2 2 2 1 2 1 1 1 1 2 ... 
$ linkwordscore     : num 24 40 55 24 14 12 21 5 17 14 ... 
$ news_front_page    : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ... 
$ non_markup_alphanum_characters: num 5424 4973 2240 2737 12032 ... 
$ numberOfLinks     : num 170 187 258 120 162 55 93 132 194 326 ... 
$ numwords_in_url    : num 8 9 11 5 10 3 3 4 7 4 ... 
$ parametrizedLinkRatio   : num 0.1529 0.1818 0.1667 0.0417 0.0988 ... 
$ spelling_errors_ratio   : num 0.0791 0.1254 0.0576 0.1009 0.0826 ... 
$ label       : Factor w/ 2 levels "0","1": 1 2 2 2 1 1 2 1 2 2 ... 
$ isVideo      : Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 1 1 ... 
$ isFashion      : Factor w/ 2 levels "0","1": 1 1 1 1 2 1 2 1 2 1 ... 
$ isFood      : Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ... 
$ hasComments     : Factor w/ 2 levels "0","1": 1 2 2 2 2 1 2 2 1 2 ... 
$ hasGoogleAnalytics   : Factor w/ 2 levels "0","1": 1 1 1 1 2 1 2 2 2 1 ... 
$ hasInlineCSS     : Factor w/ 2 levels "0","1": 1 2 2 2 1 1 2 1 2 2 ... 
$ noOfMetaTags     : num 10 12 6 10 13 2 6 6 9 5 ... 

Мой код выглядит следующим образом:

ctrl <- trainControl(method = "CV", 
        number=10, 
        classProbs = TRUE, 
        allowParallel = TRUE, 
        summaryFunction = twoClassSummary) 

set.seed(476) 
rfFit <- train(formula, 
       data=train, 
       method = "rf", 
       tuneGrid = expand.grid(.mtry = seq(4,20,by=2)), 
       ntrees=1000, 
       importance = TRUE, 
       metric = "ROC", 
       trControl = ctrl) 


pred <- predict.train(rfFit, newdata = test, type = "prob") 

я получаю ошибку: ошибки в [.data.frame (из,, obsLevels, падение = FALSE): неопределенных столбцов выбранной

Имена переменных на множестве тестовых данных являются:

str(test) 
'data.frame': 3171 obs. of 29 variables: 
$ alchemy_category    : Factor w/ 13 levels "arts_entertainment",..: 8 4 12 4 10 12 12 8 1 2 ... 
$ alchemy_category_score  : num 5307 4825 1 6708 5416 ... 
$ avglinksize     : num 2.56 3.77 2.27 2.52 1.85 ... 
$ commonlinkratio_1    : num 0.39 0.462 0.496 0.706 0.471 ... 
$ commonlinkratio_2    : num 0.257 0.205 0.385 0.346 0.161 ... 
$ commonlinkratio_3    : num 0.0441 0.0513 0.1709 0.123 0.0323 ... 
$ commonlinkratio_4    : num 0.0221 0 0.1709 0.0906 0 ... 
$ compression_ratio    : num 0.49 0.782 1.25 0.449 0.454 ... 
$ embed_ratio     : num 0 0 0 0 0 0 0 0 0 0 ... 
$ frameTagRatio     : num 0.0671 0.0429 0.0588 0.0581 0.093 ... 
$ hasDomainLink     : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ... 
$ html_ratio     : num 0.23 0.366 0.162 0.147 0.244 ... 
$ image_ratio     : num 0.19944 0.08 10 0.00596 0.03571 ... 
$ is_news      : Factor w/ 2 levels "0","1": 2 1 1 2 2 1 1 2 1 1 ... 
$ lengthyLinkDomain    : Factor w/ 2 levels "0","1": 2 2 2 2 1 2 2 1 1 1 ... 
$ linkwordscore     : num 15 62 42 41 34 35 15 22 41 7 ... 
$ news_front_page    : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ... 
$ non_markup_alphanum_characters: num 5643 382 2420 5559 2209 ... 
$ numberOfLinks     : num 136 39 117 309 155 266 55 145 110 1 ... 
$ numwords_in_url    : num 3 2 1 10 10 7 1 9 5 0 ... 
$ parametrizedLinkRatio   : num 0.2426 0.1282 0.5812 0.0388 0.0968 ... 
$ spelling_errors_ratio   : num 0.0806 0.1765 0.125 0.0631 0.0653 ... 
$ isVideo      : Factor w/ 2 levels "0","1": 1 2 1 2 2 2 1 1 2 2 ... 
$ isFashion      : Factor w/ 2 levels "0","1": 1 1 1 1 1 2 1 1 1 1 ... 
$ isFood      : Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ... 
$ hasComments     : Factor w/ 2 levels "0","1": 2 1 1 2 2 2 1 2 2 1 ... 
$ hasGoogleAnalytics   : Factor w/ 2 levels "0","1": 1 2 2 2 2 1 1 2 1 1 ... 
$ hasInlineCSS     : Factor w/ 2 levels "0","1": 2 2 2 1 1 2 2 2 1 1 ... 
$ noOfMetaTags     : num 3 6 5 9 16 22 6 9 7 0 ... 

Если я опускаю тип = «проб» часть, я не получаю сообщение об ошибке.

Любые идеи?

Это может быть длина переменной «alchemy_category», которая добавляется с соответствующими уровнями факторов, например. «alchemy_categoryarts_entertainment» внутри модели?

+0

Это не длина этих переменных. Я сократил их, но проблема остается. – Stergios

+0

Я удалил все факторы (за исключением переменной ответа, конечно), и я продолжаю получать ту же ошибку! – Stergios

+1

Установите 'classProbs = FALSE' в' trainControl' –

ответ

36

Ответ выделены жирным шрифтом в верхней части вашего поста =]

Что вы моделирования? Это alchemy_category? Код только говорит formula, и мы не можем его увидеть.

Когда вы запрашиваете вероятности классов, предсказания модели представляют собой кадр данных с отдельными столбцами для каждого класса/уровня. Если alchemy_category не имеет уровней, которые являются допустимыми именами столбцов, то data.frame преобразует, а затем в действительные имена. Это создает проблему, потому что код ищет определенное имя, но кадр данных как другое (но действительное) имя.

Например, если бы я был

> test <- factor(c("level1", "level 2")) 
> levels(test) 
[1] "level 2" "level1" 
> make.names(levels(test)) 
[1] "level.2" "level1" 

код будет искать «уровень 2», но есть только «level.2».

+0

Извините, я не включил здесь свою формулу. Я моделирую «метку», поэтому «0» или «1». Что значит «ответ выделен жирным шрифтом в верхней части моего сообщения =]» ?? Я не понимаю. – Stergios

+6

@Stergios Он означает, что приведенное вами предупреждающее сообщение объясняет, что происходит не так. Поскольку «0» и «1» не являются допустимыми именами переменных R, вы получаете ошибки при генерировании вероятностей класса. –

+9

Хорошо Объяснение. У меня были классы как 0 и 1, и он продолжал сбой из-за вышеупомянутого сообщения об ошибке. Изменение этих параметров на «Нет» и «Да» устранило проблему. – xbsd

9

Я прочитал ответы выше, столкнувшись с аналогичной проблемой. Формальное решение заключается в том, чтобы сделать это на поезде и тестовых наборах данных. Убедитесь, что вы также включили переменную ответа в имена функций.

feature.names=names(train) 

for (f in feature.names) { 
    if (class(train[[f]])=="factor") { 
    levels <- unique(c(train[[f]])) 
    train[[f]] <- factor(train[[f]], 
        labels=make.names(levels)) 
    } 
} 

Это создает синтаксически правильные метки для всех факторов.

+0

Это действительно работает !! Спасибо! – Jojo

0

Как и в предыдущем примере, обычно рефинансирование переменной результата исправляет проблему. Это лучше изменить в исходном наборе данных перед разделением на учебные и поверочные наборы данных

< уровней - уникальный (данные $ результат) данные $ исход < - фактор (данные $ результата, этикетки = сделать.Имена (уровни))

Как другие указывали ранее, эта проблема возникает только тогда, когда classProbs = TRUE, которая вызывает функцию поезда для получения дополнительных статистических данных, относящихся к итоговому класса

9

Как указано выше значений класса должны быть факторами и должны быть действительными именами. Другой способ обеспечить это,

levels(all.dat$target) <- make.names(levels(factor(all.dat$target))) 
0

Как Firke @ Сэм уже отмечалось в комментариях (но я проглядел его) уровни TRUE/FALSE также не работают. Поэтому я преобразовал их в yes/no.