Я тестирую прогнозирующую способность отдельных объектов на цели двоичной классификации с 10-кратным повторным CV. Мои данные нормализованы в диапазоне 0-1. Здесь меня интересует только возможность прогнозирования возможности x
на классификационных ярлыках target
, однако я включил другие единственные функции для проверки моей проблемы, y
и z
.
Я также использовал createResample
для создания загрузочных выборок для каждого из повторов.
Один из используемых мной алгоритмов - это локализованный LDA (loclda
) из klaR
* 1012. * пакет .
Мой рабочий процесс довольно стандартный и выглядит следующим образом:
library(tidyverse)
library(caret)
set.seed(1)
training_index <- createDataPartition(y = dump[["target"]],
p = 0.75,
list = F)
data_training <- dump[training_index,]
data_testing <- dump[-training_index,]
fitControl <- trainControl(method = "repeatedcv",
repeats = 10,
number = 10,
classProbs = TRUE,
index = createResample(data_training$target, 10),
summaryFunction = twoClassSummary,
returnData = F,
trim = T)
output <- train(
reformulate("x", response = "target"),
data = data_training,
method = "loclda",
trControl = fitControl,
metric = "ROC"
)
В процессе обучения я продолжаю приближаться к ошибке (для Resample1
до Resample10
):
Ошибка в {: задача 1 не выполнена - «отсутствует значение, где необходимо ИСТИНА / ЛОЖЬ» Дополнительно: Предупреждающие сообщения: 1: сбой прогнозов для Resample1: k = 25 Ошибка в if (any (wt <0) || ( s <- sum (wt)) == 0) stop («веса должны быть неотрицательными и не равными нулю»): пропущенное значение, где требуется TRUE / FALSE </p>
Я попытался посмотреть на источник код за train
и loclda
, но это не сильно помогло.
Я попытался воссоздать аналогичный набор данных с набором данных diamonds
, и, похоже, это работает нормально.
diamonds <- diamonds
diamonds <- diamonds %>% filter(color == "E", clarity == "VVS1")
diamonds <- diamonds %>% group_by(table) %>% mutate_at(c("x", "y", "z"), BBmisc::normalize, "range") %>% ungroup()
dump <- diamonds %>% mutate(target = case_when(cut %in% c("Good") ~ "Select",
TRUE ~ "Poor"))
Мой фактический набор данных находится здесь: https://pastebin.com/yYqp2Rc8
Новая информация
Я установил verboseIter на T и получился вывод, подобный следующему:
+ Resample01: k= 25 predictions failed for Resample01: k= 25 Error in if (any(wt < 0) || (s <- sum(wt)) == 0) stop("weights must be non-negative and not all zero") : missing value where TRUE/FALSE needed
+ Resample01: k=105
- Resample01: k=105
+ Resample01: k=185
- Resample01: k=185
+ Resample02: k= 25 predictions failed for Resample02: k= 25 Error in if (any(wt < 0) || (s <- sum(wt)) == 0) stop("weights must be non-negative and not all zero") : missing value where TRUE/FALSE needed
. . .
- Resample09: k=185
+ Resample10: k= 25 predictions failed for Resample10: k= 25 Error in if (any(wt < 0) || (s <- sum(wt)) == 0) stop("weights must be non-negative and not all zero") : missing value where TRUE/FALSE needed
+ Resample10: k=105
- Resample10: k=105
+ Resample10: k=185
- Resample10: k=185
Таким образом, каретка использует k как 25, 105 и 185 для настройки в сетке для поиска loclda. Похоже, что он работает нормально, когда k = 105 или 185, но не 25. Я озадачен, почему веса будут отрицательными или равны 0. Стандартная версия моего набора данных и мой набор данных с необработанными числами работали нормально.