python中的未来函数 python未来方向( 三 )


X1X2X3Y044180441804...
Y转化成one-hot以后则是(关于one-hot编码可以参考这里)
1000000001...
3. 网络模型结构的确定和调整
这里我们使用python的keras库 。(用java的同学可以参考下deeplearning4j这个库) 。网络的训练过程设计到许多参数的调整:比如
需要确定LSTM模块的激活函数(activation fucntion)(keras中默认的是tanh);
确定接收LSTM输出的完全连接人工神经网络(fully-connected artificial neural network)的激活函数(keras中默认为linear);
确定每一层网络节点的舍弃率(为了防止过度拟合(overfit)),这里我们默认值设定为0.2;
确定误差的计算方式,这里我们使用均方误差(mean squared error);
确定权重参数的迭代更新方式 , 这里我们采用RMSprop算法,通常用于RNN网络 。
确定模型训练的epoch和batch size(关于模型的这两个参数具体解释戳这里)
一般来说LSTM模块的层数越多(一般不超过3层 , 再多训练的时候就比较难收敛),对高级别的时间表示的学习能力越强;同时,最后会加一层普通的神经网路层用于输出结果的降维 。典型结构如下:
如果需要将多个序列进行同一个模型的训练,可以将序列分别输入到独立的LSTM模块然后输出结果合并后输入到普通层 。结构如下:
4. 模型训练和结果预测
将上述数据集按4:1的比例随机拆分为训练集和验证集,这是为了防止过度拟合 。训练模型 。然后将数据的X列作为参数导入模型便可得到预测值 , 与实际的Y值相比便可得到该模型的优劣 。
实现代码
时间间隔序列格式化成所需的训练集格式
import pandas as pdimport numpy as npdef create_interval_dataset(dataset, look_back):
""":param dataset: input array of time intervals:param look_back: each training set feature length:return: convert an array of values into a dataset matrix."""
dataX, dataY = [], []for i in range(len(dataset) - look_back):
dataX.append(dataset[i:i+look_back])
dataY.append(dataset[i+look_back])return np.asarray(dataX), np.asarray(dataY)
df = pd.read_csv("path-to-your-time-interval-file")
dataset_init = np.asarray(df)# if only 1 columndataX, dataY = create_interval_dataset(dataset, lookback=3)# look back if the training set sequence length
这里的输入数据来源是csv文件,如果输入数据是来自数据库的话可以参考这里
LSTM网络结构搭建
import pandas as pdimport numpy as npimport randomfrom keras.models import Sequential, model_from_jsonfrom keras.layers import Dense, LSTM, Dropoutclass NeuralNetwork():
def __init__(self, **kwargs):
""":param **kwargs: output_dim=4: output dimension of LSTM layer; activation_lstm='tanh': activation function for LSTM layers; activation_dense='relu': activation function for Dense layer; activation_last='sigmoid': activation function for last layer; drop_out=0.2: fraction of input units to drop; np_epoch=10, the number of epoches to train the model. epoch is one forward pass and one backward pass of all the training examples; batch_size=32: number of samples per gradient update. The higher the batch size, the more memory space you'll need; loss='mean_square_error': loss function; optimizer='rmsprop'"""
self.output_dim = kwargs.get('output_dim', 8)self.activation_lstm = kwargs.get('activation_lstm', 'relu')self.activation_dense = kwargs.get('activation_dense', 'relu')self.activation_last = kwargs.get('activation_last', 'softmax')# softmax for multiple output
self.dense_layer = kwargs.get('dense_layer', 2)# at least 2 layers
self.lstm_layer = kwargs.get('lstm_layer', 2)self.drop_out = kwargs.get('drop_out', 0.2)self.nb_epoch = kwargs.get('nb_epoch', 10)self.batch_size = kwargs.get('batch_size', 100)self.loss = kwargs.get('loss', 'categorical_crossentropy')self.optimizer = kwargs.get('optimizer', 'rmsprop')def NN_model(self, trainX, trainY, testX, testY):

推荐阅读