TFLearn时间序列预测

在定义我的神经网络并训练我的模型后:

net = tflearn.input_data(shape=[None, 1, 1])tnorm = tflearn.initializations.uniform(minval=-1.0, maxval=1.0)net = tflearn.lstm(net, timesteps, dropout=0.8)net = tflearn.fully_connected(net, 1, activation='linear', weights_init=tnorm)net = tflearn.regression(net, optimizer='adam', learning_rate=0.001,                             loss='mean_square', metric='R2')# 定义模型model = tflearn.DNN(net, clip_gradients=0.)model.fit(X, y, n_epoch=nb_epoch, batch_size=batch_size, shuffle=False, show_metric=True)score = model.evaluate(X, y, batch_size=128)model.save('ModeSpot.tflearn')

我现在遇到了一个问题,我找到的大多数关于时间序列预测的教程都使用测试集来进行预测(他们将测试集传递给.predict())。问题是,在现实中我们并不知道这些,因为这是我们想要预测的内容。

目前我使用的是这个方法:

def forecast_lstm(model, X):    X = X.reshape(len(X), 1, 1)    yhat = model.predict(X)    return yhat[0, 0]# 将数据分割成训练集和测试集    train, test = supervised_values[0:-10000], supervised_values[-10000:]    # 转换数据的尺度    scaler, train_scaled, test_scaled = scale(train, test)    # 构建神经网络    net = tflearn.input_data(shape=[None, 1, 1])    tnorm = tflearn.initializations.uniform(minval=-1.0, maxval=1.0)    net = tflearn.lstm(net, 1, dropout=0.3)    net = tflearn.fully_connected(net, 1, activation='linear', weights_init=tnorm)    net = tflearn.regression(net, optimizer='adam', learning_rate=0.001,                             loss='mean_square', metric='R2')    lstm_model = tflearn.DNN(net, clip_gradients=0.)    lstm_model.load('ModeSpot.tflearn')    # 预测整个训练数据集以建立预测状态    train_reshaped = train_scaled[:, 0].reshape(len(train_scaled), 1, 1)    lstm_model.predict(train_reshaped)    # 对测试数据进行逐步验证    predictions = list()    error_scores = list()    for i in range(len(test_scaled)):        # 进行一步预测        X, y = test_scaled[i, 0:-1], test_scaled[i, -1]        yhat = forecast_lstm(lstm_model, X)        # 反转缩放        yhat2 = invert_scale(scaler, X, yhat)        # 反转差分        yhat3 = inverse_difference(raw_values, yhat2, len(test_scaled) + 1 - i)        # 存储预测结果        predictions.append(yhat3)

但这只适用于我的测试集。我该如何预测接下来的x个值?我记得在某处看到过,要预测时间T的值,我需要使用时间T-1的值进行预测(然后用T的值预测T+1的值,依此类推,直到达到我想要的预测数量)。这是个好方法吗?

我尝试过这样做:

def forecast_lstm2(model, X):    X = X.reshape(-1, 1, 1)    yhat = model.predict(X)    return yhat[0, 0]test = list()X, y = train_scaled[0, 0:-1], train_scaled[0, -1]test.append(X)for i in range(len(test_scaled)):    # 进行一步预测    yhat = forecast_lstm2(lstm_model, test[i])    test.append(yhat)    # 反转缩放    yhat2 = invert_scale(scaler, test[i+1], yhat)    # 反转差分    yhat3 = inverse_difference(raw_values, yhat2, len(test) + 1 - i)    # 存储预测结果    predictions.append(yhat3)

但这并没有达到预期的效果(在一些预测之后,它总是给出相同的结果)。

感谢您的关注和时间。


回答:

最后,这似乎有效:# 进行一步预测 def forecast_lstm2(model, X): X = X.reshape(-1, 1, 1) yhat = model.predict(X) return yhat[0, 0]

def prediction(spotId):    epoch = [5, 15, 25, 35, 45, 50, 100]    for e in epoch:        tf.reset_default_graph()        # 加载CSV文件,指示第一列代表标签        data = read_csv('nowcastScaled'+str(spotId)+'.csv', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser)        # 转换数据为平稳数据        raw_values = data.values        diff_values = difference(raw_values, 1)        # 转换数据为监督学习        supervised = timeseries_to_supervised(diff_values, 1)        supervised_values = supervised.values        # 将数据分割成训练集和测试集(我从Excel文件中移除了测试数据)        train = supervised_values[x:]        # 转换数据的尺度(并移除了与测试集相关的所有内容)        scaler, train_scaled = scale(train)        # 构建神经网络        net = tflearn.input_data(shape=[None, 1, 1])        tnorm = tflearn.initializations.uniform(minval=-1.0, maxval=1.0)        net = tflearn.lstm(net, 1, dropout=0.8)        net = tflearn.fully_connected(net, 1, activation='linear', weights_init=tnorm)        net = tflearn.regression(net, optimizer='adam', learning_rate=0.0001,                                     loss='mean_square', metric='R2')        lstm_model = tflearn.DNN(net, clip_gradients=0.)        lstm_model.load('ModeSpot'+str(spotId)+'Epoch'+str(e)+'.tflearn')        # 预测整个训练数据集以建立预测状态        train_reshaped = train_scaled[:, 0].reshape(len(train_scaled), 1, 1)        lstm_model.predict(train_reshaped)        # 对测试数据进行逐步验证        predictions = list()        predictionFeeder = list()        X, y = train_scaled[0, 0:-1], train_scaled[0, -1]        predictionFeeder.append(X)        for i in range(0, 10000):            # 进行一步预测            yhat = forecast_lstm2(lstm_model, predictionFeeder[i])            predictionFeeder.append(yhat)            # 反转缩放            yhat2 = invert_scale(scaler, predictionFeeder[i + 1], yhat)            yhat3 = inverse_difference(raw_values, yhat2, 10000 + 1 - i)            predictions.append(yhat3)

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注