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

如何用TensorFlow基于1000个历史值预测未来100个数值?

问题:无法生成未来100个数值的预测

现有1000个数值的数组,需要预测未来100个数值,但当前代码仅能输出与测试集长度一致的预测结果,无法得到未来的序列值。

原代码

close_arr = close_arr[::-1]
close = np.array(close_arr)
print(close)
print(len(close))
# Dataframe must have columns "ds" and "y" with the dates and values respectively.
df = pd.DataFrame({'y': close}) #'ds': timestamp,

df = df[['y']]

# prepere data for tensorflow
scaler = MinMaxScaler(feature_range=(0, 1))
yahoo_stock_prices = scaler.fit_transform(df)

train_size = int(len(yahoo_stock_prices) * 0.80)
print(f"train_size: {train_size}")
test_size = len(yahoo_stock_prices) - train_size
train, test = yahoo_stock_prices[0:train_size, :], yahoo_stock_prices[train_size:len(yahoo_stock_prices), :]
print(len(train), len(test))

# reshape into X=t and Y=t+1
look_back = 1 
trainX, trainY = create_dataset(train, look_back)
testX, testY = create_dataset(test, look_back)

trainX = np.reshape(trainX, (trainX.shape[0], 1, trainX.shape[1]))
testX = np.reshape(testX, (testX.shape[0], 1, testX.shape[1]))

# Step 2 Build Model
model = Sequential()
model.add(LSTM(50, activation='relu', return_sequences=True, input_shape=(1, look_back)))
model.add(LSTM(50, activation='relu', return_sequences=True))
model.add(Dense(25))
model.add(Dense(1, activation='linear'))

model.compile(loss='mse', optimizer='rmsprop')

model.fit(trainX, trainX, batch_size=128, epochs=100,validation_split=0.05)
model.evaluate(trainX, trainX, verbose=2)
predict_length = 50 
# how to predict next 50 values from testX?
# Step 1 - predict the future values
predicted = model.predict(testX)
print(f"predicted: {scaler.inverse_transform(np.array(predicted).reshape(-1, 1))}")
print(len(predicted))
# Step 2 - Plot the predictions!
plot_results_multiple(predicted, testX, predict_length)

def create_dataset(dataset, look_back=1):
    # prepare data
    dataX, dataY = [], []
    for i in range(len(dataset)-look_back-1):
        a = dataset[i:(i+look_back), 0]
        dataX.append(a)
        dataY.append(dataset[i + look_back, 0])
    return np.array(dataX), np.array(dataY)

问题分析

  1. 训练目标错误:当前训练时用model.fit(trainX, trainX),是让模型拟合输入本身,而非预测下一个时间步的数值,应该用trainY作为目标值。
  2. 预测逻辑错误:model.predict(testX)是对测试集中每个输入样本预测对应的下一个值,得到的是测试集的拟合结果,不是未来序列。要生成未来多步预测,需采用滚动预测:每次用最新预测值作为下一次的输入,循环生成后续数值。
  3. LSTM层配置问题:最后一层LSTM设置了return_sequences=True,会返回序列输出,但后续接的是Dense层,应改为return_sequences=False,否则维度不匹配。

解决方案

1. 修正模型训练与结构

先修正模型的训练目标和LSTM层配置:

# 修正模型结构
model = Sequential()
model.add(LSTM(50, activation='relu', return_sequences=True, input_shape=(1, look_back)))
model.add(LSTM(50, activation='relu', return_sequences=False)) # 最后一层LSTM不返回序列
model.add(Dense(25))
model.add(Dense(1, activation='linear'))

model.compile(loss='mse', optimizer='rmsprop')

# 修正训练目标,用trainY而非trainX
model.fit(trainX, trainY, batch_size=128, epochs=100, validation_split=0.05)
model.evaluate(testX, testY, verbose=2) # 用测试集评估更合理

2. 实现滚动预测生成未来100个值

添加滚动预测函数,从数据集的最后一个有效输入开始,循环生成未来数值:

def predict_future(model, last_input, scaler, look_back, predict_steps):
    future_predictions = []
    current_input = last_input.reshape((1, 1, look_back))
    
    for _ in range(predict_steps):
        # 预测下一个值
        next_value = model.predict(current_input, verbose=0)
        future_predictions.append(next_value[0][0])
        # 更新输入:去掉最旧的值,添加新预测值
        current_input = np.append(current_input[:, :, 1:], next_value, axis=2)
    
    # 反归一化得到真实数值
    future_predictions = scaler.inverse_transform(np.array(future_predictions).reshape(-1, 1))
    return future_predictions

# 获取数据集最后look_back个值作为初始输入
last_input = yahoo_stock_prices[-look_back:]
# 预测未来100个值
future_100 = predict_future(model, last_input, scaler, look_back, 100)

print("未来100个预测值:")
print(future_100)
print(f"预测长度:{len(future_100)}")

3. 核心修改说明

  • 模型训练时使用trainY作为目标,让模型学习“输入t时刻值,输出t+1时刻值”的映射关系。
  • 滚动预测时,每次将预测出的t+1值作为下一次的输入,生成t+2值,循环100次得到未来序列。
  • 最后对预测结果做反归一化,还原为原始数值范围。

内容的提问来源于stack exchange,提问作者Lubomir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 01:45:35