目前经常使用的深度神经网络模型主要有卷积神经网络(CNN)、递归神经网络(RNN)、深信度网络(DBN)、深度自动编码器(AutoEncoder)和生成对抗网络(GAN)等。
递归神经网络实际.上包含了两种神经网络。
一种是循环神经网络(RecurrentNeuralNetwork);另一种是结构递归神经网络(RecursiveNeuralNetwork),它使用相似的网络结构递归形成更加复杂的深度网络。
RNN它们都可以处理有序列的问题,比如时间序列等且RNN有“记忆”能力,可以“模拟”数据间的依赖关系。卷积网络的精髓就是适合处理结构化数据。
关于深度神经网络模型的相关学习,推荐CDA数据师的相关课程,课程以项目调动学员数据挖掘实用能力的场景式教学为主,在讲师设计的业务场景下由讲师不断提出业务问题,再由学员循序渐进思考并操作解决问题的过程中,帮助学员掌握真正过硬的解决业务问题的数据挖掘能力。
这种教学方式能够引发学员的独立思考及主观能动性,学员掌握的技能知识可以快速转化为自身能够灵活应用的技能,在面对不同场景时能够自由发挥。点击预约免费试听课。
时间序列模型时间序列预测分析就是利用过去一段时间内某事件时间的特征来预测未来一段时间内该事件的特征。
这是一类相对比较复杂的预测建模问题,和回归分析模型的预测不同,时间序列模型是依赖于事件发生的先后顺序的,同样大小的值改变顺序后输入模型产生的结果是不同的。
举个栗子:根据过去两年某股票的每天的股价数据推测之后一周的股价变化;根据过去2年某店铺每周想消费人数预测下周来店消费的人数等等RNN和LSTM模型时间序列模型最常用最强大的的工具就是递归神经网络(recurrentneuralnetwork,RNN)。
相比与普通神经网络的各计算结果之间相互独立的特点,RNN的每一次隐含层的计算结果都与当前输入以及上一次的隐含层结果相关。通过这种方法,RNN的计算结果便具备了记忆之前几次结果的特点。
典型的RNN网路结构如下:右侧为计算时便于理解记忆而产开的结构。
简单说,x为输入层,o为输出层,s为隐含层,而t指第几次的计算;V,W,U为权重,其中计算第t次的隐含层状态时为St=f(U*Xt+W*St-1),实现当前输入结果与之前的计算挂钩的目的。
对RNN想要更深入的了解可以戳这里。
RNN的局限:由于RNN模型如果需要实现长期记忆的话需要将当前的隐含态的计算与前n次的计算挂钩,即St=f(U*Xt+W1*St-1+W2*St-2+...+Wn*St-n),那样的话计算量会呈指数式增长,导致模型训练的时间大幅增加,因此RNN模型一般直接用来进行长期记忆计算。
LSTM模型LSTM(LongShort-TermMemory)模型是一种RNN的变型,最早由JuergenSchmidhuber提出的。
经典的LSTM模型结构如下:LSTM的特点就是在RNN结构以外添加了各层的阀门节点。
阀门有3类:遗忘阀门(forgetgate),输入阀门(inputgate)和输出阀门(outputgate)。
这些阀门可以打开或关闭,用于将判断模型网络的记忆态(之前网络的状态)在该层输出的结果是否达到阈值从而加入到当前该层的计算中。
如图中所示,阀门节点利用sigmoid函数将网络的记忆态作为输入计算;如果输出结果达到阈值则将该阀门输出与当前层的的计算结果相乘作为下一层的输入(PS:这里的相乘是在指矩阵中的逐元素相乘);如果没有达到阈值则将该输出结果遗忘掉。
每一层包括阀门节点的权重都会在每一次模型反向传播训练过程中更新。更具体的LSTM的判断计算过程如下图所示:LSTM模型的记忆功能就是由这些阀门节点实现的。
当阀门打开的时候,前面模型的训练结果就会关联到当前的模型计算,而当阀门关闭的时候之前的计算结果就不再影响当前的计算。因此,通过调节阀门的开关我们就可以实现早期序列对最终结果的影响。
而当你不不希望之前结果对之后产生影响,比如自然语言处理中的开始分析新段落或新章节,那么把阀门关掉即可。
(对LSTM想要更具体的了解可以戳这里)下图具体演示了阀门是如何工作的:通过阀门控制使序列第1的输入的变量影响到了序列第4,6的的变量计算结果。
黑色实心圆代表对该节点的计算结果输出到下一层或下一次计算;空心圆则表示该节点的计算结果没有输入到网络或者没有从上一次收到信号。
Python中实现LSTM模型搭建Python中有不少包可以直接调用来构建LSTM模型,比如pybrain,kears,tensorflow,cikit-neuralnetwork等(更多戳这里)。
这里我们选用keras。(PS:如果操作系统用的linux或者mac,强推Tensorflow!!!
)因为LSTM神经网络模型的训练可以通过调整很多参数来优化,例如activation函数,LSTM层数,输入输出的变量维度等,调节过程相当复杂。这里只举一个最简单的应用例子来描述LSTM的搭建过程。
应用实例基于某家店的某顾客的历史消费的时间推测该顾客前下次来店的时间。
具体数据如下所示:消费时间2015-05-1514:03:512015-05-1515:32:462015-06-2818:00:172015-07-1621:27:182015-07-1622:04:512015-09-0814:59:56....具体操作:1.原始数据转化首先需要将时间点数据进行数值化。
将具体时间转化为时间段用于表示该用户相邻两次消费的时间间隔,然后再导入模型进行训练是比较常用的手段。
转化后的数据如下:消费间隔04418054....2.生成模型训练数据集(确定训练集的窗口长度)这里的窗口指需要几次消费间隔用来预测下一次的消费间隔。
这里我们先采用窗口长度为3,即用t-2,t-1,t次的消费间隔进行模型训练,然后用t+1次间隔对结果进行验证。数据集格式如下:X为训练数据,Y为验证数据。
PS:这里说确定也不太合适,因为窗口长度需要根据模型验证结果进行调整的。
X1 X2 X3 Y0 44 18 044 18 0 54.... 注:直接这样预测一般精度会比较差,可以把预测值Y根据数值bin到几类,然后用转换成one-hot标签再来训练会比较好。
比如如果把Y按数值范围分到五类(1:0-20,2:20-40,3:40-60,4:60-80,5:80-100)上式可化为:X1 X2 X3 Y0 44 18 044 18 0 4...Y转化成one-hot以后则是(关于one-hot编码可以参考这里)1 0 0 0 00 0 0 0 1...3.网络模型结构的确定和调整这里我们使用python的keras库。
(用java的同学可以参考下deeplearning4j这个库)。
网络的训练过程设计到许多参数的调整:比如需要确定LSTM模块的激活函数(activationfucntion)(keras中默认的是tanh);确定接收LSTM输出的完全连接人工神经网络(fully-connectedartificialneuralnetwork)的激活函数(keras中默认为linear);确定每一层网络节点的舍弃率(为了防止过度拟合(overfit)),这里我们默认值设定为0.2;确定误差的计算方式,这里我们使用均方误差(meansquarederror);确定权重参数的迭代更新方式,这里我们采用RMSprop算法,通常用于RNN网络。
确定模型训练的epoch和batchsize(关于模型的这两个参数具体解释戳这里)一般来说LSTM模块的层数越多(一般不超过3层,再多训练的时候就比较难收敛),对高级别的时间表示的学习能力越强;同时,最后会加一层普通的神经网路层用于输出结果的降维。
典型结构如下:如果需要将多个序列进行同一个模型的训练,可以将序列分别输入到独立的LSTM模块然后输出结果合并后输入到普通层。
结构如下:4.模型训练和结果预测将上述数据集按4:1的比例随机拆分为训练集和验证集,这是为了防止过度拟合。训练模型。
然后将数据的X列作为参数导入模型便可得到预测值,与实际的Y值相比便可得到该模型的优劣。
实现代码时间间隔序列格式化成所需的训练集格式importpandasaspdimportnumpyasnpdefcreate_interval_dataset(dataset,look_back): """ :paramdataset:inputarrayoftimeintervals :paramlook_back:eachtrainingsetfeaturelength :return:convertanarrayofvaluesintoadatasetmatrix. """ dataX,dataY=[],[] foriinrange(len(dataset)-look_back): dataX.append(dataset[i:i+look_back]) dataY.append(dataset[i+look_back]) returnnp.asarray(dataX),np.asarray(dataY)df=pd.read_csv("path-to-your-time-interval-file") dataset_init=np.asarray(df) #ifonly1columndataX,dataY=create_interval_dataset(dataset,lookback=3) #lookbackifthetrainingsetsequencelength这里的输入数据来源是csv文件,如果输入数据是来自数据库的话可以参考这里LSTM网络结构搭建importpandasaspdimportnumpyasnpimportrandomfromkeras.modelsimportSequential,model_from_jsonfromkeras.layersimportDense,LSTM,DropoutclassNeuralNetwork(): def__init__(self,**kwargs): """ :param**kwargs:output_dim=4:outputdimensionofLSTMlayer;activation_lstm='tanh':activationfunctionforLSTMlayers;activation_dense='relu':activationfunctionforDenselayer;activation_last='sigmoid':activationfunctionforlastlayer;drop_out=0.2:fractionofinputunitstodrop;np_epoch=10,thenumberofepochestotrainthemodel.epochisoneforwardpassandonebackwardpassofallthetrainingexamples;batch_size=32:numberofsamplespergradientupdate.Thehigherthebatchsize,themorememoryspaceyou'llneed;loss='mean_square_error':lossfunction;optimizer='rmsprop' """ self.output_dim=('output_dim',8) self.activation_lstm=('activation_lstm','relu') self.activation_dense=('activation_dense','relu') self.activation_last=('activation_last','softmax') #softmaxformultipleoutput self.dense_layer=('dense_layer',2) #atleast2layers self.lstm_layer=('lstm_layer',2) self.drop_out=('drop_out',0.2) self.nb_epoch=('nb_epoch',10) self.batch_size=('batch_size',100) =('loss','categorical_crossentropy') self.optimizer=('optimizer','rmsprop') defNN_model(self,trainX,trainY,testX,testY): """ :paramtrainX:trainingdataset :paramtrainY:expectvalueoftrainingdata :paramtestX:testdataset :paramtestY:epectvalueoftestdata :return:modelaftertraining """ print"TrainingmodelisLSTMnetwork!" input_dim=trainX[1].shape[1] output_dim=trainY.shape[1]#one-hotlabel #printpredefinedparametersofcurrentmodel: model=Sequential() #applyingaLSTMlayerwithxdimoutputandydiminput.Usedropoutparametertoavoidoverfitting (LSTM(output_dim=self.output_dim, input_dim=input_dim, activation=self.activation_lstm, dropout_U=self.drop_out, return_sequences=True)) foriinrange(self.lstm_layer-2): (LSTM(output_dim=self.output_dim, input_dim=self.output_dim, activation=self.activation_lstm, dropout_U=self.drop_out, return_sequences=True)) #argumentreturn_sequencesshouldbefalseinlastlstmlayertoavoidinputdimensionincompatibilitywithdenselayer (LSTM(output_dim=self.output_dim, input_dim=self.output_dim, activation=self.activation_lstm, dropout_U=self.drop_out)) foriinrange(self.dense_layer-1): (Dense(output_dim=self.output_dim, activation=self.activation_last)) (Dense(output_dim=output_dim, input_dim=self.output_dim, activation=self.activation_last)) #configurethelearningprocess model.compile(,optimizer=self.optimizer,metrics=['accuracy']) #trainthemodelwithfixednumberofepoches (x=trainX,y=trainY,nb_epoch=self.nb_epoch,batch_size=self.batch_size,validation_data=(testX,testY)) #storemodeltojsonfile model_json=model.to_json() withopen(model_path,"w")asjson_file: json_file.write(model_json) #storemodelweightstohdf5file ifmodel_weight_path: if.exists(model_weight_path): os.remove(model_weight_path) model.save_weights(model_weight_path)#eg:model_weight.h5 returnmodel这里写的只涉及LSTM网络的结构搭建,至于如何把数据处理规范化成网络所需的结构以及把模型预测结果与实际值比较统计的可视化,就需要根据实际情况做调整了。
示例程序见附件,其为一个简单的时间序列预测算例。其实所有的预测问题,本质都是一样的,通过对样本的学习,将网络训练成一个能反映时间序列内部非线性规律的系统,最终应用于预测。
BP(BackPropagation)神经网络是86年由Rumelhart和McCelland为首的科学家小组提出,是一种按误差逆传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一。
BP网络能学习和存贮大量的输入-输出模式映射关系,而无需事前揭示描述这种映射关系的数学方程。它的学习规则是使用最速下降法,通过反向传播来不断调整网络的权值和阈值,使网络的误差平方和最小。
BP神经网络模型拓扑结构包括输入层(input)、隐层(hiddenlayer)和输出层(outputlayer)。
将历史数据作为样本训练,最后用一组对应的样本作为输入,输出自然是未来数据。神经网络预测就是这么做的。对商品价格变动的分析,可归结为对影响市场供求关系的诸多因素的综合分析。
传统的统计经济学方法因其固有的局限性,难以对价格变动做出科学的预测,而人工神经网络容易处理不完整的、模糊不确定或规律性不明显的数据,所以用人工神经网络进行价格预测是有着传统方法无法相比的优势。
从市场价格的确定机制出发,依据影响商品价格的家庭户数、人均可支配收入、贷款利率、城市化水平等复杂、多变的因素,建立较为准确可靠的模型。
该模型可以对商品价格的变动趋势进行科学预测,并得到准确客观的评价结果。