主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

深層学習を使用した時系列予測

この例では,長短期記憶(LSTM)ネットワークを使用して時系列データを予測する方法を説明します。

シーケンスの将来のタイムステップの値を予測するために,sequence-to-sequence回帰用のLSTMネットワークに学習させることができます。その応答は1タイムステップ分シフトした値を持つ学習シーケンスです。つまり,入力シーケンスの各タイムステップで,LSTMネットワークは次のタイムステップの値を予測するように学習します。

将来の複数のタイムステップの値を予測するには,関数predictAndUpdateStateを使用して,タイムステップを1つずつ予測し,予測ごとにネットワークの状態を更新します。

この例ではデータセットchickenpox_datasetを使用します。この例では,前月までの水ぼうそうの発生件数を与えて,水ぼうそうの発生件数を予測するようLSTMネットワークに学習させます。

シーケンスデータの読み込み

例のデータを読み込みます。chickenpox_datasetには,月に対応するタイムステップと発生件数に対応する値を含む1つの時系列が含まれています。出力は细胞配列で,その各要素は1つのタイムステップです。データを行ベクトルに形状変更します。

数据= chickenpox_dataset;数据=({}):数据;图绘制(数据)包含(“月”) ylabel (“案例”)标题(“每月水痘病例”

学習データとテストデータに分割します。シーケンスの最初の90%で学習を行い,残りの10%でテストを行います。

地板numTimeStepsTrain =(0.9 *元素个数(数据);dataTrain =数据(1:numTimeStepsTrain + 1);人数(=数据(numTimeStepsTrain + 1:结束);

データの標準化

良好な適合を実現し,学習の発散を防ぐには,ゼロ平均と単位分散を持つように学習データを標準化します。予測時には,学習データと同じパラメーターを使用してテストデータを標準化しなければなりません。

μ=意味着(dataTrain);sig =性病(dataTrain);datatrain标准化= (datatrainmu) / sig;

予測子と応答の準備

シーケンスの将来のタイムステップの値を予測するには,1タイムステップ分シフトした値を持つ学習シーケンスになるように応答を指定します。つまり,入力シーケンスの各タイムステップで,LSTMネットワークは次のタイムステップの値を予測するように学習します。予測子は,最後のタイムステップを含まない学習シーケンスです。

XTrain = dataTrainStandardized (1: end-1);YTrain = dataTrainStandardized(2:结束);

LSTMネットワークアーキテクチャの定義

LSTM回帰ネットワークを作成します。200年個の隠れユニットを持つLSTM層を指定します。

numFeatures = 1;numResponses = 1;numHiddenUnits = 200;层= [...sequenceInputLayer(numFeatures) lstmLayer(numHiddenUnits) fulllyconnectedlayer (numResponses) regressionLayer];

学習オプションを指定します。ソルバーを“亚当”250年に設定し,学習をエポック行います。勾配の発散を防ぐために,勾配のしきい値を1に設定します。初期学習率0.005をに指定し,125エポック後に係数0.2を乗算して学習率を下げます。

选择= trainingOptions (“亚当”...“MaxEpochs”, 250,...“GradientThreshold”, 1...“InitialLearnRate”, 0.005,...“LearnRateSchedule”“分段”...“LearnRateDropPeriod”, 125,...“LearnRateDropFactor”, 0.2,...“详细”0,...“阴谋”“训练进步”);

LSTMネットワークの学習

trainNetworkを使用し,指定した学習オプションでLSTMネットワークに学習させます。

网= trainNetwork (XTrain、YTrain层,选择);

将来のタイムステップの予測

将来の複数のタイムステップの値を予測するには,関数predictAndUpdateStateを使用して,タイムステップを1つずつ予測し,予測ごとにネットワークの状態を更新します。予測ごとに,前の予測を関数への入力として使用します。

学習データと同じパラメーターを使用してテストデータを標準化します。

datatest标准化= (dataTest - mu) / sig;XTest = dataTestStandardized (1: end-1);

ネットワークの状態を初期化するには,まず,学習データXTrainについて予測を行います。次に,学習の応答YTrain(结束)の最後のタイムステップを使用して,最初の予測を行います。残りの予測についてループし,前の予測をpredictAndUpdateStateに入力します。

データの大規模なコレクション,長いシーケンス,または大規模ネットワークの場合は,通常,GPUでの予測の方がCPUでの予測より計算時間が短縮されます。そうでない場合,通常,CPUでの予測の計算の方が高速です。1タイムステップの予測には,CPUを使用します。予測にCPUを使用するには,predictAndUpdateState“ExecutionEnvironment”オプションを“cpu”に設定します。

网= predictAndUpdateState(净,XTrain);[净,YPred] = predictAndUpdateState(净,YTrain(结束));numTimeStepsTest =元素个数(XTest);i = 2:numTimeStepsTest [net,YPred(:,i)] = predictAndUpdateState(net,YPred(:,i)),“ExecutionEnvironment”“cpu”);结束

前に計算したパラメーターを使用して予測を非標準化します。

YPred = sig*YPred + mu;

学習の進行状況プロットには,標準化されたデータから計算された平方根平均二乗誤差(RMSE)が報告されます。非標準化された予測からRMSEを計算します。

欧美=人数((2:结束);rmse =√意味着(YPred-YTest)。^ 2))
rmse =248.5531

予測値と共に学習の時系列をプロットします。

图绘制(dataTrain (1: end-1))idx = numTimeStepsTrain:(numTimeStepsTrain + numTimeStepsTest);情节(idx (numTimeStepsTrain) YPred][数据,“。”)举行包含(“月”) ylabel (“案例”)标题(“预测”)传说([“观察”“预测”])

予測値をテストデータと比較します。

figure subplot(2,1,1) plot(YTest) hold情节(YPred“。”)举行传奇([“观察”“预测”]) ylabel (“案例”)标题(“预测”) subplot(2,1,2) stem(YPred - YTest) xlabel(“月”) ylabel (“错误”)标题(" RMSE = "+ rmse)

観測値によるネットワークの状態の更新

予測と予測の間にタイムステップの実際の値にアクセスできる場合,予測値の代わりに観測値を使用してネットワークの状態を更新できます。

まず,ネットワークの状態を初期化します。新しいシーケンスについて予測を行うには,resetStateを使用してネットワークの状態をリセットします。ネットワークの状態をリセットすると,前の予測が新しいデータについての予測に影響を与えるのを防ぐことができます。ネットワークの状態をリセットしてから,学習データに対して予測を行い,ネットワークの状態を初期化します。

网= resetState(净);网= predictAndUpdateState(净,XTrain);

タイムステップごとに予測を行います。予測ごとに,前のタイムステップの観測値を使用して次のタイムステップを予測します。predictAndUpdateState“ExecutionEnvironment”オプションを“cpu”に設定します。

YPred = [];numTimeStepsTest =元素个数(XTest);i = 1:numTimeStepsTest [net,YPred(:,i)] = predictAndUpdateState(net,XTest(:,i)),“ExecutionEnvironment”“cpu”);结束

前に計算したパラメーターを使用して予測を非標準化します。

YPred = sig*YPred + mu;

平方根平均二乗誤差(RMSE)を計算します。

rmse =√意味着(YPred-YTest)。^ 2))
rmse = 158.0959

予測値をテストデータと比較します。

figure subplot(2,1,1) plot(YTest) hold情节(YPred“。”)举行传奇([“观察”“预测”]) ylabel (“案例”)标题(“与更新预测”) subplot(2,1,2) stem(YPred - YTest) xlabel(“月”) ylabel (“错误”)标题(" RMSE = "+ rmse)

ここで,予測値の代わりに観測値を使用してネットワークの状態を更新すると,予測がより正確になります。

参考

|||

関連するトピック