регрессионная модель превосходит все модели

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

Я следил за этим вопросом.


  • Случай 1:
    У меня задача: обучаться на протяжении трех последовательных дней, чтобы предсказать каждый четвертый день. Данные каждого дня представляют собой один CSV файл, который имеет размеры 24×25. Каждая точка данных каждого CSV файла — это пиксели. В этом случае я хочу использовать регрессию Ridge(), LinearRegression(), ARIMA() и модель LSTM(). Мы хотим получить 90 mse для каждой модели (подробности в моем связанном предыдущем вопросе).

  • Случай 2:
    Здесь я использую то, что называется “наивным прогнозом”, или “случайным блужданием”. Обычно его сложно превзойти. Наивный подход заключается в том, что предположение на любой день просто является картой предыдущего дня. Здесь также мы хотим получить 90 mse для этого наивного подхода (подробности в моем связанном предыдущем вопросе).

Мой код:

import os
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression, Ridge
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import LSTM, Dense
from statsmodels.tsa.arima.model import ARIMA
import warnings
from time import time

# Подавить предупреждения от ARIMA
warnings.filterwarnings("ignore")

# Пути
data_folder = r'C:\Users\alokj\OneDrive\Desktop\jupyter_proj\All_data'
output_folder = r'C:\Users\alokj\OneDrive\Desktop\jupyter_proj\90_days_merged'

# Убедиться, что выходная папка существует
os.makedirs(output_folder, exist_ok=True)

# Список всех CSV файлов в папке
csv_files = [f for f in os.listdir(data_folder) if f.endswith('.csv')]
csv_files = sorted(csv_files, key=lambda x: int(x.split('_Day')[1].split('_')[0]))

# Подготовка данных
data_list = [pd.read_csv(os.path.join(data_folder, file), header=None).values for file in csv_files]
data_array = np.array(data_list)  # Размер: (num_days, 24, 25)

# Упрощение данных для более удобного использования
num_days, rows, cols = data_array.shape
data_flattened = data_array.reshape(num_days, -1)  # Размер: (num_days, 600)

# Нормализация данных с использованием MinMaxScaler
scaler = MinMaxScaler()
data_flattened_scaled = scaler.fit_transform(data_flattened)

# Подготовка данных для входов модели
X = np.array([data_flattened_scaled[i-3:i].flatten() for i in range(3, 93)])  # Размер: (90, 1800)
y = data_flattened_scaled[3:93]  # Цель - 4-й день в каждой последовательности, размер: (90, 600)

# ---------- Линейная регрессия ----------
lr_model = LinearRegression()
lr_model.fit(X, y)
y_pred_lr = lr_model.predict(X)
residuals_lr = [np.mean((y[i] - y_pred_lr[i]) ** 2) for i in range(len(y))]

# ---------- Регрессия Риджа ----------
ridge_model = Ridge()
ridge_model.fit(X, y)
y_pred_ridge = ridge_model.predict(X)
residuals_ridge = [np.mean((y[i] - y_pred_ridge[i]) ** 2) for i in range(len(y))]

# ---------- Модель LSTM ----------
X_lstm = np.array([data_flattened_scaled[i-3:i] for i in range(3, 93)])  # Размер: (90, 3, 600)
y_lstm = data_flattened_scaled[3:93].reshape(len(y), 1, 600)  # Размер: (90, 1, 600)

lstm_model = Sequential()
lstm_model.add(LSTM(64, activation='relu', input_shape=(X_lstm.shape[1], X_lstm.shape[2])))
lstm_model.add(Dense(600))
lstm_model.compile(optimizer="adam", loss="mse")
lstm_model.fit(X_lstm, y_lstm, epochs=50, batch_size=8, verbose=1)

y_pred_lstm = lstm_model.predict(X_lstm)
residuals_lstm = [np.mean((y_lstm[i][0] - y_pred_lstm[i]) ** 2) for i in range(len(y_lstm))]

# ---------- Наивный прогноз ----------
residuals_naive = [np.mean((data_flattened_scaled[i+1] - data_flattened_scaled[i]) ** 2) for i in range(90)]

# ---------- Модель ARIMA ----------
residuals_arima = []
X_arima = np.array([data_flattened_scaled[i-3:i] for i in range(3, 93)])  # Размер: (90, 3, 600)

# Временные затраты на модель ARIMA
start_time = time()

for day in range(X_arima.shape[0]):  # Цикл по 90 последовательностям
    train_data = X_arima[day]        # Размер: (3, 600)
    test_data = y[day]              # Размер: (600)
    day_predictions = []

    for feature in range(train_data.shape[1]):  # Цикл по 600 признакам
        feature_train = train_data[:, feature]  # Размер: (3,)
        model = ARIMA(feature_train, order=(1, 0, 0))  # ARIMA(1, 0, 0)
        arima_model = model.fit()

        # Прогноз для следующего временного шага
        forecast = arima_model.forecast(steps=1)[0]
        day_predictions.append(forecast)

    # Рассчитать MSE для прогнозов дня
    residuals_arima.append(np.mean((test_data - np.array(day_predictions)) ** 2))
    print(f"День {day + 1}/{X_arima.shape[0]} завершен за {time() - start_time:.2f}s")

# ---------- Построение ----------
days = [f'День {i+1}' for i in range(90)]  # Метки для дней с 4 по 93

plt.figure(figsize=(12, 6))
plt.plot(days, residuals_lr, label="Остатки линейной регрессии", marker="o")
plt.plot(days, residuals_ridge, label="Остатки регрессии Риджа", marker="o", color="orange")
plt.plot(days, residuals_lstm, label="Остатки LSTM", marker="o", color="green")
plt.plot(days, residuals_naive, label="Остатки наивного прогноза", marker="o", color="red")
plt.plot(days, residuals_arima, label="Остатки ARIMA", marker="o", color="purple")

# Настройка графика
plt.xticks(rotation=90)
plt.xlabel('Прогнозируемый день')
plt.ylabel('Остатки (MSE)')
plt.title('Остатки для прогнозируемых дней (Линейная, Ридж, LSTM, Наивный, ARIMA)')
plt.legend()
plt.grid(True)

# Сохранить и показать график
plt.savefig(os.path.join(output_folder, 'residuals_plot_combined.png'))
plt.show()

Мой результат:

введите описание изображения здесь

Здесь мы видим, что регрессионная модель превосходит каждую модель, не мог бы кто-то проверить все модели в коде?

Моя папка с данными за все 90 дней ссылка, которую я использовал для кода.

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

Модели регрессии: Превосходство над другими методами прогнозирования

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

Случай 1: Прогнозирование с использованием регрессии

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

  • Подготовка данных: Вы грамотно трансформировали данные в подходящий формат для машинного обучения, используя MinMaxScaler для нормализации. Это оптимизировало модель и минимизировало влияние выбросов.
  • Модели: Применение разных моделей регрессии, таких как Linear Regression и Ridge, позволяет вам учесть как линейные зависимости, так и регуляризацию.

Случай 2: Наивное прогнозирование

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

Результаты вашего опыта

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

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

  • Сравнение с ARIMA и LSTM: Важно отметить, что, несмотря на то, что LSTM и ARIMA имеют свои преимущества для временных рядов, простота и эффективность линейной и гребневой регрессии позволили им показать превосходство в вашей ситуации.

Выводы и рекомендации

В результате вашего анализа можно утверждать, что:

  • Регрессионные модели (в частности, Linear и Ridge) действительно могут превосходить более сложные алгоритмы в ситуации, когда данные четко следуют линейным зависимостям.
  • Наивные методы остаются сильными конкурентами, что показывает необходимость их включения в рабочий процесс для оценки базовой линии.

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

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

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

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