Вопрос или проблема
У меня есть следующая задача: Обучение по последовательным 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 на валидационном наборе данных, а не на обучающих данных, чтобы избежать переобучения. Разделите ваши данные на обучающую и тестовую выборки.
Заключение
Следуя перечисленным выше шагам и внимательно следя за фокусировкой на данных, вы сможете улучшить свои модели и правильно вычислить среднюю квадратическую ошибку. Удачи с вашим проектом, и помните, что анализ модели и настройки гиперпараметров могут значительно повлиять на результаты!