【データ分析】機械学習アルゴリズムを用いた予測分析(6):長短期記憶ネットワーク(LSTM)(2021-01-22)

時系列予測における機械学習手法(6):長短期記憶ネットワーク(LSTM)

この記事は、「時系列予測における機械学習方法」シリーズの6番目の記事です。興味がある場合は、最初に前の記事を読むことができます:
[データ分析]予測分析のための機械学習アルゴリズムの使用(1):移動平均(移動平均)平均)
[データ分析]機械学習アルゴリズムを使用した予測分析(2):線形回帰
[データ分析]機械学習アルゴリズムを使用した予測分析(3):K-Nearest Neighbors
[データ分析]機械学習アルゴリズムを使用した予測分析(4):自動回帰微分移動平均モデル(AutoARIMA)
[データ分析]機械学習アルゴリズムを使用した予測分析(5):預言者

1.LSTMの概要

長短期記憶(LSTM)は、深層学習の分野で使用される人工リカレントニューラルネットワーク(RNN)アーキテクチャです。標準のフィードフォワードニューラルネットワークとは異なり、LSTMにはフィードバック接続があります。単一のデータポイント(画像など)だけでなく、データシーケンス全体(音声やビデオなど)も処理できます。

LSTMネットワークは、時系列の重要なイベント間に未知の期間のラグがある可能性があるため、時系列データに基づく分類、処理、および予測に非常に適しています。LSTMは、従来のRNNのトレーニング時に発生する可能性のある爆発および勾配消失問題に対処するために開発されました。ギャップ長に対する相対的な鈍感性は、RNN、隠れマルコフモデル、および多くのアプリケーションにおける他のシーケンス学習方法に対するLSTMの利点です。

2.「株価予測」の例

データセットは前の記事と同じであり、目的は同じデータセットに対する異なるアルゴリズムの予測効果を比較することです。データセットとコードは私のGitHubにあり、それを必要とする友人は自分でダウンロードできます。

パッケージをインポートし、データを読み込みます。sklearnおよびkerasパッケージが正しくインストールされていることを確認してください。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential
from keras.layers import Dense, Dropout, LSTM
df = pd.read_csv('NSE-TATAGLOBAL11.csv')

インデックスを設定します。元のデータを破壊しないようにするには、new_dataを再構築します。

# setting the index as date
df['Date'] = pd.to_datetime(df.Date,format='%Y-%m-%d')
df.index = df['Date']

#creating dataframe
data = df.sort_index(ascending=True, axis=0)
new_data = pd.DataFrame(index=range(0,len(df)),columns=['Date', 'Close'])
for i in range(0,len(data)):
    new_data['Date'][i] = data['Date'][i]
    new_data['Close'][i] = data['Close'][i]

new_data.index = new_data.Date
new_data.drop('Date', axis=1, inplace=True)

new_dataの形式を見てください。

new_data

ここに画像の説明を挿入

#creating train and test sets
dataset = new_data.values
dataset

ここに画像の説明を挿入
データをトレーニングセットとテストセットに分割します。

train = dataset[0:987,:]
valid = dataset[987:,:]

データセットを正規化します。

#converting dataset into x_train and y_train
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(dataset)
scaled_data

ここに画像の説明を挿入
モデルをトレーニングする方法は、トレーニングのために各数値の前にある60の値を使用することです。

x_train, y_train = [], []
for i in range(60,len(train)):
    x_train.append(scaled_data[i-60:i,0])
    y_train.append(scaled_data[i,0])
    
x_train, y_train = np.array(x_train), np.array(y_train)
x_train.shape

ここに画像の説明を挿入

y_train.shape

ここに画像の説明を挿入

x_train = np.reshape(x_train, (x_train.shape[0],x_train.shape[1],1))

LSTMネットワークを構築します。シーケンシャルはシーケンシャルモデルを表します。コア操作はそれにレイヤーを追加することです。LSTMに加えて、畳み込みレイヤーConv2D、最大プーリングレイヤーMaxPooling、およびフラット化レイヤーFlattenを追加することもできます。

# create and fit the LSTM network
model = Sequential() # 顺序模型,核心操作是添加layer(图层)
model.add(LSTM(units=50, return_sequences=True, input_shape=(x_train.shape[1],1)))
model.add(LSTM(units=50))
model.add(Dense(1)) #全连接层

model.compile(loss='mean_squared_error', optimizer='adam') #选择优化器,并指定损失函数
model.fit(x_train, y_train, epochs=1, batch_size=1, verbose=2)

ここに画像の説明を挿入
各データの前にある60の数字を使用して、この数字を予測します。合計248の数が予測されます。

#predicting 248 values, using past 60 from the train data
inputs = new_data[len(new_data) - len(valid) - 60:].values # 1235 - 927 - 60 = 308
inputs = inputs.reshape(-1,1)
inputs  = scaler.transform(inputs)
inputs.shape

ここに画像の説明を挿入
X_testは、モデルの予測セットの入力を表します。

X_test = []
for i in range(60,inputs.shape[0]):
    X_test.append(inputs[i-60:i,0])
X_test = np.array(X_test)

X_test = np.reshape(X_test, (X_test.shape[0],X_test.shape[1],1))
X_test.shape

ここに画像の説明を挿入
モデルを使用して予測を開始し、標準化されたデータを生データに変換します。

closing_price = model.predict(X_test)
closing_price = scaler.inverse_transform(closing_price)

今回のRMSE値を見てみましょう。これは、以前の集中予測法で得られた値よりもはるかに小さく、誤差が比較的小さいことを示しています。

rmse = np.sqrt(np.mean(np.power((valid - closing_price),2)))
rmse

ここに画像の説明を挿入
図面で予報を見てください。

#for plotting
train = new_data[:987]
valid = new_data[987:]
valid['Predictions'] = closing_price

plt.figure(figsize=(16,8))
plt.plot(train['Close'])
plt.plot(valid[['Close','Predictions']])
plt.show

ここに画像の説明を挿入
この株式市場の終値データセットでのLSTMの予測は比較的正確であることがわかります。もちろん、LSTM層の数の変更、トレーニング代数の追加など、さまざまなパラメーターに合わせてLSTMモデルを調整することもできます。

これらのいくつかの実験の結果から、このストックの予測では、移動平均アルゴリズム、線形回帰アルゴリズム、有馬アルゴリズムなどは良好な予測結果を示していませんが、LSTMアルゴリズムの予測結果はより多くなっていることがわかります。私たちに沿って。期待値。もちろん、これはLSTMアルゴリズムが最良の時系列予測アルゴリズムであることを意味するものではありません。さまざまな問題については、特定の分析が必要です。たとえば、スーパーマーケットがさまざまな商品の将来の売上を予測したい場合、すべてのカテゴリを満たすための1回限りのアルゴリズムを見つけることはできません。より良い解決策は、さまざまなアルゴリズムを使用して各カテゴリを予測し、そのカテゴリに最適な予測曲線を見つけることです。

機械学習アルゴリズムのサポートがあっても、ほとんどの場合、正確な予測を行うことは困難です。株式市場の予測は非常に難しく、不確実な要素が多すぎます。また、時系列の経過に伴い、特定の商品販売予測について、一時的に最良の予測アルゴリズムが見つかったとしても、将来この予測アルゴリズムが利用可能になるとは限りません。ターニングポイントはどこに現れるのでしょうか?これも考慮する必要のある質問です。

後ろに書かれている:「機械学習と深層学習技術を使用した株価予測」この記事は、時系列に基づく予測分析に機械学習手法を使用する方法を学ぶのに非常に役立ちます。これらのブログは、学習を書き、促進するための私の研究ノートに相当します。

おすすめ

転載: blog.csdn.net/be_racle/article/details/112999853