Случайный лес переоснащается

15

Я пытаюсь использовать случайную лесную регрессию в scikits-learn. Проблема в том, что я получаю очень высокую ошибку теста:

train MSE, 4.64, test MSE: 252.25.

Вот как выглядят мои данные: (синий: реальные данные, зеленый: прогноз):

Лесная регрессия убрана

Я использую 90% для обучения и 10% для тестирования. Это код, который я использую после попытки нескольких комбинаций параметров:

rf = rf = RandomForestRegressor(n_estimators=10, max_features=2, max_depth=1000, min_samples_leaf=1, min_samples_split=2, n_jobs=-1) 
test_mse = mean_squared_error(y_test, rf.predict(X_test))
train_mse = mean_squared_error(y_train, rf.predict(X_train))

print("train MSE, %.4f, test MSE: %.4f" % (train_mse, test_mse))
plot(rf.predict(X))
plot(y)

Каковы возможные стратегии для улучшения моей подгонки? Есть ли что-то еще, что я могу сделать, чтобы извлечь основную модель? Мне кажется невероятным, что после стольких повторений одного и того же паттерна модель ведет себя так плохо с новыми данными. Есть ли у меня какая-то надежда на то, чтобы соответствовать этим данным?

elyase
источник
Тренируете ли вы эту периодическую функцию с осью x в качестве входных данных и осью y в качестве метки для x <= 245, а затем тестируете для x> 245? Или я неправильно истолковал ваш сюжет?
Rrenaud 12.12.12
вроде, на самом деле ось x является индексом наблюдения, всего имеется 300 наблюдений, поэтому начиная с 245, то есть тестовых данных, не используемых для обучения модели, вектор входных объектов состоит из целых чисел и имеет форму (300,2) и очень напоминает линейную функцию индекса наблюдения, поэтому я не добавил информацию об этом, чтобы не усложнять вопрос.
Elyase
1
Возможно, вы захотите сначала удалить цикл (сезонную часть) из ваших данных (и тренд).
Р. Прост
Вы смотрели на анализ временных рядов? Мне не ясно, что находится на твоей оси х, но мне кажется, что это периодическое издание. Проверьте здесь и дайте мне знать, если это поможет: otexts.org/fpp/7/5
Брэм Ван Кэмп

Ответы:

21

Я думаю, что вы используете неправильный инструмент; если весь ваш X эквивалентен индексу, вы в основном имеете некоторую выборочную функцию и пытаетесь ее экстраполировать. Машинное обучение - это все о интерполяции истории, поэтому неудивительно, что в этом случае оно дает впечатляющий провал.е:рр

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


источник
разве машинное обучение о извлечении обобщенных моделей из данных? Если у вас есть определенный набор, который хорошо интерполирует данные, мы можем выбрать те из них, которые имеют лучшие свойства экстраполяции / обобщения, используя, например, перекрестную проверку. Что-то не так в моем понимании?
Elyase
Экстраполяция отличается от обобщения - представьте, что вы являетесь участником следующего эксперимента: вы видите экран и видите красную и зеленую кнопку. Сначала на экране показывается видео комнаты, в которой вы находитесь, когда другой человек нажал зеленую кнопку для кота, льва и тигра, показанную на экране, а затем красный для волка и собаки, и таким образом собрал 5 вкусных печенек.
1
Теперь на экране отображается рыжий кот; Вы выполняете правильную обобщенную интерполяцию истории, нажимаете зеленую кнопку и получаете удар током вместо печенья. Почему это случилось? Потому что решение - это цикл (gggrrr), а изображения животных - просто обман. Вы сделали то же самое со своим лесом - заманили его в тупое воспроизведение своего тренировочного набора, скрывая при этом реальную информацию.
Хороший пример, но не вижу это так, как вы. В вашем примере у нас есть следующие данные: цель ( gили r) и 2 функции ( index(временные) и animal). Исходя из этих данных, я могу подобрать несколько моделей, которые могут придать больший или меньший вес характеристике 1 или 2 (или равны обеим). Перекрестная проверка (при условии достаточного количества данных) должна привести к модели с признаком 2 (животное), имеющим меньшее значение. Я вижу, что моя модель соответствует данным, но я все еще думаю, что я должен быть в состоянии извлечь модель, которая следует этому шаблону (потому что поведение не изменилось) с достаточно большим пространством модели.
Elyase
1
Нет; даже если вы запрашиваете больше данных, экспериментатор все же может расширить обман животных и еще больше запутать схему, чтобы удержать ее не очевидной. То есть экстраполяция просто не может быть выполнена с обучением, потому что по определению требуется информация, которой нет в обучении - таким образом, вы должны либо применить некоторые предположения, либо собрать дополнительные данные, чтобы проблема стала интерполяцией.
9

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

Дэниел Малер
источник
AFAIK SVM имеют ту же проблему случайного леса. Они не предсказывают хорошо вне пространства, где они были обучены. Вероятно, нейронная сеть будет лучшим решением
Donbeo
Если данные лежат на кривой и ядро ​​имеет правильный вид, чтобы соответствовать этой кривой, то SVM сможет экстраполировать вдоль этой кривой. Если данные имеют линейный тренд, то линейный SVM будет соответствовать линии и будет экстраполирован вдоль этой линии. Более сложное ядро ​​может соответствовать и экстраполировать более сложные поведения. Это зависит от наличия правильного вида ядра. Это не делает SVM правильным инструментом для экстраполяции и прогнозирования TS, но делает их лучше, чем случайные леса.
Даниэль Малер
3

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

Шаг 1. Создайте функцию минимизации MSE, используя оптимизацию NM. Пример можно увидеть здесь: http://glowingpython.blogspot.de/2011/05/curve-fitting-using-fmin.html

Шаг 2. В рамках этой функции минимизации цель состоит в том, чтобы уменьшить MSE. Чтобы сделать это, создайте десятикратное разделение данных, где новая модель будет изучена в 9 раз, а протестирована - в 10 раз. Этот процесс повторяется десять раз, чтобы получить MSE на каждом сгибе. Агрегированный MSE возвращается как результат цели.

Шаг 3. fmin в python сделает итерации за вас. Проверьте, какие гиперпараметры необходимы для точной настройки (n_estimators, max_features и т. Д.) И передайте их в fmin.

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

Викрам
источник
Да, это кажется переоснащением (что обычно не происходит в случайной регрессии леса, отсюда и вопрос). Теперь я заметил, что изменение параметров мало влияет на радиочастотные регрессоры. Теперь для перекрестной проверки требуется базовая модель, достаточно гибкая для оптимизации. Какие модели / алгоритмы ML вы рекомендуете для такого рода данных.
Elyase
3

Некоторые предложения:

  1. Настройте свои параметры, используя подход скользящего окна (ваша модель должна быть оптимизирована для прогнозирования следующих значений во временных рядах, а не для прогнозирования значений среди предоставленных)
  2. Попробуйте другие модели (даже более простые, с правильным выбором функций и стратегиями разработки функций, могут оказаться более подходящими для вашей проблемы)
  3. Попробуйте изучить оптимальные преобразования целевой переменной (настройте это тоже, есть отрицательная линейная / экспоненциальная тенденция, вы можете оценить ее)
  4. Спектральный анализ возможно
  5. Максимумы / минимумы, кажется, одинаково разнесены. Узнайте, где им предоставляются ваши функции (без ввода оператора, сделайте так, чтобы алгоритм обнаружил это, чтобы устранить смещение) и добавьте это как функцию. Также разработайте функцию nearest maximum. Не знаю, это может сработать, а может и нет, вы можете знать, только если вы проверяете это :)
поджигатель
источник
Но, как сказал Дэниел в своем ответе, случайный лес не будет работать для такого рода проблем, поскольку он не способен предсказать значения за пределами диапазона, наблюдаемого в выборке поезда. Параметры настройки и т. Д. Ни к чему не привели бы.
Тим
1
Предложение № 2 @ Тим. И случайные леса не будут наивно работать с этими данными, но умное извлечение функций может заставить их работать.
Firebug
1

Икс2Икс2

Владислав Довгальец
источник
0

Прочитав вышеуказанный пост, я хочу дать другой ответ.

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

Итак, что мы можем сделать для прогнозирования временных рядов с помощью древовидной модели?

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

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

Вулф
источник
0

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

Deepon GhoseRoy
источник