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

Прежде чем вдаваться в подробности, если вам интересно понять модель случайного леса и интерпретировать ее результаты, ознакомьтесь с этими двумя постами, 1 и 2. Поверхность решения случайных лесов состоит из линий, параллельных оси. Из-за этого нужно сделать много разбиений, чтобы смоделировать даже простую прямую линию. Но это легко решается простым вращением оси. Степень поворота не всегда может быть ясна, но в большинстве случаев должны работать простые пробы и ошибки. После поворота поверхность решения станет параллельной оси, что упростит моделирование случайных лесов. Это показано на рисунке ниже.

В приведенном выше случае, даже если мы не будем вращать вручную, модель все равно сможет вписаться, хотя она может использовать больше расщеплений. Однако главная проблема случайного леса — его невозможность экстраполировать. Это означает, что он не может правильно оценить, если диапазон функций отличается от того, на чем он обучен. Чтобы понять эту проблему, мы можем создать простой набор данных с линейной зависимостью. Этот набор данных создается с использованием приведенного ниже кода.

Здесь мы предполагаем, что существует только один признак x, созданный путем выбора 100 равномерно распределенных значений от 0 до 1. Поскольку мы хотели иметь линейную связь, целевая переменная y создается путем добавления некоторого шума к x, в данном случае где-то от -0,1 до 0,1. . На следующем рисунке представлена ​​диаграмма рассеивания x и y.

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

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

Поскольку модель обучается на данных, которые находятся в другом диапазоне, она не может ничего найти в этом диапазоне. Поскольку усреднять нечего, в итоге всем экземплярам проверочных данных присваивается значение, присвоенное максимальному значению в обучающих данных (X[79]). Вот почему мы видим горизонтальную линию, когда строим график между x_val и предсказаниями модели для них.

Способы решения задачи экстраполяции

  1. Один из способов избежать такой ситуации — удалить все ненужные переменные, зависящие от времени, и обучить модель другим функциям.
  2. Но опять же, когда действительно есть временной ряд, как в приведенном выше примере, мы ничего не можем сделать. Мы можем попытаться использовать некоторые методы временных рядов, чтобы исключить тренд данных, но это все равно не заставит модель работать очень хорошо.

Вывод

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

Спасибо за чтение !! Весь код, использованный для этого поста, доступен здесь.

Дальнейшее чтение

  1. https://scikit-learn.org/stable/auto_examples/classification/plot_classifier_comparison.html