2016-03-01 2 views
2

Я знаком с r пакетом caret, но, исходя из другого языка программирования, это меня смутило.Поезд тестовый раскол в пакете `t`` `` t``

То, что я хочу сделать сейчас, это довольно простой рабочий машинного обучения, которая:

  1. Возьмите тренировочный набор, в моем случае радужной оболочки DataSet
  2. разделить его на обучения и тестового набора (80-20 раскол)
  3. Для каждого k из 1 в 20, обучать k ближайший сосед классификатор обучения на набор
  4. проверить его на тест набор

Я понимаю, как сделать первую часть, так как iris уже загружен. Затем, вторая часть делается вызовом

a <- createDataPartition(iris$Species, list=FALSE) 
training <- iris[a,] 
test <- iris[-a,] 

Теперь, я знаю, что я могу тренировать модель по телефону

library(caret) 
knnFit <- train() 
knnFit <- train(Species~., data=training, method="knn") 

Однако, это приведет к r уже выполняет некоторую оптимизацию параметров k. Конечно, я могу ограничить то, что значения k метод должен попробовать, с чем-то вроде

knnFit <- train(Species~., data=training, method="knn", tuneGrid=data.frame(k=1:20)) 

, который работает просто отлично, но он все еще не точно, что я хочу, чтобы это сделать. Этот код теперь будет делать для каждого k:

  1. взять загрузочный образец из test.
  2. ослов производительность методы k -nn с использованием данного образца

То, что я хочу, чтобы это сделать:

  1. Для каждого k, обучение модели на тот же набор поезда, который я построенный ранее
  2. Устанавливает производительность ** на тот же набор тестов, который я создал ранее.

Так что мне нужно что-то вроде

knnFit <- train(Species~., training_data=training, test_data=test, method="knn", tuneGrid=data.frame(k=1:20)) 

, но это, конечно, не работает.

Я понимаю, что я должен сделать что-то с параметром trainControl, но я вижу его возможные методы:

"boot", "boot632", "cv", "repeatedcv", "LOOCV", "LGOCV", "none" 

и ни один из них не кажется, делать то, что я хочу.

ответ

3

Если я правильно понял вопрос, это можно сделать в карете с использованием LGOCV (Leave-group-out-CV = повторный поезд/тест) и установить процент тренировки p = 0.8 и повторения разрыва поезда/испытания до number = 1, если вам действительно нужна только одна модель, подходящая для k, которая тестируется на тестовом наборе. Установка number> 1 будет неоднократно оценивать производительность модели на number различных поездах/испытаниях.

data(iris) 
library(caret) 
set.seed(123) 
mod <- train(Species ~ ., data = iris, method = "knn", 
      tuneGrid = expand.grid(k=1:20), 
      trControl = trainControl(method = "LGOCV", p = 0.8, number = 1, 
             savePredictions = T)) 

Все прогнозы, которые были сделаны с помощью различных моделей на тестовом наборе в mod$pred если savePredictions = T. Примечание rowIndex: Это строки, которые были взяты в тестовый набор. Они равны для всех разных значений k, поэтому одни и те же тренировочные/тестовые наборы используются каждый раз.

> head(mod$pred) 
    pred obs rowIndex k Resample 
1 setosa setosa  5 1 Resample1 
2 setosa setosa  6 1 Resample1 
3 setosa setosa  10 1 Resample1 
4 setosa setosa  12 1 Resample1 
5 setosa setosa  16 1 Resample1 
6 setosa setosa  17 1 Resample1 
> tail(mod$pred) 
     pred  obs rowIndex k Resample 
595 virginica virginica  130 20 Resample1 
596 virginica virginica  131 20 Resample1 
597 virginica virginica  135 20 Resample1 
598 virginica virginica  137 20 Resample1 
599 virginica virginica  145 20 Resample1 
600 virginica virginica  148 20 Resample1 

Там нет необходимости строить поезда/тестовые наборы вручную вне каретки, если какое-то вложенная prodedure проверки не требуется. Вы также можете построить кривую валидации для разных значений k на plot(mod).

+0

Похоже, это то, что я хотел, да. Спасибо! – 5xum

1

Просьба прочитать через caret website, чтобы узнать, как все работает.Или прочитайте книгу «Прикладное предсказательное моделирование», написанную Максом Куном для получения дополнительной информации о том, как работает карет.

Грубо говоря, trainControl содержит разнообразный набор параметров для функции поезда, как настройки кросс-проверки, метрики применить (ROC/RMSE), отбор проб, предварительную обработку и т.д.

В поезде вы можете установить дополнительные параметры, такие как поиск в сетке. Я расширил ваш пример кода, чтобы он работал. Не забудьте проверить, как работает createDataPartition, потому что по умолчанию эта настройка разделяет данные пополам.

library(caret) 

a <- createDataPartition(iris$Species, p = 0.8, list=FALSE) 
training <- iris[a,] 
test <- iris[-a,] 

knnFit <- train(Species ~ ., 
       data = training, 
       method="knn", 
       tuneGrid=data.frame(k=1:20)) 

knn_pred <- predict(knnFit, newdata = test) 

EDIT на основе комментариев:

То, что вы хотите, не представляется возможным с одного объекта на поезде. Поезд будет использовать tunegrid, чтобы найти лучший k и использовать этот результат в finalModel. Этот finalModel будет использоваться для составления прогнозов.

Если вы хотите получить общий обзор всех k, вы можете не использовать функцию поезда в карете, а написать функцию для себя. Может быть, что-то вроде ниже. Заметим, что knn3 - это модель knn из каретки.

k <- 20 
knn_fit_list <- list() 
knn_pred_list <- list() 

for (i in 1:k) { 
    knn_fit_list[[i]] <- knn3(Species ~ ., 
          data = training, 
          k = i) 
    knn_pred_list[[i]] <- predict(knn_fit_list[[i]], newdata = test, type = "class") 

} 

knn_fit_list будет содержать все установленные модели для указанного числа k. knn_pred_list будет содержать все предсказания.

+0

Прошу прощения, если мой вопрос был немного неясным, но я не думаю, что это на него отвечает. Я понимаю параметры tuneGrid, поэтому я использовал его в своем примере кода. Я хочу иметь код, похожий на ваш, но тот, который вернет предсказание ** для каждого ** значения 'k' в наборе обучения. Надеюсь, мое объяснение стало более ясным. – 5xum

+0

Я также обновил свой вопрос, чтобы сделать его более понятным. – 5xum

Смежные вопросы