You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LSTM时间序列预测结果绘图异常,寻求技术解决方案

时间序列绘图异常求助

我绘制时间序列数据点时遇到问题,图表显示异常,缺乏相关经验无法解决。附上当前绘图效果截图、绘图代码及完整预测实现代码,期望得到正常的时间序列图。感谢帮助。

异常时间序列图

绘图代码

import matplotlib.pyplot as plt

# Plot actual and predicted values
plt.figure(figsize=(12, 6))
plt.plot(results_df.index, results_df['Actual'], label='Actual', color='blue')
plt.plot(results_df.index, results_df['Predicted'], label='Predicted', color='red')
plt.xlabel('Date')
plt.ylabel('Price (Scaled)')
plt.title('Actual vs. Predicted Prices')
plt.legend()
plt.grid(True)
plt.show()

完整预测代码

import pandas as pd
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, LSTM
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
from math import sqrt

# Function to convert series to supervised learning
def series_to_supervised(data, n_in=1, n_out=1, dropnan=True):
    n_vars = 1 if type(data) is list else data.shape[1]
    df = pd.DataFrame(data)
    cols, names = list(), list()
    # input sequence (t-n, ... t-1)
    for i in range(n_in, 0, -1):
        cols.append(df.shift(i))
        names += [('var%d(t-%d)' % (j+1, i)) for j in range(n_vars)]
    # forecast sequence (t, t+1, ... t+n)
    for i in range(0, n_out):
        cols.append(df.shift(-i))
        if i == 0:
            names += [('var%d(t)' % (j+1)) for j in range(n_vars)]
        else:
            names += [('var%d(t+%d)' % (j+1, i)) for j in range(n_vars)]
    # put it all together
    agg = pd.concat(cols, axis=1)
    agg.columns = names
    # drop rows with NaN values
    if dropnan:
        agg.dropna(inplace=True)
    return agg

# Load dataset
dataset = pd.read_csv('cleaned_merged_dataset.csv', header=0, index_col=0, parse_dates=True)

# Separate the features for scaling
price = dataset.values[:, :1]
wind_gen = dataset.values[:, 1:]

# Create separate scalers for price and wind generation
price_scaler = MinMaxScaler(feature_range=(0, 1))
wind_gen_scaler = MinMaxScaler(feature_range=(0, 1))

# Fit and transform the features
scaled_price = price_scaler.fit_transform(price)
scaled_wind_gen = wind_gen_scaler.fit_transform(wind_gen)

# Combine the scaled features
scaled_values = np.concatenate((scaled_price, scaled_wind_gen), axis=1)

# Frame as supervised learning
reframed = series_to_supervised(scaled_values, 1, 1)

# Split into train and test sets
values = reframed.values
n_train_days = 365  # Use first year for training
train = values[:n_train_days, :]
test = values[n_train_days:, :]

# Split into input and outputs
train_X, train_y = train[:, :-1], train[:, -1]
test_X, test_y = test[:, :-1], test[:, -1]

# Reshape input to be 3D [samples, timesteps, features]
train_X = train_X.reshape((train_X.shape[0], 1, train_X.shape[1]))
test_X = test_X.reshape((test_X.shape[0], 1, test_X.shape[1]))

# Define LSTM model
model = Sequential()
model.add(LSTM(50, input_shape=(train_X.shape[1], train_X.shape[2])))
model.add(Dense(1))
model.compile(loss='mae', optimizer='adam')

# Fit the model
model.fit(train_X, train_y, epochs=50, batch_size=72, validation_data=(test_X, test_y), verbose=2, shuffle=False)

# Make a prediction
yhat = model.predict(test_X)

# Invert scaling for forecast
yhat_reshaped = yhat.reshape(-1, 1)
inv_yhat = price_scaler.inverse_transform(yhat_reshaped)
inv_yhat = inv_yhat[:, 0]

# Invert scaling for actual
test_y_reshaped = test_y.reshape(-1, 1)
inv_y = price_scaler.inverse_transform(test_y_reshaped)
inv_y = inv_y[:, 0]

# Calculate RMSE
rmse = sqrt(mean_squared_error(inv_y, inv_yhat))
print('Test RMSE: %.3f' % rmse)

# Get the date index for the test set from the original merged dataset
test_dates = dataset.index[n_train_days+1:]

# Create the results DataFrame
results_df = pd.DataFrame(data={"Date": test_dates, "Actual": inv_y, "Predicted": inv_yhat})

# Set 'Date' as the index
results_df.set_index('Date', inplace=True)

我此前尝试过多种方法但未能解决该问题,仅期望得到正常的时间序列图。

内容的提问来源于stack exchange,提问作者Civan Ridvan Muhsinoglu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 02:33:09