Предупреждающее сообщение: "Отсутствующие значения в параметрах повторной дискретизации" в карете() с использованием rpart
Я использую пакет каретки для обучения модели с пакетом "rpart";
tr = train(y ~ ., data = trainingDATA, method = "rpart")
Данные не имеют отсутствующих значений или NA, но при запуске команды появляется предупреждающее сообщение;
Warning message:
In nominalTrainWorkflow(x = x, y = y, wts = weights, info = trainInfo, :
There were missing values in resampled performance measures.
Кто-нибудь знает (или может указать мне, где найти ответ), что означает это предупреждение?
Я знаю, что это говорит мне, что в параметризированных показателях производительности отсутствовали значения, но что это точно означает и как может возникнуть такая ситуация?
BTW, функция predict()
отлично работает с установленной моделью, так что это просто мое любопытство.
Ответы
Ответ 1
Не определенно без дополнительных данных.
Если это регрессия, наиболее вероятным случаем является то, что дерево не нашло хорошего раскола и использовало среднее значение результата в качестве предиктора. Это прекрасно, но вы не можете вычислить R ^ 2, так как дисперсия предсказаний равна нулю.
Если классификация, трудно сказать. У вас может быть resample, где один из классов результатов имеет нулевые образцы, поэтому чувствительность или специфичность undefined и, следовательно, NA
.
Ответ 2
Для другого метода у меня возникла ошибка, и это предупреждение "В параметрах производительности с дискретизированными параметрами отсутствовали значения". при установке verbose = TRUE (возможно, для установки verbose = FALSE может что-то изменить).
Ответ 3
Эта ошибка возникает, когда модель не сходится в некоторых сгибах перекрестной проверки, прогнозы получают нулевую дисперсию. В результате метрики, такие как RMSE или Rsquared, не могут быть рассчитаны, поэтому они становятся NA. Иногда есть параметры, которые вы можете настроить для лучшей конвергенции, например, библиотека нейронной сети предлагает увеличить порог, который почти всегда приводит к конвергенции. Тем не менее, я не уверен насчет библиотеки rpart.
Другая причина для этого состоит в том, что у вас уже есть NA в ваших данных обучения. Тогда очевидное лекарство - это удалить их перед тем, как проехать на поезде (data = na.omit(training.data)).
Надеюсь, что немного просветляет.
Ответ 4
Проблема
Проблема заключается в том, что rpart использует алгоритм на основе дерева, который может обрабатывать только ограниченное число факторов в данной функции. Таким образом, у вас может быть переменная, которая была установлена с коэффициентом более чем с 53 категориями:
> rf.1 <- randomForest(x = rf.train.2,
+ y = rf.label,
+ ntree = 1000)
Error in randomForest.default(x = rf.train.2, y = rf.label, ntree = 1000) :
Can not handle categorical predictors with more than 53 categories.
В основе вашей проблемы, карет работает эта функция, поэтому убедитесь, что вы фиксируете свои категориальные переменные с более чем 53 уровнями.
Вот где моя проблема лгала раньше (обратите внимание на индекс zipcode как фактор):
# ------------------------------- #
# RANDOM FOREST WITH CV 10 FOLDS #
# ------------------------------- #
rf.train.2 <- df_train[, c("v1",
"v2",
"v3",
"v4",
"v5",
"v6",
"v7",
"v8",
"zipcode",
"price",
"made_purchase")]
rf.train.2 <- data.frame(v1=as.factor(rf.train.2$v1),
v2=as.factor(rf.train.2$v2),
v3=as.factor(rf.train.2$v3),
v4=as.factor(rf.train.2$v4),
v5=as.factor(rf.train.2$v5),
v6=as.factor(rf.train.2$v6),
v7=as.factor(rf.train.2$v7),
v8=as.factor(rf.train.2$v8),
zipcode=as.factor(rf.train.2$zipcode),
price=rf.train.2$price,
made_purchase=as.factor(rf.train.2$made_purchase))
rf.label <- rf.train.2[,"made_purchase"]
Решение
Удалить все категориальные переменные, которые имеют более 53 уровней.
Вот мой исправленный код, регулирующий zipcode категориальной переменной, вы можете даже обернуть его в числовую оболочку следующим образом: as.numeric(rf.train.2$zipcode)
.
# ------------------------------- #
# RANDOM FOREST WITH CV 10 FOLDS #
# ------------------------------- #
rf.train.2 <- df_train[, c("v1",
"v2",
"v3",
"v4",
"v5",
"v6",
"v7",
"v8",
"zipcode",
"price",
"made_purchase")]
rf.train.2 <- data.frame(v1=as.factor(rf.train.2$v1),
v2=as.factor(rf.train.2$v2),
v3=as.factor(rf.train.2$v3),
v4=as.factor(rf.train.2$v4),
v5=as.factor(rf.train.2$v5),
v6=as.factor(rf.train.2$v6),
v7=as.factor(rf.train.2$v7),
v8=as.factor(rf.train.2$v8),
zipcode=rf.train.2$zipcode,
price=rf.train.2$price,
made_purchase=as.factor(rf.train.2$made_purchase))
rf.label <- rf.train.2[,"made_purchase"]