Случайный лесной склеарн - PullRequest
0 голосов
/ 10 октября 2018

Я в замешательстве, если для Random Forest необходима явная перекрестная проверка?В случайном лесу у нас есть образцы Out of Bag, и это можно использовать для вычисления точности теста.Явная перекрестная проверка необходима.Есть ли какая-то польза от явного использования CV в Случайном лесу?Я нахожу сбивающим с толку, чтобы понять, как CV в Случайном лесу работает на основе этого кода Вот мой код:

модель = BaggingClassifier (base_estimator = cart, n_estimators = num_trees, random_state = seed)

результаты= cross_validation.cross_val_score (модель, X, Y, cv = kfold)

печать (results.mean ())

Ответы [ 3 ]

0 голосов
/ 12 октября 2018

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

Я проиллюстрирую на (слишком упрощенном) примере:

Предположим, мы делаем регрессию для прогнозирования цен продажи домов.У вас есть набор данных 5 строк (каждая строка будет содержать характеристики определенного дома, например, YearBuilt, LivingArea, NumberOfGarages) и случайный лес с 3деревья .

Tree 1     Tree 2     Tree 3
------     ------     ------
  1                      1
  2           2       
              3          3
  4                      
              5          5

, где числа 1-5 обозначают номер строки набора данных, используемый для обучения дерева (выбранный при начальной загрузке).Тогда, например, строки 3 и 5 не используются в обучающем дереве 1 и так далее.Все до этого делается независимо от того, установлено ли OOB_score true или нет в RandomForest sklearn.

OOB

Если OOB_score установлено в true: мы проходим каждую строку внабор данных и сделайте следующее.

  • Ряд 1: только Дерево 2 не использовало его для подгонки / тренировки.Следовательно, мы прогнозируем и получаем оценку для строки 1, используя only Tree 2.
  • Row 2: только Tree 3 не использовала его для обучения.Следовательно, мы прогнозируем и получаем оценку для строки 2, используя only Tree 3.
  • ...
  • Row 4: Trees 2 и 3 не использовали его для обучения,Прогнозируемая цена продажи этого дома будет средним из прогнозов Дерева 2 и Дерева 3, но не Дерева 1.

OOB_score - это просто среднее значениеоценки прогнозов по всем строкам.

Набор проверки

Сравните это поведение с тем, если вы использовали явный набор проверки.Например, у вас будет 5 новых строк в наборе проверочных данных, и для каждой строки вы будете проходить его через ALL 3 деревьев в лесу, получать их индивидуальные прогнозы и сообщать среднее значение в качестве окончательного прогнозацена продажи для этой строки.

Затем можно сообщить среднеквадратическую ошибку (или любую другую метрику) для всего набора проверки, взяв средние значения ошибок по всем строкам.

Сводка

Подводя итог,

  • при расчете OOB_score, каждая строка прогнозируется только для подмножества деревьев в лесу.

  • Принимая во внимание, что оценка, указанная в явном наборе проверки, является результатом предсказания каждой строки с всеми деревьями в вашем лесу, что более точно отражает то, что на самом деле происходит втестовый набор.И вот, этот вариант - тот, который вам нужен.

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

Комментарий

Тем не менее, на практике две оценки (OOB против проверки) часто довольно близки.Если у вас небольшой набор данных и вы не можете позволить себе набор проверки, OOB предлагает хорошую альтернативу.

Но если ваш набор данных достаточно велик, я бы рекомендовал отложить явный набор проверки (или выполнить перекрестную проверку)) тем не мение.В этом случае OOB_score - это просто дополнительная метрика, по которой можно судить о вашей модели, но вы должны придавать более высокий приоритет баллу проверки.Работайте над улучшением этого показателя.


Вторая причина

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

В качестве примера можно привести соревнование Kaggle под названием Прогнозирование продаж бакалеи Corporación Favorita , где ваша цель - прогнозировать цены на продукты в каждом магазине в течение следующих 10 недель .по данным за последние 10 лет 1096 *.

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

Вы хотите, чтобы набор валидации был как можно более свежим (например, с использованием данных за предыдущие 2 недели). Тогда ваш набор данных для обучения получен из 4лет назад до 2 недель до «сегодня».И вы проверяете набор «будущего», от 2 недель назад до «сегодня».

Вы не можете сделать это, если используете OOB_score: он генерирует набор псевдо-проверки случайным образом (следствие начальной загрузки), поэтому оценка, которую вы получите от OOB, будет менее значимой, поскольку вы не имитируете эффект «будущего», описанный выше.Генерация явного набора для проверки предоставит вам свободу выбора самых последних данных, которые у вас есть для проверки, вместо случайных.

0 голосов
/ 15 октября 2018

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

0 голосов
/ 11 октября 2018

oob_score недостаточно, потому что:

  1. он рассчитан на несколько строк из набора поездов, который не показывает вашу предсказательную силу
  2. Я не вижу никакого cv / стратификациивнутри вычисления oob_score (таким образом, если у вас есть несбалансированный набор данных, и строки oob_score взяты полностью случайным образом - это плохо)
  3. он использует точность_скор для классификации и r2 для регрессии, которая может не соответствовать вашим желаемым показателям
...