Тренировка в течение трех последовательных дней для прогнозирования четвертого дня.

Вопрос или проблема

У меня есть следующая задача: Обучение по последовательным 3 дням для предсказания 4-го дня. Каждый день данных представляет собой один CSV файл, который имеет размеры 24×25. Каждая точка данных в каждом CSV файле является пикселем.

Теперь мне нужно сделать следующее: предсказать день 4, используя обучающие данные дня 1, дня 2, дня 3 (то есть три последовательных дня), а затем вычислить MSE между предсказанными данными дня 4 и оригинальными данными дня 4. Давайте назовем это mse1.

Предсказать день 5, используя обучающие данные дня 2, дня 3, дня 4, вычислить mse2 (MSE между предсказанными данными дня 5 и оригинальными данными дня 5).

Предсказать день 6, используя обучающие данные дня 3, дня 4, дня 5, вычислить mse3 (MSE между предсказанными данными дня 6 и оригинальными данными дня 6).

……….

….

….

Предсказать день 93, используя обучающие данные дня 90, дня 91, дня 92, вычислить mse90 (MSE между предсказанными данными дня 93 и оригинальными данными дня 93).

Мне нужно использовать регрессию Риджа, линейную регрессию и модель LSTM. И у нас есть 90 MSE для каждой модели.

Моя попытка:

for i in range(3, min(93, len(data_flattened_scaled))):
    # Выбираем последние 3 дня как входные данные, а следующий день как целевой
    X_train = data_flattened_scaled[i-3:i].reshape(1, -1)
    print("X-train")
    print(list(range(i-3, i)))
   
    y_train = data_flattened_scaled[i].reshape(1, -1)
    print("y-train")
    print(i)
   
    # Линейная регрессия
    lr_model.fit(X_train, y_train)
    y_pred_lr = lr_model.predict(X_train)
    mse_lr.append(mean_squared_error(y_train, y_pred_lr))

    # Регрессия Риджа
    ridge_model.fit(X_train, y_train)
    y_pred_ridge = ridge_model.predict(X_train)
    mse_ridge.append(mean_squared_error(y_train, y_pred_ridge))

    # LSTM
    X_train_lstm = data_flattened_scaled[i-3:i].reshape(1, 3, 600)
    lstm_model.fit(X_train_lstm, y_train.reshape(1, 600), epochs=30, verbose=0, callbacks=[early_stopping])
    y_pred_lstm = lstm_model.predict(X_train_lstm)
    mse_lstm.append(mean_squared_error(y_train.reshape(600,), y_pred_lstm[0]))

Но учитель говорит, что я сделал неправильно для каждой модели. Я вижу, что все mse для регрессионных моделей близки к 0, я все еще удивлен тем, насколько хорошо работает линейная регрессия. Когда метод LSTM дает большой пик, я бы ожидал, что линейная регрессия сделает большую ошибку.

Может кто-то дать мне какие-либо правильные алгоритмы для каждой модели?

Моя выборка данных, например, день 10, доступна по ссылке https://drive.google.com/file/d/1Ha0DMbg8hyxP0AHv6WXanzLfRsNupOfU/view?usp=drive_link.

Одно замечание: прежде чем задать вопрос здесь, я спрашивал на Stack Overflow, но не получил ответа.

Ответ или решение

Оптимизация методов предсказания данных с использованием регрессии и нейросетей

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

1. Анализ проблемы

Вы пытаетесь предсказать значение для каждого следующего дня, используя значения трех предыдущих дней. У вас есть матрица размером 24×25, что в общем составляет 600 пикселей, и данные хранятся в формате CSV. Вы стремитесь минимизировать среднюю квадратическую ошибку (MSE) между предсказанными и реальными значениями за 90 дней.

2. Подготовка данных

Перед тем как перейти к моделированию, убедитесь, что данные правильно подготовлены:

  • Нормализация: Важно, чтобы данные были на одинаковом масштабе. Возможно, стоит использовать MinMaxScaler или StandardScaler из библиотеки scikit-learn.
  • Формирование обучающего набора: Как вы описали, данные для обучения должны формироваться из значений трех предыдущих дней. Каждая выборка X будет представлять собой вектор 600 пикселей предыдущих трех дней, а y – значения следующего дня.

3. Реализация модели

Вот пос meticulously переформулированный алгоритм для подготовки моделей:

import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression, Ridge
from sklearn.metrics import mean_squared_error
from keras.models import Sequential
from keras.layers import LSTM, Dense
from keras.callbacks import EarlyStopping

# Загрузка и нормализация данных
data = pd.read_csv('путь_к_вашему_CSV') # Укажите путь к вашему CSV
data = some_normalization_function(data) # Примените нормализацию

mse_lr = []
mse_ridge = []
mse_lstm = []

for i in range(3, 93):
    # Создаем X и y
    X_train = data[i-3:i].reshape(-1, 600)  # 3 предыдущих дня
    y_train = data[i].reshape(-1, 600)      # 1 день предсказания

    # Линейная регрессия
    lr_model = LinearRegression()
    lr_model.fit(X_train, y_train)
    y_pred_lr = lr_model.predict(X_train)
    mse_lr.append(mean_squared_error(y_train, y_pred_lr))

    # Регрессия с риджем
    ridge_model = Ridge(alpha=1.0)
    ridge_model.fit(X_train, y_train)
    y_pred_ridge = ridge_model.predict(X_train)
    mse_ridge.append(mean_squared_error(y_train, y_pred_ridge))

    # LSTM
    X_train_lstm = X_train.reshape((X_train.shape[0], 3, 200)) # для LSTM
    lstm_model = Sequential()
    lstm_model.add(LSTM(50, activation='relu', input_shape=(X_train_lstm.shape[1], 200)))
    lstm_model.add(Dense(600))
    lstm_model.compile(optimizer='adam', loss='mean_squared_error')

    # Callbacks для раннего завершения
    early_stopping = EarlyStopping(monitor='loss', patience=5)
    lstm_model.fit(X_train_lstm, y_train, epochs=100, verbose=0, callbacks=[early_stopping])

    y_pred_lstm = lstm_model.predict(X_train_lstm)
    mse_lstm.append(mean_squared_error(y_train.reshape(-1,), y_pred_lstm.flatten()))

4. Пояснения по коду

  • Линейная и Ridge регрессия создаются один раз для каждой новой выборки данных, и производится предсказание на тех же данных. Это может привести к заниженной оценке MSE, поскольку моделям можно просто "запомнить" данные.

  • Модель LSTM требует, чтобы входные данные были переупакованы в форму трёх измерений (samples, time_steps, features), что мы и сделали.

5. Проверка гипотезы

Убедитесь, что вы проверяете MSE на валидационном наборе данных, а не на обучающих данных, чтобы избежать переобучения. Разделите ваши данные на обучающую и тестовую выборки.

Заключение

Следуя перечисленным выше шагам и внимательно следя за фокусировкой на данных, вы сможете улучшить свои модели и правильно вычислить среднюю квадратическую ошибку. Удачи с вашим проектом, и помните, что анализ модели и настройки гиперпараметров могут значительно повлиять на результаты!

Оцените материал
Добавить комментарий

Капча загружается...