Прогнозы не выполняются из-за проблемы весов в карете - PullRequest
0 голосов
/ 26 марта 2020

Я тестирую прогнозирующую способность отдельных объектов на цели двоичной классификации с 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. Стандартная версия моего набора данных и мой набор данных с необработанными числами работали нормально.

...