Time-series-quick-guide

提供:Dev Guides
移動先:案内検索

時系列-はじめに

時系列は、特定の期間にわたる一連の観測です。 単変量時系列は、ある期間の周期的な時間インスタンスで単一の変数がとる値で構成され、多変量の時系列は、ある期間の同じ周期的な時間インスタンスで複数の変数がとる値で構成されます。 私たち全員が日々出くわす時系列の最も単純な例は、1日または1週間または1年または1年を通しての気温の変化です。

時間データの分析は、変数が時間とともにどのように変化するか、または他の変数の値の変化にどのように依存するかについて有益な洞察を与えることができます。 変数の以前の値および/または他の変数とのこの関係は、時系列予測のために分析でき、人工知能に多くの用途があります。

時系列-プログラミング言語

ユーザーが機械学習の問題を処理したり開発したりするには、プログラミング言語の基本的な理解が不可欠です。 機械学習で働きたい人のための優先プログラミング言語のリストを以下に示します-

Python

これは、高レベルのインタープリター型プログラミング言語であり、高速でコーディングが容易です。 Pythonは、手続き型またはオブジェクト指向のプログラミングパラダイムに従うことができます。 さまざまなライブラリが存在するため、複雑な手順を簡単に実装できます。 このチュートリアルでは、Pythonでコーディングし、時系列モデリングに役立つ対応するライブラリについては、今後の章で説明します。

R

Pythonと同様に、Rは解釈されたマルチパラダイム言語であり、統計計算とグラフィックスをサポートします。 さまざまなパッケージにより、Rで機械学習モデリングを簡単に実装できます。

Java

これは解釈されたオブジェクト指向プログラミング言語であり、広範なパッケージの可用性と高度なデータ視覚化技術で広く知られています。

C/C++

これらはコンパイルされた言語であり、2つの最も古いプログラミング言語です。 これらの言語は、MLアルゴリズムの実装を簡単にカスタマイズできるため、既存のアプリケーションにML機能を組み込むことを好まれます。

MATLAB

MATrix LABoratoryは、マトリックスを操作する機能を提供するマルチパラダイム言語です。 複雑な問題の数学演算が可能です。 主に数値演算に使用されますが、一部のパッケージではグラフィカルなマルチドメインシミュレーションとモデルベースの設計も可能です。

機械学習の問題に適した他のプログラミング言語には、JavaScript、LISP、Prolog、SQL、Scala、Julia、SASなどがあります。

時系列-Pythonライブラリ

Pythonは、記述しやすく、理解しやすいコード構造とさまざまなオープンソースライブラリにより、機械学習を行う個人の間で定評があります。 今後の章で使用するこのようなオープンソースライブラリのいくつかを以下に紹介します。

NumPy

数値Pythonは、科学計算に使用されるライブラリです。 N次元配列オブジェクトで機能し、サイズ、形状、平均、標準偏差、最小、最大などの基本的な数学機能、および線形代数関数やフーリエ変換などのより複雑な関数を提供します。 このチュートリアルで先に進むと、これらについて詳しく知ることができます。

パンダ

このライブラリは、シリーズ、データフレーム、パネルなどの非常に効率的で使いやすいデータ構造を提供します。 単なるデータの収集と準備からデータ分析まで、Pythonの機能が強化されています。 PandasとNumPyの2つのライブラリにより、小規模から非常に大規模なデータセットに対する操作が非常に簡単になります。 これらの機能の詳細については、このチュートリアルに従ってください。

SciPy

Science Pythonは、科学技術計算に使用されるライブラリです。 最適化、信号および画像処理、統合、補間、線形代数のための機能を提供します。 このライブラリは、機械学習を実行する際に便利です。 このチュートリアルでは、これらの機能について説明します。

Scikit Learn

このライブラリは、カスタマイズ可能なさまざまな回帰モデル、分類モデル、クラスタリングモデルが含まれているため、統計モデリング、機械学習、深層学習に広く使用されているSciPyツールキットです。 Numpy、Panda、その他のライブラリとうまく機能するため、使いやすくなります。

統計モデル

Scikit Learnと同様に、このライブラリは統計データの調査と統計モデリングに使用されます。 また、他のPythonライブラリでもうまく動作します。

Matplotlib

このライブラリは、ラインプロット、棒グラフ、ヒートマップ、散布図、ヒストグラムなどのさまざまな形式でデータを視覚化するために使用されます。 プロットからラベル付けまでに必要なすべてのグラフ関連機能が含まれています。 このチュートリアルでは、これらの機能について説明します。

これらのライブラリは、あらゆる種類のデータで機械学習を開始するために非常に重要です。

上記で説明したものに加えて、時系列を扱うのに特に重要な別のライブラリは-

日付時刻

このライブラリは、datetimeとcalendarの2つのモジュールを備えており、時間の読み取り、フォーマット、および操作に必要なすべてのdatetime機能を提供します。

今後の章でこれらのライブラリを使用します。

時系列-データ処理と視覚化

時系列は、等間隔の時間間隔でインデックス付けされた一連の観測です。 したがって、順序と連続性はどの時系列でも維持される必要があります。

使用するデータセットは、イタリアの都市が著しく汚染されている大気の質について、約1年間の1時間ごとのデータを持つ多変量時系列です。 データセットは、以下のリンクからダウンロードできます-https://archive.ics.uci.edu/ml/datasets/air+quality。

それを確認する必要があります-

  • 時系列は等間隔であり、
  • 冗長な値やギャップはありません。

時系列が連続していない場合、アップサンプリングまたはダウンサンプリングできます。

df.head()を表示

[122]で:

import pandas

[123]で:

df = pandas.read_csv("AirQualityUCI.csv", sep = ";", decimal = ",")
df = df.iloc[ : , 0:14]

[124]で:

len(df)

アウト[124]:

9471

[125]で:

df.head()

アウト[125]:

コードスニペット

時系列の前処理では、データセットにNaN(NULL)値がないことを確認します。ある場合は、0またはaverageまたは前後の値に置き換えることができます。 時系列の連続性が維持されるように、ドロップよりも置換をお勧めします。 ただし、このデータセットでは、最後のいくつかの値はNULLのように見えるため、ドロップしても連続性に影響しません。

NaN(Not-a-Number)のドロップ

[126]で:

df.isna().sum()
Out[126]:
Date             114
Time             114
CO(GT)           114
PT08.S1(CO)      114
NMHC(GT)         114
C6H6(GT)         114
PT08.S2(NMHC)    114
NOx(GT)          114
PT08.S3(NOx)     114
NO2(GT)          114
PT08.S4(NO2)     114
PT08.S5(O3)      114
T                114
RH               114
dtype: int64

[127]で:

df = df[df['Date'].notnull()]

[128]で:

df.isna().sum()

アウト[128]:

Date             0
Time             0
CO(GT)           0
PT08.S1(CO)      0
NMHC(GT)         0
C6H6(GT)         0
PT08.S2(NMHC)    0
NOx(GT)          0
PT08.S3(NOx)     0
NO2(GT)          0
PT08.S4(NO2)     0
PT08.S5(O3)      0
T                0
RH               0
dtype: int64

時系列は通常、時間に対する折れ線グラフとしてプロットされます。 そのために、日付と時刻の列を組み合わせて、文字列から日時オブジェクトに変換します。 これは、日時ライブラリを使用して実現できます。

日時オブジェクトへの変換

[129]で:

df['DateTime'] = (df.Date) + ' ' + (df.Time)
print (type(df.DateTime[0]))
*<クラス 'str'>*

[130]で:

import datetime

df.DateTime = df.DateTime.apply(lambda x: datetime.datetime.strptime(x, '%d/%m/%Y %H.%M.%S'))
print (type(df.DateTime[0]))

<クラス 'pandas._libs.tslibs.timestamps.Timestamp'>

温度などの変数が時間の変化とともにどのように変化するかを見てみましょう。

プロットを表示する

[131]で:

df.index = df.DateTime

[132]で:

import matplotlib.pyplot as plt
plt.plot(df['T'])

アウト[132]:

[<matplotlib.lines.Line2D at 0x1eaad67f780>]

コードスニペット4

[208]で:

plt.plot(df['C6H6(GT)'])

アウト[208]:

[<matplotlib.lines.Line2D at 0x1eaaeedff28>]

ボックスプロットは、データセットに関する多くの情報を1つのグラフにまとめることができる、もう1つの便利なグラフです。 1つまたは複数の変数の平均、25%および75%の四分位数および外れ値を示します。 外れ値の数が少なく、平均から非常に離れている場合、それらを平均値または75%四分位値に設定することにより、外れ値を排除できます。

ボックスプロットの表示

[134]で:

plt.boxplot(df[[T','C6H6(GT)']].values)

アウト[134]:

{'whiskers': [<matplotlib.lines.Line2D at 0x1eaac16de80>,
   <matplotlib.lines.Line2D at 0x1eaac16d908>,
   <matplotlib.lines.Line2D at 0x1eaac177a58>,
   <matplotlib.lines.Line2D at 0x1eaac177cf8>],
   'caps': [<matplotlib.lines.Line2D at 0x1eaac16d2b0>,
   <matplotlib.lines.Line2D at 0x1eaac16d588>,
   <matplotlib.lines.Line2D at 0x1eaac1a69e8>,
   <matplotlib.lines.Line2D at 0x1eaac1a64a8>],
   'boxes': [<matplotlib.lines.Line2D at 0x1eaac16dc50>,
   <matplotlib.lines.Line2D at 0x1eaac1779b0>],
   'medians': [<matplotlib.lines.Line2D at 0x1eaac16d4a8>,
   <matplotlib.lines.Line2D at 0x1eaac1a6c50>],
   'fliers': [<matplotlib.lines.Line2D at 0x1eaac177dd8>,
   <matplotlib.lines.Line2D at 0x1eaac1a6c18>],'means': []
}

コードスニペット5

時系列-モデリング

前書き

時系列には、次の4つのコンポーネントがあります-

  • レベル-系列が変化する平均値です。
  • トレンド-時間の経過に伴う変数の増加または減少する動作です。
  • 季節-それは時系列の周期的な振る舞いです。
  • ノイズ-環境要因により追加された観測値の誤差です。

時系列モデリング手法

これらのコンポーネントをキャプチャするために、いくつかの一般的な時系列モデリング手法があります。 このセクションでは、各手法について簡単に紹介しますが、今後の章でそれらについて詳しく説明します-

ナイーブメソッド

これらは、予測値に、時間依存変数の前の値または前の実際の値の平均に等しい値が与えられるなど、単純な推定手法です。 これらは、高度なモデリング手法との比較に使用されます。

自動回帰

自動回帰は、前の期間の値の関数として将来の期間の値を予測します。 自動回帰の予測は、単純な方法の予測よりもデータに適合している可能性がありますが、季節性を説明できない場合があります。

ARIMAモデル

自動回帰統合移動平均は、変数の値を、定常時系列の以前のタイムステップでの以前の値と残留誤差の線形関数としてモデル化します。 ただし、実世界のデータは非定常であり、季節性がある可能性があるため、Seasonal-ARIMAおよびFractional-ARIMAが開発されました。 ARIMAは単変量時系列で動作し、複数の変数を処理するVARIMAが導入されました。

指数平滑化

変数の値を以前の値の指数加重線形関数としてモデル化します。 この統計モデルは、傾向と季節性も処理できます。

LSTM

Long Short-Term Memoryモデル(LSTM)は、長期依存関係を説明するために時系列に使用されるリカレントニューラルネットワークです。 大量のデータでトレーニングして、多変量時系列の傾向をキャプチャできます。

上記のモデリング手法は、時系列回帰に使用されます。 次の章では、これらすべてを1つずつ調べてみましょう。

時系列-パラメータキャリブレーション

前書き

統計モデルまたは機械学習モデルには、データのモデル化方法に大きく影響するいくつかのパラメーターがあります。 たとえば、ARIMAにはp、d、qの値があります。 これらのパラメーターは、実際の値とモデル化された値の間の誤差が最小になるように決定されます。 パラメータキャリブレーションは、モデルフィッティングの最も重要で時間のかかるタスクであると言われています。 したがって、最適なパラメーターを選択することは非常に重要です。

パラメータの較正方法

パラメータを調整するにはさまざまな方法があります。 このセクションでは、それらのいくつかについて詳しく説明します。

ヒットアンドトライ

モデルを調整する一般的な方法の1つは、時系列の視覚化から開始し、いくつかのパラメーター値を直感的に試して、十分に適合するまで何度も変更する手動調整です。 私たちが試みているモデルをよく理解する必要があります。 ARIMAモデルの場合、「p」パラメーターの自己相関プロット、「q」パラメーターの部分自己相関プロット、および時系列の定常性を確認するADFテストと「d」パラメーターの設定を使用して、手動キャリブレーションが行われます。 。 これらすべてについては、今後の章で詳しく説明します。

グリッド検索

モデルを調整するもう1つの方法は、グリッド検索です。これは、基本的に、パラメーターの可能なすべての組み合わせのモデルを作成し、エラーが最小のモデルを選択することを意味します。 これには時間がかかるため、複数のネストされたforループが関係するため、調整するパラメーターの数とそれらが取る値の範囲が少ない場合に役立ちます。

遺伝的アルゴリズム

遺伝的アルゴリズムは、最終的には優れたソリューションが最も「最適な」ソリューションに進化するという生物学的原理に基づいて機能します。 突然変異、交叉、および選択の生物学的操作を使用して、最終的に最適なソリューションに到達します。

さらに知識が必要な場合は、ベイジアン最適化やSwarm最適化など、他のパラメーター最適化手法について読むことができます。

時系列-ナイーブメソッド

前書き

時間 't’での予測値を時間 't-1’での変数の実際の値または系列のローリング平均と仮定するなどの単純な方法を使用して、統計モデルと機械学習モデルがどれだけうまく実行できるかを評価しますそして彼らの必要性を強調します。

この章では、時系列データの機能の1つでこれらのモデルを試してみましょう。

まず、データの「温度」機能の平均とその周辺の偏差を確認します。 また、最大温度値と最小温度値を確認すると便利です。 ここでnumpyライブラリの機能を使用できます。

統計を表示する

[135]で:

import numpy
print (
   'Mean: ',numpy.mean(df['T']), ';
   Standard Deviation: ',numpy.std(df['T']),';
   \nMaximum Temperature: ',max(df['T']),';
   Minimum Temperature: ',min(df['T'])
)

データを理解するのに役立つ等間隔のタイムライン全体のすべての9357観測値の統計があります。

次に、最初の単純な方法を試して、現在の予測値を以前の実際の値に設定し、この方法のパフォーマンスを定量化するために二乗平均平方根誤差(RMSE)を計算します。

1 ^ st ^ナイーブメソッドの表示

[136]で:

df['T']
df['T_t-1'] = df['T'].shift(1)

[137]で:

df_naive = df[[T','T_t-1']][1:]

[138]で:

from sklearn import metrics
from math import sqrt

true = df_naive['T']
prediction = df_naive['T_t-1']
error = sqrt(metrics.mean_squared_error(true,prediction))
print ('RMSE for Naive Method 1: ', error)

単純な方法1のRMSE:12.901140576492974

次の単純な方法を見てみましょう。現在の予測値は、その前の期間の平均と同等です。 この方法のRMSEも計算します。

2 ^ nd ^ナイーブメソッドの表示

[139]で:

df['T_rm'] = df['T'].rolling(3).mean().shift(1)
df_naive = df[[T','T_rm']].dropna()

[140]で:

true = df_naive['T']
prediction = df_naive['T_rm']
error = sqrt(metrics.mean_squared_error(true,prediction))
print ('RMSE for Naive Method 2: ', error)
  • 単純な方法2のRMSE:14.957633272839242 *

ここでは、考慮したい「ラグ」とも呼ばれる以前のさまざまな期間を試すことができますが、ここでは3のままにします。 このデータでは、ラグの数を増やしてエラーを増やすことがわかります。 遅延が1に保たれる場合、それは以前に使用された単純な方法と同じになります。

注意事項

  • 二乗平均平方根誤差を計算するための非常に簡単な関数を書くことができます。 ここでは、パッケージ「sklearn」の平均二乗誤差関数を使用し、その平方根を取得しました。
  • パンダでは、df ['column_name']はdf.column_nameとしても記述できますが、このデータセットでは、df.Tはデータフレームを転置するための関数であるため、df.'T 'と同じようには機能しません。 そのため、df [‘T’]のみを使用するか、他の構文を使用する前にこの列の名前を変更することを検討してください。

時系列-自動回帰

定常時系列の場合、自動回帰モデルは、時間「t」での変数の値を、その前の「p」時間ステップの値の線形関数として認識します。 数学的には次のように書くことができます-

y _ \ {t} = \:C + \:\ phi _ \ {1} y _ \ {t-1} \:+ \:\ phi _ \ {2} Y _ \ {t-2} + ... + \ phi _ \ {p} y _ \ {tp} + \ epsilon _ \ {t}

ここで、「p」は自己回帰トレンドパラメーターです。

$ \ epsilon _ \ {t} $はホワイトノイズであり、

$ y _ \ {t-1}、y _ \ {t-2} \:\:…​ y _ \ {t-p} $は、前の期間の変数の値を示します。

pの値は、さまざまな方法を使用して調整できます。 「p」の適切な値を見つける1つの方法は、自己相関プロットをプロットすることです。

-テストデータはモデルの精度を調べるためのものであり、仮定はそうではないため、データを分析する前に、利用可能な合計データの8:2の比率でデータをトレインとテストに分離する必要があります予測が行われるまで利用できます。 時系列の場合、データポイントのシーケンスは非常に重要であるため、データの分割中に順序を失わないように注意する必要があります。

自己相関プロットまたはコレログラムは、以前のタイムステップでの変数とそれ自体の関係を示します。 ピアソンの相関を利用して、95%信頼区間内の相関を示します。 データの「温度」変数がどのように見えるかを見てみましょう。

ACPを表示

[141]で:

split = len(df) - int(0.2*len(df))
train, test = df['T'][0:split], df['T'][split:]

[142]で:

from statsmodels.graphics.tsaplots import plot_acf

plot_acf(train, lags = 100)
plt.show()

コードスニペット9

影付きの青い領域の外側にあるすべてのラグ値は、相関があると見なされます。

時系列-移動平均

定常時系列の場合、移動平均モデルは、時刻「t」での変数の値を、その前の「q」時間ステップからの残留誤差の線形関数として認識します。 残留誤差は、時刻「t」の値を先行する値の移動平均と比較することにより計算されます。

数学的には次のように書くことができます-

y _ \ {t} = c \:+ \:\ epsilon _ \ {t} \:+ \:\ theta _ \ {1} \:\ epsilon _ \ {t-1} \:+ \:\ theta _ \ { 2} \:\ epsilon _ \ {t-2} \:+ \:... +:\ theta _ \ {q} \:\ epsilon _ \ {tq} \:

「q」は移動平均トレンドパラメーターです

$ \ epsilon _ \ {t} $はホワイトノイズであり、

$ \ epsilon _ \ {t-1}、\ epsilon _ \ {t-2} …​ \ epsilon _ \ {t-q} $は、以前の期間のエラー項です。

「q」の値は、さまざまな方法を使用して調整できます。 「q」の適切な値を見つける1つの方法は、部分自己相関プロットをプロットすることです。

部分的自己相関プロットは、直接相関と間接相関を示す自己相関プロットとは異なり、間接相関が削除された前のタイムステップでの変数とそれ自体の関係を示します。データ。

PACPの表示

[143]で:

from statsmodels.graphics.tsaplots import plot_pacf

plot_pacf(train, lags = 100)
plt.show()

コードスニペット10

部分自己相関は、コリログラムと同じ方法で読み取られます。

時系列-ARIMA

定常時系列では、時刻「t」の変数は以前の観測値または残留誤差の線形関数であることをすでに理解しています。 したがって、2つを組み合わせて、自己回帰移動平均(ARMA)モデルを作成するときが来ました。

ただし、時系列は定常的ではない場合があります。つまり、平均などの系列の統計的性質は、時間とともに変化します。 そして、これまで研究してきた統計モデルは、時系列が定常であると仮定しているため、時系列を差異化して定常にする前処理ステップを含めることができます。 今、私たちが扱っている時系列が静止しているかどうかを知ることが重要です。

時系列の定常性を見つけるさまざまな方法は、時系列のプロットで季節性または傾向を探し、さまざまな期間の平均と分散の差を確認し、Augmented Dickey-Fuller(ADF)テスト、KPSSテスト、Hurstの指数などを調べます。

データセットの「温度」変数が定常時系列であるかどうか、ADFテストを使用していないかどうかを見てみましょう。

[74]で:

from statsmodels.tsa.stattools import adfuller

result = adfuller(train)
print('ADF Statistic: %f' % result[0])
print('p-value: %f' % result[1])
print('Critical Values:')
for key, value In result[4].items()
   print('\t%s: %.3f' % (key, value))

ADF統計:-10.406056

p値:0.000000

重要な値:

1%:-3.431

5%:-2.862

10%:-2.567

ADFテストを実行したので、結果を解釈しましょう。 最初に、ADF統計とクリティカル値を比較します。クリティカル値が低いほど、シリーズが非定常である可能性が高いことを示しています。 次に、p値が表示されます。 0.05より大きいp値は、時系列が非定常であることも示唆しています。

または、p値が0.05以下、またはADF統計値が臨界値未満の場合、時系列が定常であることを示します。

したがって、私たちが扱っている時系列はすでに静止しています。 定常時系列の場合、「d」パラメータを0に設定します。

ハースト指数を使用して時系列の定常性を確認することもできます。

[75]で:

import hurst

H, c,data = hurst.compute_Hc(train)
print("H = {:.4f}, c = {:.4f}".format(H,c))

H = 0.1660、c = 5.0740

H <0.5の値は反永続的な動作を示し、H> 0.5は永続的な動作またはトレンドシリーズを示します。 H = 0.5は、ランダムウォーク/ブラウン運動を示します。 H <0.5の値は、シリーズが静止していることを確認します。

非定常時系列の場合、「d」パラメーターを1に設定します。 また、自己回帰トレンドパラメーター「p」と移動平均トレンドパラメーター「q」の値は、定常時系列で、つまり時系列を区別した後にACPとPACPをプロットすることで計算されます。

3つのパラメーター(p、d、q)で特徴付けられるARIMAモデルが明確になったので、時系列をモデル化し、温度の将来の値を予測しましょう。

[156]で:

from statsmodels.tsa.arima_model import ARIMA

model = ARIMA(train.values, order=(5, 0, 2))
model_fit = model.fit(disp=False)

[157]で:

predictions = model_fit.predict(len(test))
test_ = pandas.DataFrame(test)
test_['predictions'] = predictions[0:1871]

[158]で:

plt.plot(df['T'])
plt.plot(test_.predictions)
plt.show()

コードスニペット13

[167]で:

error = sqrt(metrics.mean_squared_error(test.values,predictions[0:1871]))
print ('Test RMSE for ARIMA: ', error)

ARIMAのRMSEのテスト:43.21252940234892

時系列-ARIMAのバリエーション

前の章では、ARIMAモデルの仕組みと、季節データや多変量時系列を処理できないという制限があるため、これらの機能を含む新しいモデルが導入されました。

これらの新しいモデルの一部をここに示します-

ベクトル自動回帰(VAR)

これは、多変量定常時系列の自動回帰モデルの一般化バージョンです。 「p」パラメータが特徴です。

ベクトル移動平均(VMA)

これは、多変量定常時系列の移動平均モデルの一般化バージョンです。 「q」パラメータが特徴です。

ベクトル自動回帰移動平均(VARMA)

VARとVMAの組み合わせであり、多変量定常時系列用のARMAモデルの一般化バージョンです。 「p」および「q」パラメータによって特徴付けられます。 同様に、ARMAは「q」パラメーターを0に設定することでARモデルのように機能し、「p」パラメーターを0に設定することでMAモデルのように機能します。また、VARMAは「q」パラメーターを設定することでVARモデルのように機能することもできます「p」パラメーターを0に設定して、0およびVMAモデルとして。

[209]で:

df_multi = df[[T', 'C6H6(GT)']]
split = len(df) - int(0.2*len(df))
train_multi, test_multi = df_multi[0:split], df_multi[split:]

[211]で:

from statsmodels.tsa.statespace.varmax import VARMAX

model = VARMAX(train_multi, order = (2,1))
model_fit = model.fit()
c:\users\naveksha\appdata\local\programs\python\python37\lib\site-packages\statsmodels\tsa\statespace\varmax.py:152:
   EstimationWarning: Estimation of VARMA(p,q) models is not generically robust,
   due especially to identification issues.
   EstimationWarning)
c:\users\naveksha\appdata\local\programs\python\python37\lib\site-packages\statsmodels\tsa\base\tsa_model.py:171:
   ValueWarning: No frequency information was provided, so inferred frequency H will be used.
  % freq, ValueWarning)
c:\users\naveksha\appdata\local\programs\python\python37\lib\site-packages\statsmodels\base\model.py:508:
   ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals
  "Check mle_retvals", ConvergenceWarning)

[213]で:

predictions_multi = model_fit.forecast( steps=len(test_multi))
c:\users\naveksha\appdata\local\programs\python\python37\lib\site-packages\statsmodels\tsa\base\tsa_model.py:320:
   FutureWarning: Creating a DatetimeIndex by passing range endpoints is deprecated.  Use `pandas.date_range` instead.
   freq = base_index.freq)
c:\users\naveksha\appdata\local\programs\python\python37\lib\site-packages\statsmodels\tsa\statespace\varmax.py:152:
   EstimationWarning: Estimation of VARMA(p,q) models is not generically robust, due especially to identification issues.
   EstimationWarning)

[231]で:

plt.plot(train_multi['T'])
plt.plot(test_multi['T'])
plt.plot(predictions_multi.iloc[:,0:1], '--')
plt.show()

plt.plot(train_multi['C6H6(GT)'])
plt.plot(test_multi['C6H6(GT)'])
plt.plot(predictions_multi.iloc[:,1:2], '--')
plt.show()

コードスニペット14

コードスニペット14

上記のコードは、VARMAモデルを使用して多変量時系列をモデル化する方法を示していますが、このモデルはデータに最適ではない場合があります。

外生変数を持つVARMA(VARMAX)

これはVARMAモデルの拡張であり、共変量と呼ばれる追加の変数を使用して、関心のある主変数をモデル化します。

季節性自己回帰統合移動平均(SARIMA)

これは、季節データを処理するためのARIMAモデルの拡張です。 データを季節成分と非季節成分に分割し、同様の方法でモデル化します。 ARIMAモデルと同じ非季節部分(p、d、q)パラメーターと、季節部分(P、D、Q、m)パラメーターの7つ​​のパラメーターが特徴です。 P、D、Qは、ARIMAモデルのパラメーターに似ています。 これらのパラメーターは、グリッド検索または遺伝的アルゴリズムを使用して調整できます。

外生変数を使用したSARIMA(SARIMAX)

これは、興味のある変数をモデル化するのに役立つ外因性変数を含むSARIMAモデルの拡張です。

変数を外生変数として配置する前に、相関関係分析を行うと役立つ場合があります。

[251]で:

from scipy.stats.stats import pearsonr
x = train_multi['T'].values
y = train_multi['C6H6(GT)'].values

corr , p = pearsonr(x,y)
print ('Corelation Coefficient =', corr,'\nP-Value =',p)
Corelation Coefficient = 0.9701173437269858
P-Value = 0.0

ピアソンの相関関係は2つの変数間の線形関係を示しています。結果を解釈するために、まずp値を調べます。0.05未満の場合は係数の値が重要で、そうでない場合は係数の値は重要ではありません。 有意なp値の場合、相関係数の正の値は正の相関を示し、負の値は負の相関を示します。

したがって、データでは、「温度」と「C6H6」は非常に正の相関があるようです。 したがって、私たちは

[297]:

from statsmodels.tsa.statespace.sarimax import SARIMAX

model = SARIMAX(x, exog = y, order = (2, 0, 2), seasonal_order = (2, 0, 1, 1), enforce_stationarity=False, enforce_invertibility = False)
model_fit = model.fit(disp = False)
c:\users\naveksha\appdata\local\programs\python\python37\lib\site-packages\statsmodels\base\model.py:508:
   ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals
   "Check mle_retvals", ConvergenceWarning)

[298]で:

y_ = test_multi['C6H6(GT)'].values
predicted = model_fit.predict(exog=y_)
test_multi_ = pandas.DataFrame(test)
test_multi_['predictions'] = predicted[0:1871]

[299]で:

plt.plot(train_multi['T'])
plt.plot(test_multi_['T'])
plt.plot(test_multi_.predictions, '--')

アウト[299]:

[<matplotlib.lines.Line2D at 0x1eab0191c18>]

ここでの予測は、単変量ARIMAモデリングとは対照的に、より大きなバリエーションをとるようです。

言うまでもなく、SARIMAXは、対応するパラメーターのみをゼロ以外の値に設定することにより、ARX、MAX、ARMAXまたはARIMAXモデルとして使用できます。

フラクショナル自己回帰統合移動平均(FARIMA)

時折、シリーズが静止していないことがありますが、値「1」をとる「d」パラメータとの差はそれを過大差する可能性があります。 そのため、小数値を使用して時系列を区別する必要があります。

データサイエンスの世界では、優れたモデルはありません。データで機能するモデルは、データセットに大きく依存します。 さまざまなモデルの知識があれば、データを処理するモデルを選択し、そのモデルで実験して最良の結果を得ることができます。 また、結果はプロットおよびエラーメトリックとして表示される必要があります。小さなエラーも悪い場合があるため、結果をプロットして視覚化することが不可欠です。

次の章では、別の統計モデルである指数平滑法について説明します。

時系列-指数平滑法

この章では、時系列の指数平滑化に関連する手法について説明します。

単純な指数平滑法

指数平滑法は、指数関数的に減少する重みを一定期間にわたってデータに割り当てることにより、単変量時系列を平滑化する手法です。

数学的には、時刻t、y_(t + 1 | t)で値が与えられた時刻 't + 1’の変数の値は次のように定義されます-

y _ \ {t + 1 | t} \:= \:\ alpha y _ \ {t} \:+ \:\ alpha \ lgroup1-\ alpha \ rgroup y _ \ {t-1} \:+ \ alpha \ lgroup1- \ alpha \ rgroup ^ \ {2} \:y _ \ {t-2} \:+ \:... + y _ \ {1}

ここで、$ 0 \ leq \ alpha \ leq1 $は平滑化パラメーターであり、

$ y _ \ {1}、…​.、y _ \ {t} $は、時刻1、2、3、…、tにおけるネットワークトラフィックの以前の値です。

これは、明確な傾向や季節性のない時系列をモデル化する簡単な方法です。 ただし、指数平滑法は、傾向と季節性のある時系列にも使用できます。

トリプル指数平滑化

Triple Exponential Smoothing(TES)またはHoltのWinterメソッドは、指数平滑化を3回適用します-レベル平滑化$ l _ \ {t} $、トレンド平滑化$ b _ \ {t} $、季節平滑化$ S _ \ {t} $、$ \ alpha $、$ \ beta ^ \ {*} $および$ \ gamma $は、季節性の頻度が「m」の平滑化パラメーターです。つまり、 1年の季節の数。

季節的要素の性質によると、TESには2つのカテゴリーがあります-

  • * Holt-Winterの加法*-季節性が本質的に加法である場合。
  • * Holt-Winterの乗法*-季節性が本質的に乗法である場合。

非季節時系列の場合、トレンド平滑化とレベル平滑化のみがあり、これはホルトの線形トレンド法と呼ばれます。

データに三重指数平滑法を適用してみましょう。

[316]:

from statsmodels.tsa.holtwinters import ExponentialSmoothing

model = ExponentialSmoothing(train.values, trend= )
model_fit = model.fit()

[322]で:

predictions_ = model_fit.predict(len(test))

[325]で:

plt.plot(test.values)
plt.plot(predictions_[1:1871])

アウト[325]:

[<matplotlib.lines.Line2D at 0x1eab00f1cf8>]

コードスニペット17

ここでは、トレーニングセットを使用してモデルを一度トレーニングし、その後予測を続けています。 より現実的なアプローチは、1つ以上のタイムステップの後にモデルを再トレーニングすることです。 時間「t + 1」のトレーニングデータから時間「t + 1」の予測を取得すると、時間「t + 2」の次の予測は、トレーニングデータ「til時間「t + 1」」を実際に使用して行うことができます’t + 1’の値はそのとき知られます。 1つ以上の将来のステップの予測を行い、モデルを再トレーニングするこの方法は、ローリングフォーキャストまたはウォークフォワード検証と呼ばれます。

時系列-ウォークフォワード検証

時系列モデリングでは、時間の経過に伴う予測の精度が低下するため、実際のデータでモデルを再トレーニングして、さらに予測できるようになると、より現実的なアプローチになります。 統計モデルのトレーニングには時間がかかりませんので、最も正確な結果を得るためには、ウォークフォワード検証が最も推奨されるソリューションです。

データにワンステップウォークフォワード検証を適用して、以前に得た結果と比較してみましょう。

[333]で:

prediction = []
data = train.values
for t In test.values:
   model = (ExponentialSmoothing(data).fit())
   y = model.predict()
   prediction.append(y[0])
   data = numpy.append(data, t)

[335]で:

test_ = pandas.DataFrame(test)
test_['predictionswf'] = prediction

[341]で:

plt.plot(test_['T'])
plt.plot(test_.predictionswf, '--')
plt.show()

コードスニペット18

[340]で:

error = sqrt(metrics.mean_squared_error(test.values,prediction))
print ('Test RMSE for Triple Exponential Smoothing with Walk-Forward Validation: ', error)
Test RMSE for Triple Exponential Smoothing with Walk-Forward Validation:  11.787532205759442

モデルのパフォーマンスが大幅に向上していることがわかります。 実際、傾向は非常に厳密に追跡されるため、プロット上で予測が実際の値と重なっています。 ARIMAモデルにもウォークフォワード検証を適用してみてください。

時系列-預言者モデル

2017年、Facebookは、日レベル、週レベル、年レベルなどの強い複数の季節性を持つ時系列をモデリングできる預言者モデルをオープンソース化しました。 とトレンド。 専門家ではないデータサイエンティストがより良い予測のために調整できる直感的なパラメーターがあります。 その中心は、変化点を検出して時系列をモデル化できる加法回帰モデルです。

預言者は時系列をトレンド$ g _ \ {t} $、季節性$ S _ \ {t} $および休日$ h _ \ {t} $のコンポーネントに分解します。

y _ \ {t} = g _ \ {t} + s _ \ {t} + h _ \ {t} + \ epsilon _ \ {t}

ここで、$ \ epsilon _ \ {t} $はエラー用語です。

因果的影響や異常検出などの時系列予測用の同様のパッケージが、RとGoogleによってそれぞれ導入されました。

時系列-LSTMモデル

現在、時系列の統計モデリングに精通していますが、現在、機械学習は大流行しています。そのため、いくつかの機械学習モデルにも精通することが不可欠です。 時系列領域で最も人気のあるモデル-長期短期記憶モデルから始めましょう。

LSTMは、リカレントニューラルネットワークのクラスです。 したがって、LSTMにジャンプする前に、ニューラルネットワークとリカレントニューラルネットワークを理解することが不可欠です。

ニューラルネットワーク

人工ニューラルネットワークは、生物学的なニューラルネットワークに触発された、接続されたニューロンの階層構造です。 1つのアルゴリズムではなく、さまざまなアルゴリズムの組み合わせにより、データに対して複雑な操作を行うことができます。

リカレントニューラルネットワーク

これは、時間データを処理するように調整されたニューラルネットワークのクラスです。 RNNのニューロンにはセル状態/メモリがあり、入力はこの内部状態に従って処理されます。これは、ニューラルネットワークのループの助けを借りて実現されます。 RNNには、情報を保持できる「tanh」レイヤーの繰り返しモジュールがあります。 ただし、長期間ではないため、LSTMモデルが必要です。

LSTM

これは、データの長期的な依存関係を学習できる特別な種類のリカレントニューラルネットワークです。 これは、モデルの繰り返しモジュールに相互作用する4つのレイヤーの組み合わせがあるために達成されます。

ニューラルネットワーク

上の図では、4つのニューラルネットワークレイヤーが黄色のボックスで、点ごとの演算子が緑色の円で、入力が黄色の円で、セルの状態が青色の円で示されています。 LSTMモジュールには、セル状態と3つのゲートがあり、各ユニットから情報を選択的に学習、学習解除、または保持するための電力を提供します。 LSTMのセル状態は、わずかな線形相互作用のみを許可することにより、情報が変更されることなくユニットを流れるのを助けます。 各ユニットには、セルの状態に情報を追加または削除できる入力、出力、および忘却ゲートがあります。 忘却ゲートは、シグモイド関数を使用するために、以前のセル状態からのどの情報を忘れるべきかを決定します。 入力ゲートは、それぞれ「シグモイド」と「tanh」の点ごとの乗算演算を使用して、現在のセル状態への情報の流れを制御します。 最後に、出力ゲートは次の非表示状態に渡す情報を決定します

LSTMモデルの内部動作を理解したので、それを実装しましょう。 LSTMの実装を理解するために、単純な例-直線から始めます。 LSTMが直線の関係を学習して予測できるかどうかを見てみましょう。

まず、直線を描いたデータセットを作成しましょう。

[402]で:

x = numpy.arange (1,500,1)
y = 0.4 * x + 30
plt.plot(x,y)

アウト[402]:

[<matplotlib.lines.Line2D at 0x1eab9d3ee10>]

コードスニペット19

[403]で:

trainx, testx = x[0:int(0.8*(len(x)))], x[int(0.8*(len(x))):]
trainy, testy = y[0:int(0.8*(len(y)))], y[int(0.8*(len(y))):]
train = numpy.array(list(zip(trainx,trainy)))
test = numpy.array(list(zip(trainx,trainy)))

データが作成され、トレーニングとテストに分割されました。 ルックバック期間の値に応じて、時系列データを教師あり学習データの形式に変換します。これは、本質的に、時間「t」で値を予測するために見られるラグの数です。

だからこのような時系列-

time variable_x
t1  x1
t2  x2
 :   :
 :   :
T   xT

ルックバック期間が1の場合は、に変換されます-

x1   x2
x2   x3
 :    :
 :    :
xT-1 xT

[404]で:

def create_dataset(n_X, look_back):
   dataX, dataY = [], []
   for i in range(len(n_X)-look_back):
      a = n_X[i:(i+look_back), ]
      dataX.append(a)
      dataY.append(n_X[i + look_back, ])
   return numpy.array(dataX), numpy.array(dataY)

[405]で:

look_back = 1
trainx,trainy = create_dataset(train, look_back)
testx,testy = create_dataset(test, look_back)

trainx = numpy.reshape(trainx, (trainx.shape[0], 1, 2))
testx = numpy.reshape(testx, (testx.shape[0], 1, 2))

次に、モデルをトレーニングします。

トレーニングデータの小さなバッチがネットワークに表示され、トレーニングデータ全体がバッチでモデルに表示され、エラーが計算される1回の実行はエポックと呼ばれます。 エポックは、エラーが減少するまで実行されます。

[]内:

from keras.models import Sequential
from keras.layers import LSTM, Dense

model = Sequential()
model.add(LSTM(256, return_sequences = True, input_shape = (trainx.shape[1], 2)))
model.add(LSTM(128,input_shape = (trainx.shape[1], 2)))
model.add(Dense(2))
model.compile(loss = 'mean_squared_error', optimizer = 'adam')
model.fit(trainx, trainy, epochs = 2000, batch_size = 10, verbose = 2, shuffle = False)
model.save_weights('LSTMBasic1.h5')

[407]で:

model.load_weights('LSTMBasic1.h5')
predict = model.predict(testx)

それでは、予測がどのように見えるか見てみましょう。

[408]で:

plt.plot(testx.reshape(398,2)[:,0:1], testx.reshape(398,2)[:,1:2])
plt.plot(predict[:,0:1], predict[:,1:2])

アウト[408]:

[<matplotlib.lines.Line2D at 0x1eac792f048>]

コードスニペット22

次に、サイン波またはコサイン波を同様の方法でモデル化してみてください。 以下に示すコードを実行し、モデルパラメーターを操作して、結果がどのように変化するかを確認できます。

[409]で:

x = numpy.arange (1,500,1)
y = numpy.sin(x)
plt.plot(x,y)

アウト[409]:

[<matplotlib.lines.Line2D at 0x1eac7a0b3c8>]

コードスニペット23

[410]で:

trainx, testx = x[0:int(0.8*(len(x)))], x[int(0.8*(len(x))):]
trainy, testy = y[0:int(0.8*(len(y)))], y[int(0.8*(len(y))):]
train = numpy.array(list(zip(trainx,trainy)))
test = numpy.array(list(zip(trainx,trainy)))

[411]で:

look_back = 1
trainx,trainy = create_dataset(train, look_back)
testx,testy = create_dataset(test, look_back)
trainx = numpy.reshape(trainx, (trainx.shape[0], 1, 2))
testx = numpy.reshape(testx, (testx.shape[0], 1, 2))

[]内:

model = Sequential()
model.add(LSTM(512, return_sequences = True, input_shape = (trainx.shape[1], 2)))
model.add(LSTM(256,input_shape = (trainx.shape[1], 2)))
model.add(Dense(2))
model.compile(loss = 'mean_squared_error', optimizer = 'adam')
model.fit(trainx, trainy, epochs = 2000, batch_size = 10, verbose = 2, shuffle = False)
model.save_weights('LSTMBasic2.h5')

[413]で:

model.load_weights('LSTMBasic2.h5')
predict = model.predict(testx)

[415]で:

plt.plot(trainx.reshape(398,2)[:,0:1], trainx.reshape(398,2)[:,1:2])
plt.plot(predict[:,0:1], predict[:,1:2])

アウト[415]:

[<matplotlib.lines.Line2D at 0x1eac7a1f550>]

コードスニペット23

これで、任意のデータセットに進む準備ができました。

時系列-エラーメトリック

モデルのパフォーマンスを定量化してフィードバックおよび比較として使用することが重要です。 このチュートリアルでは、最も一般的なエラーメトリックの二乗平均平方根エラーを使用しました。 他にもさまざまなエラーメトリックが利用可能です。 この章では、それらについて簡単に説明します。

平均二乗誤差

これは、予測値と真の値の差の2乗の平均です。 Sklearnはそれを関数として提供します。 これは、真の値と予測値の二乗と同じ単位を持ち、常に正です。

MSE = \ frac \ {1} \ {n} \ displaystyle \ sum \ limits _ \ {t = 1} ^ n \ lgroup y '_ \ {t} \:-y _ \ {t} \ rgroup ^ \ { 2}

$ y '_ \ {t} $が予測値である場合、

$ y _ \ {t} $は実際の値であり、

nは、テストセット内の値の総数です。

式から、MSEがより大きなエラーまたは外れ値に対してよりペナルティを課していることが明らかです。

二乗平均誤差

これは、平均二乗誤差の平方根です。 また、常に正であり、データの範囲内にあります。

RMSE = \ sqrt \ {\ frac \ {1} \ {n} \ displaystyle \ sum \ limits _ \ {t = 1} ^ n \ lgroup y '_ \ {t} -y _ \ {t} \ rgroup ^ 2}

ここで、$ y '_ \ {t} $は予測値です

$ y _ \ {t} $は実際の値であり、

nは、テストセット内の値の総数です。

それは団結の力であり、したがってMSEと比較してより解釈可能です。 RMSEは、より大きなエラーに対してもより不利になります。 チュートリアルではRMSEメトリックを使用しました。

平均絶対誤差

これは、予測値と真の値の絶対差の平均です。 予測値と真値と同じ単位を持ち、常に正です。

MAE = \ frac \ {1} \ {n} \ displaystyle \ sum \ limits _ \ {t = 1} ^ \ {t = n} | y '\ {t} -y _ \ {t} \ lvert

ここで、$ y '_ \ {t} $は予測値です。

$ y _ \ {t} $は実際の値であり、

nは、テストセット内の値の総数です。

平均パーセント誤差

これは、予測値と真の値の絶対差の平均の割合を真の値で割ったものです。

MAPE = \ frac \ {1} \ {n} \ displaystyle \ sum \ limits _ \ {t = 1} ^ n \ frac \ {y '_ \ {t} -y _ \ {t}} \ {y_ \ {t}} *100 \:\%

ここで、$ y '_ \ {t} $は予測値です。

$ y _ \ {t} $は実際の値で、nはテストセットの値の総数です。

ただし、このエラーを使用する場合の欠点は、正のエラーと負のエラーが互いに相殺できることです。 したがって、平均絶対パーセント誤差が使用されます。

平均絶対パーセント誤差

これは、予測値と真の値の絶対差の平均の割合を真の値で割ったものです。

MAPE = \ frac \ {1} \ {n} \ displaystyle \ sum \ limits _ \ {t = 1} ^ n \ frac \ {| y '_ \ {t} -y _ \ {t} \ lvert} \ {y _ \ {t}}* 100 \:\%

$ y '_ \ {t} $は予測値です

$ y _ \ {t} $は実際の値であり、

nは、テストセット内の値の総数です。

時系列-アプリケーション

このチュートリアルでは時系列分析について説明しましたが、時系列モデルはまず既存の観測から傾向と季節性を認識し、次にこの傾向と季節性に基づいて値を予測するという理解を与えました。 このような分析は、次のようなさまざまな分野で役立ちます-

  • 財務分析-売上予測、在庫分析、株式市場分析、価格推定が含まれます。
  • 天気解析-温度推定、気候変動、季節変化の認識、天気予報が含まれます。
  • ネットワークデータ分析-ネットワーク利用予測、異常または侵入検知、予測メンテナンスが含まれます。
  • ヘルスケア分析-国勢調査予測、保険給付予測、患者モニタリングが含まれます。

時系列-さらなる範囲

機械学習はさまざまな種類の問題を扱います。 実際、ほとんどすべてのフィールドには、機械学習の助けを借りて自動化または改善する範囲があります。 多くの作業が行われているいくつかのそのような問題を以下に示します。

時系列データ

これは、時間に応じて変化するデータであるため、このチュートリアルでは主に説明したように、時間は重要な役割を果たします。

非時系列データ

これは時間に依存しないデータであり、ML問題の大部分は非時系列データにあります。 簡単にするために、さらに次のように分類します-

  • 数値データ-人間とは異なり、コンピューターは数字のみを理解するため、すべての種類のデータは機械学習のために最終的に数値データに変換されます。たとえば、画像データは(r、b、g)値に変換され、文字はASCIIコードまたは単語は数字にインデックス付けされ、音声データは数値データを含むmfccファイルに変換されます。
  • 画像データ-コンピュータービジョンはコンピューターの世界に革命をもたらしました。医療、衛星画像などの分野でさまざまな用途があります。
  • テキストデータ-自然言語処理(NLP)は、テキストの分類、言い換えの検出、および言語の要約に使用されます。 これが、GoogleとFacebookをスマートにする理由です。
  • 音声データ-音声処理には、音声認識と感情理解が含まれます。 コンピューターに人間らしさを与える重要な役割を果たします。