Useful Blogs
1、keras-seq-2-seq-signal-prediction
2、seq2seq-signal-prediction
3、ts_seq2seq_intro/
4、https://github.com/Arturus/kaggle-web-traffic
5、Sequence to Sequence Learning with Neural Networks Paper
6、Attention is All You Need paper
7、https://pytorch.org/tutorials/intermediate/seq2seq_translation_tutorial.html
8、https://github.com/Arturus/kaggle-web-traffic/blob/master/how_it_works.md
9、https://github.com/skyhuang1208/kaggle-web-traffic-time-series-forecasting
10、https://www.analyticsvidhya.com/blog/2018/02/time-series-forecasting-methods/
11、https://www.analyticsvidhya.com/blog/2018/08/auto-arima-time-series-modeling-python-r/
12、http://chandlerzuo.github.io/blog/2017/11/darnn
13、A Dual-Stage Attention-Based Recurrent Neural Network for Time Series Prediction
14、https://github.com/yoshall/GeoMAN
Tips
1、注意RNN中Many-to-Many 和 Encoder-Decoder模型的区别。Many-to-Many是一个整体的模型,而Encoder-Decoder是将模型分为不同的Encoder-Decoder两个部分。
2、尝试将Encoder和Decoder的结构设为不同,如将hidden_size以及layers设为不同,如果hidden_size设为不同,需要在Encoder最后加一个全连接层,将输出维度与Decoder的输入维度匹配。
3、尝试使用attention模块。
4、
AI challenge 2018 天气预报赛题
一些尝试
Baseline
使用fbprophet根据年、日变化特征预测
Seq2Seq的思路
数据分析
分析t2m_obs,rh2m_obs,w10m_obs三个特征的变化趋势,以及与其他特征之间的一些关系
特征选择
初步:9个obs特征+时刻特征+月份特征+31个M特征
其中时刻特征和月份特征因为涉及到循环,如23时和0时应该在数值上相邻,于是使用cos,sin来编码。
如下面这样:
模型建立
使用Encoder-Decoder组成的Seq2Seq结构,以前108个时间段的所有特征作为输入,以待预测的推移36个时间段的3个目标特征作为输出。
Encoder阶段使用LSTM 第一步:将输入维度变化到与LSTM的隐藏层相同,一种思路是使用全连接层,一种是使用LSTM input_size=输入维度,hidden_size=LSTM。第二步:使用多层LSTM stack。尝试过3层,5层。
Decoder阶段:以Encoder阶段的最后一个隐藏层输入作为隐藏层,Input目前选择初始化为全零。也是多层LSTM,最后使用Decoder阶段的output作为输入的一部分。
Attention Module:加入attention module,将Encoder阶段的outputs,与Decoder中的LSTM的outputs作为attention模块输入,输出最后的output。
加上一层全连接层将维度进行转换。
目前的测试结果来看:效果不理想,存在过拟合的现象,训练loss降低的情况下,验证的loss反而升高了。尝试dropout,似乎对结果没有提升。
尝试改进措施
1、尝试Decoder阶段的Input不为零,改用其它有意义的信息,需要再看资料解决。(Decoder inputs in Seq2Seq Model)(input特征已经加入,正在尝试效果)应该实现位移一位?
2、参数初始化问题
3、一个可能的思路:最后输出之前,加入待预测特征的前一年同一时刻(24365-1h到24365+1h)前后共3小时的观测数据值、前一天(23-25h前)前后3小时的观测数据值、用fbprophet预测的该时刻的观测值。这些特征与输出拼接起来,再加入一个全连接层,作为最后的输出。(相当于手动加入历史数据及变化趋势数据并线性组合起来):已经加入了前一天的观测数据作为辅助,fbprophet预测的数据尚未加入。
最新模型想法:
以fbprophet预测的t2m,rh2m,w10m数据作为Decoder的inputs。
最后一层融合的数据包括 前一天(23-25h之前)的观测数据,以及fbprophet预测的观测值。
即把fbprophet预测的值用在了两个地方,一是作为Decoder部分的输入,一是作为最后融合特征的一部分。
先尝试这个模型的效果。
然后考虑进一步的优化方向:
1、加入更多的数据特征,(即将M类信息也作为特征输入)
2、考虑更鲁棒的填充缺失值算法。如使用prophet辅助填充缺失值。
3、考虑取出outliners,将太过明显的噪声滤掉,替换为更平滑的数据。
最新模型的特点:Encoder-Decoder作为基础结构,以input sequence作为decoder的input输入
新的想法:分析各个因素之间的相关性,添加相关性较强的特征作为因素
Decoder Inputs选用当前 input的 t2m_obs,rh2m_obs,w10m_obs,t2m_M,rh2m_M,w10m_M,t2m_prophet,rh2m_prophet,w10m_prophet,hour_sin,hour_cos,month_sin,month_sin作为输入。
Decoder output之后,将等待预测时刻的t2m_M,rh2m_M,w10m_M,t2m_prophet,rh2m_prophet,w10m_prophet与output融合,作为最后输出。(使用depth_wise 1D conv实现融合)
融合策略如何改进?
改进措施:
比较MinMaxScaler和StandardScaler
分析数据,去掉outlines
尝试GeoMAN中的attention方法