Пакет Caret для R. Какие образцы протянуты?

Я использую пакет Caret, чтобы поиграть со многими методами классификации. В настоящее время я хочу использовать метод перекрестной проверки с выходом из группы (я знаю, что есть методы получше).

Это управление поездом, которое я использую:

train_control <- trainControl(method = "LGOCV", p = .7, number = 1)

Мой вопрос заключается в том, когда я применяю его с помощью функции поезда, например.

model <- train(Type ~ ., data=training, method = "rpart", trControl = train_control)

Как я могу получить доступ к образцам, которые использовались для обучения, и образцам в группе, которые были отложены?

Спасибо


person Andy T    schedule 10.03.2015    source источник


Ответы (1)


Давайте посмотрим на это на примере:

Прежде всего, вам нужно указать еще один аргумент функции trainControl, returnResamp='all', чтобы она возвращала информацию обо всех повторных выборках.

Пример данных:

#classification example
y  <- rep(c(0,1), c(25,25))
x1 <- runif(50)
x2 <- runif(50)
df <- data.frame(y,x1,x2)

Решение:

Ваш код должен быть таким (я использую number=2 ниже, чтобы вы могли видеть, как это работает):

#notice the returnResamp argument set to 'all'
train_control <- trainControl(method = "LGOCV", p = .7, number = 2, returnResamp='all')

model <- train(y ~ ., data=df, method = "rpart", trControl = train_control)

Теперь, чтобы получить доступ к ресемплам, вы делаете следующее:

> model$control$index
$Resample1
 [1]  1  3  4  5  6  7  9 10 12 13 15 16 17 18 20 21 22 23 26 27 28 29 30 34 35 36 37 38 39 40 41 42 43 44 45 46

$Resample2
 [1]  2  3  4  5  6  9 11 12 13 14 15 16 17 19 20 21 24 25 26 28 29 30 31 33 34 35 36 37 38 40 41 42 45 47 49 50

Приведенные выше числа показывают номера строк, которые сохранялись в обучающем наборе для каждой повторной выборки. Очевидно, что все остальные являются исключенной группой.

Чтобы подтвердить это (например, для resample1):

> nrow(df[model$control$index$Resample1,])
[1] 36 #36 observations kept in training set
> 36/50
[1] 0.72 #36/50 = 0.72 is the number specified in p

И для доступа к строкам вы делаете это (опять же для resample1 в качестве примера):

> df[model$control$index$Resample1,]
   y           x1         x2
1  0 0.9706626355 0.90786863
3  0 0.5664755146 0.66014308
4  0 0.5540436453 0.95919639
5  0 0.1941235152 0.60869461
6  0 0.7966452301 0.64245296
7  0 0.1021302647 0.50045568
9  0 0.9963372331 0.86199347
10 0 0.0641849677 0.83714478
12 0 0.0007932109 0.83086593
13 0 0.7914607469 0.98313602
15 0 0.4176381815 0.26584837
16 0 0.8913181033 0.78030297
17 0 0.3896608590 0.40215619
18 0 0.6155101282 0.50859816
20 0 0.4252773556 0.73868264
21 0 0.9494552673 0.96442255
22 0 0.6675511154 0.35240024
23 0 0.6931768688 0.42016284
26 1 0.6049248914 0.85045559
27 1 0.8878736692 0.20937898
28 1 0.0881897225 0.49006904
29 1 0.3561574069 0.87316667
30 1 0.7379366003 0.57722477
34 1 0.0762609572 0.85021965
...
...
...

То же самое со знаком минус даст вам пропущенные наблюдения для повторной выборки:

> df[-model$control$index$Resample1,]
   y          x1         x2
2  0 0.495293215 0.16392350
8  0 0.057934150 0.90044716
11 0 0.794459804 0.46207494
14 0 0.268692204 0.80763156
19 0 0.515704584 0.82078298
24 0 0.031054236 0.40846695
25 0 0.218243275 0.40132438
31 1 0.694632679 0.36696466
32 1 0.002055724 0.99023235
33 1 0.584879035 0.37515622
....
....
person LyzandeR    schedule 10.03.2015
comment
Это был именно тот ответ, который я искал! Я ценю ваше время. - person Andy T; 10.03.2015
comment
Искренне рад, что смог быть полезен :) - person LyzandeR; 10.03.2015