关于RNN的预测(第八讲比特币价格预测)

# 验证模型
    test_dates = test_data.index.tolist()
    pred_daily_df = pd.DataFrame(columns=['True Value', 'Pred Value'], index=test_dates)
    pred_daily_df['True Value'] = all_daily_df[config.raw_label_col]
    print(all_daily_df[config.raw_label_col])

    for i, test_date in enumerate(test_dates):
        X = X_test.reshape(1, -1)    # 将一天的数据特征转成行向量
        y_pred = utils.forecast_lstm(lstm_model, X)
        # scale反向操作,恢复数据范围
        rescaled_y_pred = y_scaler.inverse_transform(y_pred.reshape(-1, 1))[0, 0]

        # 差分反向操作,恢复数据的值:加上前一天的真实标签
        previous_date = test_date - pd.DateOffset(days=1)
        recoverd_y_pred = rescaled_y_pred + all_daily_df.loc[previous_date][config.raw_label_col]

        # 保存数据
        pred_daily_df.loc[test_date, 'Pred Value'] = recoverd_y_pred
        print('Date={}, 真实值={}, 预测值={}'.format(test_date,
                                               all_daily_df.loc[test_date][config.raw_label_col],
                                               recoverd_y_pred))
假设test_date='2018-01-07', recoverd_y_pred应该是预测的2018-01-08的价格, 真实值 all_daily_df.loc[test_date][config.raw_label_col]取得是'2018-01-07'的价格, 是不是有问题? 

Robin_TY - PhD@CSU,研究方向:计算机视觉,模式识别

赞同来自: wangxiaolei

没有问题,之前在准备数据的时候做了shift(1)操作,所以现在数据集中1.8的数据其实是做过平移的1.7的数据。

Robin_TY - PhD@CSU,研究方向:计算机视觉,模式识别

赞同来自: wangxiaolei

这里的前提就是预测t时刻时,t-1时刻的真实值是已知的;如果t-1时刻的值是未知的,那就用t-1时刻的预测值作为真实值。这种方法就是RNN中的 teacher forcing http://www.cedar.buffalo.edu/~srihari/CSE676/10.2.1%20TeacherForcing.pdf  

Robin_TY - PhD@CSU,研究方向:计算机视觉,模式识别

赞同来自: wangxiaolei

shift(1)或者shift(-1)要看是对label做位移,还是对特征做位移,效果是一样的。

白浪滔天

赞同来自:

我们从all_daily_df 里面取的真是值, 这个是没有经过shift的, 并且shift之后的列赋给了label_col, 而取真实值的列是raw_label_col

白浪滔天

赞同来自:

上面您提到 “前在准备数据的时候做了shift(1)操作”, 应该是shift(-1)吧。 改成shifit(1), 把Label_price列作为特征, 把Weighted_Price列作为标签, 预测效果跟之前差不多
data_df[config.label_col] = data_df[config.raw_label_col].shift(1)

要回复问题请先登录注册