Возврат столбца для использования в l oop для наивных байесов в R - PullRequest
1 голос
/ 18 июня 2020

Я использую алгоритм наивного байеса в R. Основная цель - предсказать значение переменной. Но в этой конкретной задаче c я пытаюсь увидеть, какой столбец лучше предсказывает это. Это пример того, что работает (но в реальном наборе данных делать это вручную невозможно):

   library(naivebayes)
   data("mtcars")
   mtcars$vsLog <- as.logical(as.integer(mtcars$vs))
   mtcars_train <- mtcars[1:20,]
   mtcars_test <- mtcars[20:32,]
   car_model <- naive_bayes( data=mtcars_train, vsLog ~ mpg )
   predictions <- predict(car_model,mtcars_test)

У меня проблемы с выполнением for l oop, в котором модель принимает по одному столбцу за раз и сохраняет, насколько хорошо каждая модель предсказывала значения. Я рассмотрел разные способы ввода столбцов, чтобы я мог их перебирать, но не смог заставить их работать. Мой минимальный воспроизводимый пример моей проблемы:

library(naivebayes)
data("mtcars")
mtcars$vsLog <- as.logical(as.integer(mtcars$vs))
mtcars_train <- mtcars[1:20,]
mtcars_test <- mtcars[20:32,]

for (j in 1:ncol(mtcars)) {
car_model <- naive_bayes( data=mtcars_train, vsLog ~ mtcars_train[,j] )
predictions[j] <- predict(car_model,mtcars_test)
}

Проблема в как заменить мили на галлон в первом примере чем-то, что я могу oop вместо . Вещи, которые я пробовал: mtcars_train $ mpg, unlist (mtcars_train [, j]), colnames. Я действительно пробовал погуглить, надеюсь, это не слишком глупый вопрос.

Спасибо за чтение

1 Ответ

1 голос
/ 18 июня 2020

Это может быть полезно. Если вы хотите использовать for l oop, вы можете использовать seq_along с именами ваших столбцов, которые вы хотите l oop через в своем наборе данных. Вы можете использовать reformulate для создания формулы, которую вы бы выбрали vsLog в своем примере, а также j-й элемент в именах столбцов. В этом примере вы можете сохранить результаты predict в списке. Возможно, это может быть переведено на ваш настоящий набор данных.

pred_lst <- list()

mtcars_names <- names(mtcars_train)

for (j in seq_along(mtcars_names)) {
  car_model <- naive_bayes(reformulate(mtcars_names[j], "vsLog"), data=mtcars_train)
  pred_lst[[j]] <- predict(car_model, mtcars_test)
}
...