lstm回归小记

博客之初体验

第一篇博客,主要是比赛时候初次使用lstm做回归一些需要注意的点的小记。

1、数据准备。

你可能需要将数据中的缺失的特殊符号转化为Nan:

def catchAbnormal(num) :
    if num in ['*','/']:
        num =np.NaN
    return num

for col in all_columns:
    data[col] = data[col].apply(catchAbnormal)

对于一些重要的特征,数据集恰好部分值确实,占比还较大,需要进行确实值填充(如前面最近的一个值填充):

data.fillna(method='ffill',inplace=True)
#检查下填补的情况
print(data.isna().any())

数据归一化(对我自身算个trick,一开始深度模型预测值几乎没差别,汗。。。。)和one_hot处理

for i in train_columns:
    dataX[i] = (dataX[i]-dataX[i].mean())/dataX[i].std(ddof=0)
#归一化并加入到训练集中
dataX = data_weather.join(pd.get_dummies(data_weather.iloc[:, 6:10]))

*最后一点,数据与label相关性查看很重要,哈哈。

2、模型训练部分

调参期间发现,优化器的选择对于最终结果的影响还比较大,先预留下后续深入研究具体原理(todo)。简单暴力的方法就是每个都尝试下,看哪个对于你的model的效果能好些。

            # self.train_op = tf.train.AdamOptimizer(0.001).minimize(self.cost)
            #self.train_op = tf.train.AdadeltaOptimizer(learning_rate=10, rho=0.95).minimize(self.cost)
            # self.train_op = tf.train.RMSPropOptimizer(learning_rate=1, decay=0.9).minimize(self.cost)
            self.train_op = tf.train.GradientDescentOptimizer(0.01).minimize(self.cost)

多层lstm的写法记录下(需要说明记录下:cell_outputs是最后一层每个时间步的输出(batchsize,timestep,cellsize),cell_final_state 为是每一层的最后一个step的输出(batchsize,layerNum,cellsize)):

lstm_cell = tf.contrib.rnn.BasicLSTMCell(self.cell_size, forget_bias=1.0, state_is_tuple=True,
                                                 activation=tf.nn.softsign)
mlstm_cell = tf.contrib.rnn.MultiRNNCell([lstm_cell] * layer_num, state_is_tuple=True)

self.cell_init_state = mlstm_cell.zero_state(self.batch_size, dtype=tf.float32)
self.cell_outputs, self.cell_final_state = tf.nn.dynamic_rnn(
            mlstm_cell, self.l_in_y, initial_state=self.cell_init_state, time_major=False)

必要时需要dropout

self.pred = tf.nn.dropout(self.pred, keep_prob)

结尾

暂时就先这么多了吧,小记一下。


版权声明:本文为weixin_43586173原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。