长短时记忆(LSTM)是一种能增加递归神经网络(RNN)记忆的模型。递归神经网络保留短期记忆,因为它们允许在当前神经网络中更早地确定信息。 对于即时任务,RNN使用早期的数据,但我们可能没有利用神经元所有的早期信息。在RNN中,LSTM得到了广泛的应用。视频、自然语言处理、地理空间和时间序列等多个应用领域中,都证实了LSTM的有效性。 RNN的一个主要问题是梯度消失问题,它是由于在RNN块中重复使用相同的参数而产生的。我们必须在每个时间步中尝试使用不同的参数来克服这个问题。 我们努力在这样的情况下找到平衡。在生成变长序列的同时,我们在每一步引入新的参数,同时保持可学习参数的总数量不变。我们引入了基于门控机制的RNN单元,如LSTM和GRU。 门控单元保存内部变量,即利用其中的门。每个时间步的每个门的值取决于该时间步的信息,包括早期状态。然后,门的值乘以不同的权重变量来影响它们。 时间序列数据是在一段时间内收集的一系列数据值,允许我们跟踪一段时间内的差异。时间序列数据可以以毫秒、天和年为单位跟踪进程。 早期,我们把时间序列数据视为静态的;每天气温下的高点和低点,股市的开盘价和收盘价。现在我们将进入编码部分。我们将在股票数据集上实现LSTM。 数据集: https:github。comPacktPublishingLearningPandasSecondEditionblobmasterdatagoog。csv 二、利用LSTM实现股票的时间序列预测 读取数据: gstockdatapd。readcsv(data。csv)gstockdata。head() 数据集探索: 该数据集包含14列与时间序列(如日期)和不同的变量(如close、high、low和volume)相关。我们将使用开盘价和收盘价来用LSTM进行时间序列预测。 gstockdatagstockdata〔〔date,open,close〕〕gstockdata〔date〕pd。todatetime(gstockdata〔date〕。apply(lambdax:x。split()〔0〕))gstockdata。setindex(date,dropTrue,inplaceTrue)gstockdata。head() 我们在这里进行了一些特征提取。我们从整个日期变量中单独取出日期。现在,我们可以使用matplotlib来可视化可用数据,并查看数据中的价格值是如何显示的。如下所示的价格日期图中绿色表示开盘价,红色表示收盘价。 fg,axplt。subplots(1,2,figsize(20,7))ax〔0〕。plot(gstockdata〔open〕,labelOpen,colorgreen)ax〔0〕。setxlabel(Date,size15)ax〔0〕。setylabel(Price,size15)ax〔0〕。legend()ax〔1〕。plot(gstockdata〔close〕,labelClose,colorred)ax〔1〕。setxlabel(Date,size15)ax〔1〕。setylabel(Price,size15)ax〔1〕。legend()fg。show() 数据预处理: 我们必须在使用LSTM应用在股票价格之前对这些数据进行预处理。在fittransform函数的帮助下转换数据中的值。Minmaxscaler用于缩放数据,以便我们可以对所有的价格值归一化然后,我们使用80的数据进行训练,其余20用于测试,并将它们分配到单独的变量中。 fromsklearn。preprocessingimportMinMaxScalerMsMinMaxScaler()gstockdata〔gstockdata。columns〕Ms。fittransform(gstockdata)trainingsizeround(len(gstockdata)0。80)traindatagstockdata〔:trainingsize〕testdatagstockdata〔trainingsize:〕 训练数据的划分: 创建一个函数,以便我们可以创建用于训练和测试的序列。 defcreatesequence(dataset):sequences〔〕labels〔〕startidx0forstopidxinrange(50,len(dataset)):sequences。append(dataset。iloc〔startidx:stopidx〕)labels。append(dataset。iloc〔stopidx〕)startidx1return(np。array(sequences),np。array(labels))trainseq,trainlabelcreatesequence(traindata)testseq,testlabelcreatesequence(testdata) LSTM模型的实现: 在下一步中,我们创建LSTM模型。在本文中,我们将使用从Keras导入的Sequential模型,并导入所需的库。 fromkeras。modelsimportSequentialfromkeras。layersimportDense,Dropout,LSTM,Bidirectional 我们在模型中使用了两个LSTM层,并在层与层之间使用dropout以实现正则化。在LSTM参数中分配的单元数是50个。Dropout为10。损失函数是均方误差并使用Adam优化器优化问题的损失函数。平均绝对误差是我们在LSTM网络中使用的评估度量,因为它与时间序列数据相关。 modelSequential()model。add(LSTM(units50,returnsequencesTrue,inputshape(trainseq。shape〔1〕,trainseq。shape〔2〕)))model。add(Dropout(0。1))model。add(LSTM(units50))model。add(Dense(2))model。compile(lossmeansquarederror,optimizeradam,metrics〔meanabsoluteerror〕)model。summary()model。fit(trainseq,trainlabel,epochs80,validationdata(testseq,testlabel),verbose1)testpredictedmodel。predict(testseq)testinversepredictedMMS。inversetransform(testpredicted) 可视化: 将数据与我们的模型拟合后,我们用它进行预测。我们必须用逆变换使得变换后的函数返回原值。现在我们可以使用这些数据来进行可视化预测。 Mergingactualandpredicteddataforbettervisualizationgsslicdatapd。concat(〔gstockdata。iloc〔202:〕。copy(),pd。DataFrame(testinversepredicted,columns〔openpredicted,closepredicted〕,indexgstockdata。iloc〔202:〕。index)〕,axis1)gsslicdata〔〔open,close〕〕MMS。inversetransform(gsslicdata〔〔open,close〕〕)gsslicdata。head()gsslicdata〔〔open,openpredicted〕〕。plot(figsize(10,6))plt。xticks(rotation45)plt。xlabel(Date,size15)plt。ylabel(StockPrice,size15)plt。title(ActualvsPredictedforopenprice,size15)plt。show()gsslicdata〔〔close,closepredicted〕〕。plot(figsize(10,6))plt。xticks(rotation45)plt。xlabel(Date,size15)plt。ylabel(StockPrice,size15)plt。title(ActualvsPredictedforcloseprice,size15)plt。show() 三、结论 在本文中,我们利用LSTM研究了股票价格并将开盘和收盘价可视化。参考: https:thelearningmachine。comarticledllongshorttermmemory https:www。kaggle。comamarsharma768stockpricepredictionusinglstmnotebook