Вопрос или проблема
Я новичок в машинном обучении и работаю над проектом, где мне дана последовательность целых чисел, все из которых находятся в диапазоне от 0 до 70. Моя цель — предсказать следующее целое число в последовательности, зная предыдущие 5 целых чисел из той же последовательности. Нет много другой информации о самой последовательности целых чисел (например, как была получена последовательность и т.д.).
Вот что я попробовал.
- Первое, что пришло мне в голову, это использовать модель регрессии LSTM с 5 временными шагами на входе и одним выходом (соответствующим следующему целому числу в последовательности – в Keras это было бы return_sequences=False). Я передал 5 предыдущих целых чисел как входные данные. Это привело к тому, что модель предсказывала в основном среднее значение (~30) все время.
- Я попробовал модель в пункте (1), но с большим количеством временных шагов на входе (скажем, 100), но все равно без улучшений.
- Затем я попробовал (1) и (2), но на этот раз используя разницу между последовательными целыми числами в качестве входных данных и пытаясь предсказать разницу до следующего целого числа в последовательности. Результаты с этим все еще плохие.
- Затем я попробовал модель классификации LSTM, кодируя входные и выходные данные с помощью one-hot, так как я знаю, что все целые числа в последовательности находятся в диапазоне от 0 до 70. Снова нет улучшений.
- Затем я попробовал модель seq2seq (кодировщик-декодировщик) LSTM с 5 входами в кодировщике и 5 выходами в декодировщике, где правильные выходные данные также подавались в декодировщик (учительская форсировка). Все равно результаты плохие.
На этом этапе я начал сомневаться, смогу ли я обучить модель на данных, и является ли предоставленная информация просто набором случайных целых чисел.
Я искал статистические тесты, чтобы определить, являются ли данные случайными или нет, и узнал о графике автокорреляции pandas. Вот как выглядит график, построенный на разнице между последовательными целыми числами (выглядит похоже, когда строится с использованием самих целых чисел).
Насколько я понимаю, поскольку значения очень близки к нулю, это означает, что данные случайны. Это так?
Я также использовал statsmodels “plot_acf”, и вот график, который я получил для разницы между последовательными целыми числами.
Я вижу, что есть некоторая отрицательная корреляция, когда задержка равна 1. Почему это не отображается на графике с использованием pandas’ autocorrelation_plot()?
Я также попробовал создать модель AR (авторегрессия), но результаты по-прежнему плохие.
Гистограмма целых чисел в последовательности также кажется, что намекает на случайность целых чисел (все значения имеют примерно одинаковое количество, за исключением некоторых более высоких целых чисел).
Я зря трачу время, пытаясь создать модель машинного обучения для предсказания следующего целого числа в последовательности?
Интересная проблема. График автокорреляции pandas указывает на то, что данные случайны.
Насколько хорошо вы знаете источник? Достоверно ли, что последовательность на самом деле случайна?
Вы просматривали данные и строили гистограмму количества появлений целых чисел? Они появляются равномерно или некоторые встречаются чаще других?
Одна из вещей, которую я думаю, вы должны попробовать, это пересформулировать вашу модель LSTM. Я не думаю, что это проблема регрессии, даже если целевая переменная – это одно целое число. Это проблема классификации с 70 классами. Попробуйте рассматривать это таким образом и используйте функцию потерь категориальной кросс-энтропии. В таком сценарии ~1.5% точности будет представлять собой случайное угадывание. Может ли модель сделать лучше, чем это?
Ответ или решение
Ваш вопрос о предсказании следующего числа в последовательности целых чисел весьма интересен и сложен. Давайте проанализируем вашу ситуацию более подробно и попробуем дать рекомендации, которые помогут вам продвинуться в вашем проекте.
1. Анализ случайности данных:
Первое, на что стоит обратить внимание — это действительно ли данные случайны. Вы правы в том, что автокорреляционные функции, которые вы построили, показывают, что данные, вероятно, являются случайными. Если коэффициенты автокорреляции близки к нулю на всех лагах, это действительно может свидетельствовать о случайности. Однако стоит учитывать, что случайное распределение тоже может следовать некоторым шаблонам. Постарайтесь понять источник ваших данных. Есть ли у них какая-то осмысленная структура, или они действительно случайны?
2. Гистограмма и распределение:
Вы также упомянули, что гистограмма значений показывает, что большинство чисел появляются с примерно одинаковой частотой. Если это так, это может означать, что у вас есть равномерное распределение по диапазону от 0 до 70, что также поддерживает гипотезу о случайности. Важно сопоставить это распределение с фактическими процессами, которые могли бы его создать.
3. Подход к моделированию:
Вы правильно заметили, что данный случай можно рассмотреть как задачу классификации вместо регрессии. Поскольку ваше целевое значение может принимать одно из 71 значений (от 0 до 70), логично использовать модель, которая основана на классификации. Вот шаги, которые можно предпринять:
-
Переформулируйте задачу: используйте модель LSTM для классификации, где каждый из 71 классов соответствует одному из возможных целых чисел. Это позволит вашему моделированию настроиться на предсказание конкретного класса (числа), а не непрерывного значения.
-
Используйте функцию потерь
categorical_crossentropy
, соответствующую вашей задаче классификации. Убедитесь, что вашим выходным данным будет присвоено одно горячее кодирование (one-hot encoding) для оценки вероятностей каждого класса. -
Убедитесь, что ваши данные разбиты на обучающую и тестовую выборки. Это поможет вам оценить, как модель обобщается на невидимых данных.
4. Улучшение результатов:
-
Проверьте, достаточно ли у вас данных для обучения. Если у вас небольшое количество примеров, это может негативно повлиять на обучение модели.
-
Попробуйте использовать предобученные модели или архитектуры, такие как GRU, которые могут быть менее склонны к переобучению и более эффективны в ваших задачах.
-
Исходя из архитектуры вашей модели, вы также можете рассмотреть использование слоев дропаут (dropout) для снижения вероятности переобучения.
5. Итоговые рекомендации:
Если после всех этих манипуляций ваша модель по-прежнему показывает плохие результаты, возможно, ваши данные действительно случайные, и модель не сможет выявить в них закономерности. В этом случае, вместо того чтобы тратить время на предсказание, может быть более полезно исследовать данные с точки зрения их источника и природы, чтобы выяснить, можно ли найти структуру, скрытую в них.
Если у вас появятся еще вопросы или нужна дополнительная помощь, не стесняйтесь спрашивать. Удачи вам в вашем проекте!