При вложенной повторной выборке результаты точности классификации сильно меняются - PullRequest
0 голосов
/ 15 февраля 2019

Используя пакет mlr в R, я создаю модели случайных лесов.Для оценки точности классификации модели я использую вложенную повторную выборку, как описано в здесь .Моя проблема заключается в том, что точность классификации моделей случайных лесов во внутренних циклах обычно на 15% выше, чем результаты внешнего цикла.Я наблюдаю точность классификации ~ 85% во внутренней петле, но точность внешней петли обычно заканчивается около 70%.Я не могу предоставить данные здесь, но я вставляю код, который я использую.

Как это возможно?В чем может быть причина?

rf_param_set <- makeParamSet(
  ParamHelpers::makeDiscreteParam('mtry', values = c(3, 7, 14)),
  ParamHelpers::makeDiscreteParam('ntree', values = c(1000, 2000))
  )
rf_tune_ctrl <- makeTuneControlGrid()
rf_inner_resample <- makeResampleDesc('Bootstrap', iters = 5)
acc632plus <- setAggregation(acc, b632plus)
rf_learner <- makeTuneWrapper('classif.randomForest',
                              resampling = rf_inner_resample,
                              measures = list(acc),
                              par.set = rf_param_set,
                              control = rf_tune_ctrl,
                              show.info = TRUE)
# rf_outer_resample <- makeResampleDesc('Subsample', iters = 10, split = 2/3)
rf_outer_resample <- makeResampleDesc('Bootstrap', iters = 10, predict = 'both')
rf_result_resample <- resample(rf_learner, clf_task,
                               resampling = rf_outer_resample,
                               extract = getTuneResult,
                               measures = list(acc, acc632plus),
                               show.info = TRUE)

Вы можете получить результат ниже.

Resampling: OOB bootstrapping
Measures:             acc.train   acc.test    acc.test    
[Tune] Started tuning learner classif.randomForest for parameter set:
          Type len Def    Constr Req Tunable Trafo
mtry  discrete   -   -    3,7,14   -    TRUE     -
ntree discrete   -   - 1000,2000   -    TRUE     -
With control class: TuneControlGrid
Imputation value: -0
[Tune-x] 1: mtry=3; ntree=1000
[Tune-y] 1: acc.test.mean=0.8415307; time: 0.1 min
[Tune-x] 2: mtry=7; ntree=1000
[Tune-y] 2: acc.test.mean=0.8405726; time: 0.1 min
[Tune-x] 3: mtry=14; ntree=1000
[Tune-y] 3: acc.test.mean=0.8330845; time: 0.1 min
[Tune-x] 4: mtry=3; ntree=2000
[Tune-y] 4: acc.test.mean=0.8415809; time: 0.3 min
[Tune-x] 5: mtry=7; ntree=2000
[Tune-y] 5: acc.test.mean=0.8395083; time: 0.3 min
[Tune-x] 6: mtry=14; ntree=2000
[Tune-y] 6: acc.test.mean=0.8373584; time: 0.3 min
[Tune] Result: mtry=3; ntree=2000 : acc.test.mean=0.8415809
[Resample] iter 1:    0.9961089   0.7434555   0.7434555   
[Tune] Started tuning learner classif.randomForest for parameter set:
          Type len Def    Constr Req Tunable Trafo
mtry  discrete   -   -    3,7,14   -    TRUE     -
ntree discrete   -   - 1000,2000   -    TRUE     -
With control class: TuneControlGrid
Imputation value: -0
[Tune-x] 1: mtry=3; ntree=1000
[Tune-y] 1: acc.test.mean=0.8479891; time: 0.1 min
[Tune-x] 2: mtry=7; ntree=1000
[Tune-y] 2: acc.test.mean=0.8578465; time: 0.1 min
[Tune-x] 3: mtry=14; ntree=1000
[Tune-y] 3: acc.test.mean=0.8556608; time: 0.1 min
[Tune-x] 4: mtry=3; ntree=2000
[Tune-y] 4: acc.test.mean=0.8502869; time: 0.3 min
[Tune-x] 5: mtry=7; ntree=2000
[Tune-y] 5: acc.test.mean=0.8601446; time: 0.3 min
[Tune-x] 6: mtry=14; ntree=2000
[Tune-y] 6: acc.test.mean=0.8586638; time: 0.3 min
[Tune] Result: mtry=7; ntree=2000 : acc.test.mean=0.8601446
[Resample] iter 2:    0.9980545   0.7032967   0.7032967   
[Tune] Started tuning learner classif.randomForest for parameter set:
          Type len Def    Constr Req Tunable Trafo
mtry  discrete   -   -    3,7,14   -    TRUE     -
ntree discrete   -   - 1000,2000   -    TRUE     -
With control class: TuneControlGrid
Imputation value: -0
[Tune-x] 1: mtry=3; ntree=1000
[Tune-y] 1: acc.test.mean=0.8772566; time: 0.1 min
[Tune-x] 2: mtry=7; ntree=1000
[Tune-y] 2: acc.test.mean=0.8750990; time: 0.1 min
[Tune-x] 3: mtry=14; ntree=1000
[Tune-y] 3: acc.test.mean=0.8730733; time: 0.1 min
[Tune-x] 4: mtry=3; ntree=2000
[Tune-y] 4: acc.test.mean=0.8782829; time: 0.3 min
[Tune-x] 5: mtry=7; ntree=2000
[Tune-y] 5: acc.test.mean=0.8741619; time: 0.3 min
[Tune-x] 6: mtry=14; ntree=2000
[Tune-y] 6: acc.test.mean=0.8687918; time: 0.3 min
[Tune] Result: mtry=3; ntree=2000 : acc.test.mean=0.8782829
[Resample] iter 3:    0.9902724   0.7329843   0.7329843  

1 Ответ

0 голосов
/ 15 февраля 2019

То, что вы видите, является именно той причиной, по которой вы хотите использовать вложенную повторную выборку - внутренняя петля повторной выборки переходит (в некоторой степени) к данным и дает ложное представление о производительности обобщения.С помощью внешней передискретизации вы можете обнаружить это (точность ниже).

Учебник mlr содержит гораздо более подробную страницу по этой теме (https://mlr.mlr -org.com / articles / tutorial /)nested_resampling.html ).В общем, вы не видите эти результаты, потому что вы делаете что-то не так (если вы не разделяете данные вручную определенным образом), вы просто используете мощный метод оптимизации, который оптимизирует немного больше, чем должен - новы обнаруживаете это с помощью вложенной повторной выборки.

Вы можете попытаться использовать перекрестную проверку вместо начальной загрузки;это может обеспечить более последовательные результаты.

...