common.title

Docs
Quantum Circuit
TYTAN CLOUD

QUANTUM GAMING


Overview
Contact
Event
Project
Research

Terms of service (Web service)

Terms of service (Quantum and ML Cloud service)

Privacy policy


Sign in
Sign up
common.title

Kaggleの時系列予測のチュートリアルを見てみる。前半戦、時系列と線形回帰、トレンド、季節性、シリアル依存性。

Yuichiro Minato

2023/10/09 05:14

こんにちは。データ関連の仕事をしたいと考えていますが、時系列データに関してGoogleのチュートリアルを見てみたいと思います。URLはこちらです。結果としてほぼコピペになってしまいました。。。すいません。

https://www.kaggle.com/learn/time-series

時系列における線形回帰

https://www.kaggle.com/code/ryanholbrook/linear-regression-with-time-series

最初のチュートリアルがこちらになっています。まずは時系列と呼ばれるものに関して少しなじみを持ってもらうために書いてあります。

予測は、現実世界での機械学習の最も一般的な応用のおそらく1つです。企業は製品の需要を予測し、政府は経済成長や人口増加を予測し、気象学者は天気を予測します。科学、政府、産業をはじめ、私たちの個人的な生活においても、これからのことを理解することは重要なニーズとなっており、これらの分野の専門家は増加して機械学習を適用してこのニーズに対応しています。

時系列データとは、時間経過とともに記録された一連の観測です。予測のアプリケーションでは、観測は通常、毎日や毎月のように定期的な頻度で記録されます。

例題:

#ツールの読み込み
import pandas as pd

#データを読みこみ、indexを日付にします。
df = pd.read_csv(
"../input/ts-course-data/book_sales.csv",
index_col='Date',
parse_dates=['Date'],
).drop('Paperback', axis=1)

df.head()

CSVのデータからDateと呼ばれる日付を見てみます。この時系列データでは、小売店でのハードカバーの本の売上を30日間記録しています。時間のインデックスとして「Date」と、観測値を示す「Hardcover」という列があります。

線形回帰アルゴリズムは、入力特徴から加重和を取る方法を学びます。2つの特徴に対しては、以下のような式となります:

目的変数 = 重み_1 * 特徴_1 + 重み_2 * 特徴_2 + バイアス

訓練中に、回帰アルゴリズムは目的変数に最も適合する重み_1、重み_2、およびバイアスの値を学びます。(このアルゴリズムは、目的変数と予測値との間の二乗誤差を最小化する値を選択するため、普通の最小二乗法とも呼ばれます。)重みは回帰係数とも呼ばれ、バイアスはこの関数のグラフがy軸を横切る点を示すため、切片とも呼ばれます。

時間ステップ特徴量

時系列に固有の特徴量は、時間ステップ特徴量とラグ特徴量の2つがあります。時間ステップ特徴量は、時間のインデックスから直接導き出すことができる特徴量です。最も基本的な時間ステップ特徴はタイムダミーで、シリーズの始めから終わりまでの時間ステップを数えます。

import numpy as np

#表のindex数から分割数を導いて時間ステップ列に格納
df['Time'] = np.arange(len(df.index))

df.head()

タイムダミーを使用した線形回帰は以下のモデルを生成します:

目的変数 = 重み * 時間 + バイアス

このタイムダミーにより、x軸を時間として時系列にカーブをフィットさせることができます。

Kaggleの例題のコードを見てみると、

import matplotlib.pyplot as plt
import seaborn as sns

plt.style.use("seaborn-whitegrid")

plt.rc(
"figure",
autolayout=True,
figsize=(11, 4),
titlesize=18,
titleweight='bold',
)

plt.rc(
"axes",
labelweight="bold",
labelsize="large",
titleweight="bold",
titlesize=16,
titlepad=10,
)

%config InlineBackend.figure_format = 'retina'

fig, ax = plt.subplots()

#折れ線グラフのプロット
ax.plot('Time', 'Hardcover', data=df, color='0.75')

#回帰直線のプロット、上と同様Timeをx軸に、Hardcoverをy軸に設定している。
ax = sns.regplot(x='Time', y='Hardcover', data=df, ci=None, scatter_kws=dict(color='0.25'))
ax.set_title('Time Plot of Hardcover Sales');

時間ステップ特徴量を使用すると、時間依存性をモデル化することができます。一方、ラグ特徴もあります。ラグ特徴を作成するためには、目的変数の値をステップでずらして差分をとります。下では1ステップのラグ特徴を作成しましたが、複数のステップでのシフトも可能です。

#Lag_1という列を作ってshift(1)でずらして入れている。最初の行はNaNに。
df['Lag_1'] = df['Hardcover'].shift(1)
df = df.reindex(columns=['Hardcover', 'Lag_1'])

df.head()

ラグ特徴量を使用した線形回帰は以下のモデルを生成します:

目的変数 = 重み * ラグ + バイアス

したがって、ラグ特徴量を使用すると、時系列の各観測が前の観測と比較してプロットされるラグプロットにカーブをフィットさせることができます。

fig, ax = plt.subplots()
ax = sns.regplot(x='Lag_1', y='Hardcover', data=df, ci=None, scatter_kws=dict(color='0.25'))
ax.set_aspect('equal')
ax.set_title('Lag Plot of Hardcover Sales');

ラグプロットから、ある日の売上(ハードカバー)が前日(Lag_1)の売上と相関していることがわかります。このような関係を見ると、ラグ特徴量が有用であることがわかります。一般的に、ラグ特徴量を使用すると、直列の依存関係をモデル化することができます。時系列には直列の依存関係が存在する場合、観測は前の観測から予測できます。ハードカバーの売上の場合、ある日の高い売上は通常、翌日も高い売上を意味することを予測することができます。

機械学習アルゴリズムを時系列の問題に適応させることは、主に時間のインデックスとラグを使用した特徴エンジニアリングに関連しています。このコースのほとんどで、私たちはそのシンプルさのために線形回帰を使用していますが、予測タスクのために選択するアルゴリズムに関係なく、これらの特徴は役立つでしょう。

トレンド

時系列のトレンド成分は、シリーズの平均における持続的な長期的な変化を表します。トレンドはシリーズの動きが最も遅い部分であり、最も重要な時間尺度を表す部分です。製品の売上の時系列では、増加するトレンドは市場が拡大する効果として見ることができ、年々多くの人々がその製品を知るようになる可能性があります。

移動平均

時系列がどのようなトレンドを持っているかを確認するために、移動平均を使用することができます。時系列の移動平均を計算するためには、ある定義された幅のスライディングウィンドウ内の値の平均を計算します。グラフ上の各点は、ウィンドウの両側にあるシリーズのすべての値の平均を表します。この考え方の目的は、シリーズの短期的な変動を平滑化して、長期的な変化だけが残るようにすることです。

Kaggleの注記

上記のマウナロア系列には、年々繰り返し上下する動きがあることに注意してください。これは短期的な季節的な変化です。変化がトレンドの一部として考慮されるためには、それは季節的な変化よりも長い期間にわたって発生する必要があります。したがって、トレンドを視覚化するためには、シリーズ内の任意の季節的な期間よりも長い期間にわたって平均を取る必要があります。マウナロア系列の場合、私たちは各年のシーズンを平滑化するために、サイズ12のウィンドウを選びました。

トレンドの実装

トレンドの形を特定したら、時間ステップ特徴量を使用してそれをモデル化しようと試みることができます。時間のダミー自体を使用すると線形のトレンドがモデル化されることは既に見てきました:

目的変数 = a * 時間 + b

時間のダミーを変換することで、他の多くの種類のトレンドをフィットさせることができます。トレンドが二次的(放物線)であるように見える場合、特徴セットに時間のダミーの二乗を追加するだけで良いのです:

目的変数 = a * 時間 ** 2 + b * 時間 + c

線形回帰は係数a、b、cを学びます。 以下の図のトレンドの曲線は、これらの種類の特徴を使用して、scikit-learnのLinearRegressionを用いてフィットされました:

トレンドの例題

どうやらスイスのベーレックというところのトンネルの交通量を使った時系列のデータセットがあるようです。

from pathlib import Path
from warnings import simplefilter

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

simplefilter("ignore") # ignore warnings to clean up output cells

Set Matplotlib defaults

plt.style.use("seaborn-whitegrid")
plt.rc("figure", autolayout=True, figsize=(11, 5))
plt.rc(
"axes",
labelweight="bold",
labelsize="large",
titleweight="bold",
titlesize=14,
titlepad=10,
)
plot_params = dict(
color="0.75",
style=".-",
markeredgecolor="0.25",
markerfacecolor="0.25",
legend=False,
)
%config InlineBackend.figure_format = 'retina'

Load Tunnel Traffic dataset

data_dir = Path("../input/ts-course-data")
tunnel = pd.read_csv(data_dir / "tunnel.csv", parse_dates=["Day"])
tunnel = tunnel.set_index("Day").to_period()

このシリーズがどのようなトレンドを持っているかを確認するために、移動平均プロットを作成してみましょう。このシリーズは毎日の観測を持っているので、年間の短期的な変動を平滑化するために365日のウィンドウを選びましょう。

移動平均を作成するには、まずrollingメソッドを使用してウィンドウ計算を開始します。その後、meanメソッドを使用してウィンドウ内の平均を計算します。見ての通り、「Tunnel Traffic」のトレンドはほぼ線形のようです。

moving_average = tunnel.rolling(
window=365, # 365-day window
center=True, # puts the average at the center of the window
min_periods=183, # choose about half the window size
).mean() # compute the mean (could also do median, std, min, max, ...)

ax = tunnel.plot(style=".", color="0.5")
moving_average.plot(
ax=ax, linewidth=3, title="Tunnel Traffic - 365-Day Moving Average", legend=False,
);

レッスン1では、Pandasで直接タイムダミーをエンジニアリングしました。しかし、今後は、statsmodelsライブラリの「DeterministicProcess」という関数を使用します。この関数を使用することで、時系列と線形回帰で発生する可能性のある難しい失敗のケースを回避するのに役立ちます。「order」引数は、多項式の次数を指します:1は線形、2は二次、3は三次、という具体的な意味です。

from statsmodels.tsa.deterministic import DeterministicProcess

dp = DeterministicProcess(
index=tunnel.index, # dates from the training data
constant=True, # dummy feature for the bias (y_intercept)
order=1, # the time dummy (trend)
drop=True, # drop terms if necessary to avoid collinearity
)

`in_sample` creates features for the dates given in the `index` argument

X = dp.in_sample()

X.head()

from sklearn.linear_model import LinearRegression

y = tunnel["NumVehicles"] # the target

The intercept is the same as the `const` feature from

DeterministicProcess. LinearRegression behaves badly with duplicated

features, so we need to be sure to exclude it here.

model = LinearRegression(fit_intercept=False)
model.fit(X, y)

y_pred = pd.Series(model.predict(X), index=X.index)

私たちのLinearRegressionモデルで発見されたトレンドは、移動平均プロットとほぼ同一です。これは、このケースでの線形のトレンドが正しい選択であったことを示唆しています。

ax = tunnel.plot(style=".", color="0.5", title="Tunnel Traffic - Linear Trend")
_ = y_pred.plot(ax=ax, linewidth=3, label="Trend")

30日間の上記サンプル以外の予測をします。

X = dp.out_of_sample(steps=30)

y_fore = pd.Series(model.predict(X), index=X.index)

y_fore.head()

2005-11-17 114981.801146
2005-11-18 115004.298595
2005-11-19 115026.796045
2005-11-20 115049.293494
2005-11-21 115071.790944
Freq: D, dtype: float64

プロットすると、

ax = tunnel["2005-05":].plot(title="Tunnel Traffic - Linear Trend Forecast", **plot_params)
ax = y_pred["2005-05":].plot(ax=ax, linewidth=3, label="Trend")
ax = y_fore.plot(ax=ax, linewidth=3, label="Trend Forecast", color="C3")
_ = ax.legend()

季節性とは何か?

時系列がシリーズの平均値に定期的な周期的な変化を示すとき、その時系列は季節性を持つと言います。季節的な変化は一般的に時計やカレンダーに従っています。1日、1週間、1年を通じての繰り返しは一般的です。季節性は、日々や年々にわたる自然界のサイクルや、日付や時間を取り巻く社会的行動の慣習によって駆動されることがよくあります。

私たちは季節性をモデル化する2種類の特徴量を学びます。最初の種類であるインジケータは、日々の観測の週刊シーズンのように、少ない観測を持つシーズンに最適です。2番目の種類であるフーリエ特徴量は、日々の観測の年間シーズンのように、多くの観測を持つシーズンに最適です。

季節プロットと季節インジケータ

トレンドを発見するために移動平均プロットを使用したのと同様に、季節的なパターンを発見するために季節プロットを使用することができます。季節プロットは、一部の時系列を共通の期間に対してプロットしたものを示しており、この期間は観察したい「季節」です。

図は、Wikipediaの「三角法」に関する記事の日々の閲覧数の季節プロットを示しています:

記事の日々の閲覧数は、共通の週次期間にプロットされています。

季節性インジケータ

季節性インジケータは、時系列のレベルにおける季節的な差異を表す二値特徴です。季節的な期間をカテゴリカルな特徴として扱い、ワンホットエンコーディングを適用すると季節性インジケータが得られます。週の日付をワンホットエンコーディングすることで、週次の季節性インジケータを取得します。三角法のシリーズに対して週次のインジケータを作成すると、6つの新しい「ダミー」特徴が得られます。(線形回帰は、インジケータのうち1つを落とした方が最も良い結果をもたらします。以下のフレームでは月曜日を選びました。)

季節性インジケータをトレーニングデータに追加することで、モデルは季節的な期間内の平均を区別するのに役立ちます:

これらのインジケータはオン/オフのスイッチとして機能します。ある時点で、これらのインジケータのうち最大1つだけが1(オン)の値を持つことができます。線形回帰はMonに対してベースライン値2379を学習し、その日にオンになっているインジケータの値で調整します。残りは0で消失します。

フーリエ特徴と周期グラム

今私たちが議論する特徴の種類は、インジケータが非実用的な多くの観測を持つ長いシーズンにより適しています。各日付ごとに特徴を作成する代わりに、フーリエ特徴量はいくつかの特徴量だけで季節のカーブの全体的な形を捉えようとします。三角法の年間シーズンのプロットを見てみましょう。さまざまな周波数の繰り返しに注意してください。年に3回の長い上下の動き、年に52回の短い週間の動き、おそらくその他もあります。

季節内のこれらの周波数をフーリエ特徴で捉えようと試みるものです。考え方としては、モデル化しようとしているシーズンと同じ周波数を持つ周期的なカーブをトレーニングデータに含めることです。使用するカーブは、三角関数のサインとコサインのものです。フーリエ特徴はサインとコサインのカーブのペアであり、最も長いものから始まるシーズン内の各潜在的な周波数に対して一組ずつ存在します。年間の季節性をモデル化するフーリエペアは、年に1回、年に2回、年に3回、などの周波数を持ちます。

これらのサイン/コサインのカーブのセットをトレーニングデータに追加すると、線形回帰アルゴリズムは、ターゲットシリーズの季節性成分にフィットする重みを計算します。図は、線形回帰が4組のフーリエペアを使用してWikiの三角法シリーズの年間の季節性をモデル化した方法を示しています。

年間の季節性をよく推定するのに8つの特徴(4つのサイン/コサインのペア)だけが必要であったことに注意してください。これを季節インジケータの方法と比較すると、年間の各日に対して1つの特徴が必要となり、数百の特徴が必要になります。フーリエ特徴で季節性の「主要な効果」のみをモデル化することで、通常、トレーニングデータに追加する特徴の数を大幅に減少させることができ、これにより計算時間が短縮され、過学習のリスクも低くなります。 周期グラムを使用してフーリエ特徴を選択する 実際に特徴セットに含めるべきフーリエペアは何組でしょうか?この質問には、周期グラムを使用して答えることができます。周期グラムは、時系列内の周波数の強さを示します。具体的には、グラフのy軸の値は(a ** 2 + b ** 2) / 2であり、aとbはその周波数でのサインとコサインの係数です(上記のフーリエコンポーネントのプロットと同様)。

トンネルでの例題がわかりやすいです。

from pathlib import Path
from warnings import simplefilter

import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
from sklearn.linear_model import LinearRegression
from statsmodels.tsa.deterministic import CalendarFourier, DeterministicProcess

simplefilter("ignore")

Set Matplotlib defaults

plt.style.use("seaborn-whitegrid")
plt.rc("figure", autolayout=True, figsize=(11, 5))
plt.rc(
"axes",
labelweight="bold",
labelsize="large",
titleweight="bold",
titlesize=16,
titlepad=10,
)
plot_params = dict(
color="0.75",
style=".-",
markeredgecolor="0.25",
markerfacecolor="0.25",
legend=False,
)
%config InlineBackend.figure_format = 'retina'

annotations: https://stackoverflow.com/a/49238256/5769929

def seasonal_plot(X, y, period, freq, ax=None):
if ax is None:
_, ax = plt.subplots()
palette = sns.color_palette("husl", n_colors=X[period].nunique(),)
ax = sns.lineplot(
x=freq,
y=y,
hue=period,
data=X,
ci=False,
ax=ax,
palette=palette,
legend=False,
)
ax.set_title(f"Seasonal Plot ({period}/{freq})")
for line, name in zip(ax.lines, X[period].unique()):
y_ = line.get_ydata()[-1]
ax.annotate(
name,
xy=(1, y_),
xytext=(6, 0),
color=line.get_color(),
xycoords=ax.get_yaxis_transform(),
textcoords="offset points",
size=14,
va="center",
)
return ax

def plot_periodogram(ts, detrend='linear', ax=None):
from scipy.signal import periodogram
fs = pd.Timedelta("365D") / pd.Timedelta("1D")
freqencies, spectrum = periodogram(
ts,
fs=fs,
detrend=detrend,
window="boxcar",
scaling='spectrum',
)
if ax is None:
_, ax = plt.subplots()
ax.step(freqencies, spectrum, color="purple")
ax.set_xscale("log")
ax.set_xticks([1, 2, 4, 6, 12, 26, 52, 104])
ax.set_xticklabels(
[
"Annual (1)",
"Semiannual (2)",
"Quarterly (4)",
"Bimonthly (6)",
"Monthly (12)",
"Biweekly (26)",
"Weekly (52)",
"Semiweekly (104)",
],
rotation=30,
)
ax.ticklabel_format(axis="y", style="sci", scilimits=(0, 0))
ax.set_ylabel("Variance")
ax.set_title("Periodogram")
return ax

data_dir = Path("../input/ts-course-data")
tunnel = pd.read_csv(data_dir / "tunnel.csv", parse_dates=["Day"])
tunnel = tunnel.set_index("Day").to_period("D")

1週間と1年間の季節のプロットを見てみましょう。

X = tunnel.copy()

days within a week

X["day"] = X.index.dayofweek # the x-axis (freq)
X["week"] = X.index.week # the seasonal period (period)

days within a year

X["dayofyear"] = X.index.dayofyear
X["year"] = X.index.year
fig, (ax0, ax1) = plt.subplots(2, 1, figsize=(11, 6))
seasonal_plot(X, y="NumVehicles", period="week", freq="day", ax=ax0)
seasonal_plot(X, y="NumVehicles", period="year", freq="dayofyear", ax=ax1);

周期グラムは、

plot_periodogram(tunnel.NumVehicles);

周期グラムは上記の季節のプロットと一致しています:強い週次の季節と弱い年次の季節があります。週次の季節性はインジケータで、年次の季節性はフーリエ特徴でモデル化します。右から左に、周期グラムは2か月ごと(6)と月ごと(12)の間で減少しているので、10組のフーリエペアを使用しましょう。私たちの季節の特徴は、トレンドの特徴を作成するためにレッスン2で使用したのと同じユーティリティ、DeterministicProcessを使用して作成します。2つの季節期間(週次と年次)を使用するため、それらのうちの1つを「追加の用語」としてインスタンス化する必要があります:

from statsmodels.tsa.deterministic import CalendarFourier, DeterministicProcess

fourier = CalendarFourier(freq="A", order=10) # 10 sin/cos pairs for "A"nnual seasonality

dp = DeterministicProcess(
index=tunnel.index,
constant=True, # dummy feature for bias (y-intercept)
order=1, # trend (order 1 means linear)
seasonal=True, # weekly seasonality (indicators)
additional_terms=[fourier], # annual seasonality (fourier)
drop=True, # drop terms to avoid collinearity
)

X = dp.in_sample() # create features for dates in tunnel.index

特徴セットが作成されたので、モデルを適合させて予測を行う準備が整いました。トレーニングデータを超えてモデルが外挿する方法を確認するために、90日間の予測を追加します。ここでのコードは、前のレッスンのものと同じです。

y = tunnel["NumVehicles"]

model = LinearRegression(fit_intercept=False)
_ = model.fit(X, y)

y_pred = pd.Series(model.predict(X), index=y.index)
X_fore = dp.out_of_sample(steps=90)
y_fore = pd.Series(model.predict(X_fore), index=X_fore.index)

ax = y.plot(color='0.25', style='.', title="Tunnel Traffic - Seasonal Forecast")
ax = y_pred.plot(ax=ax, label="Seasonal")
ax = y_fore.plot(ax=ax, label="Seasonal Forecast", color='C3')
_ = ax.legend()

シリアル依存とは何か?

以前のレッスンでは、時間インデックスから直接派生できる特徴を持つ、時間依存のプロパティとして最も容易にモデル化できる時系列のプロパティを調査しました。しかし、一部の時系列のプロパティは、ターゲットシリーズの過去の値を特徴として使用することで、シリアルに依存するプロパティとしてのみモデル化することができます。これらの時系列の構造は、時間経過でのプロットからは明らかではないかもしれませんが、過去の値に対してプロットすると、構造が明確になります。以下の図で見るように。

シリアル依存性を持つモデルのトレーニング

トレンドや季節性では、上記の図の左側のようなプロットに曲線をフィットさせるモデルを訓練しました。これらのモデルは時間依存性を学んでいました。このレッスンの目標は、右側のようなプロットに曲線をフィットさせるモデルを訓練することです。私たちはそれらにシリアル依存性を学んで欲しいのです。

サイクル

シリアル依存性が現れる特に一般的な方法は、サイクルにあります。サイクルは、時系列の成長と減少のパターンであり、ある時点でのシリーズの値が前の時点の値にどのように依存しているか、しかし必ずしも時間ステップ自体には依存していないかということに関連しています。循環的な行動は、自らを影響を与えることができるシステムや、その反応が時間を超えて持続するシステムの特徴です。経済、伝染病、動物の個体数、火山の噴火、および類似の自然現象は、よく循環的な行動を示しています。

サイクルの振る舞いが季節性と異なる点は、サイクルが季節のように必ずしも時間依存ではないということです。サイクルで起こることは、発生の特定の日付についてよりも、最近過去に何が起こったかについての方が重要です。時間からの(少なくとも相対的な)独立性は、サイクルの振る舞いが季節性よりもはるかに不規則になることを意味します。

ラグ付きの系列とラグプロット

時系列の可能なシリアル依存性(サイクルなど)を調査するためには、その系列の「ラグ付き」コピーを作成する必要があります。時系列をラグするというのは、その値を1回以上の時間ステップ前方にシフトする、あるいは同等に、インデックス内の時間を1回以上のステップ後方にシフトすることを意味します。いずれの場合も、ラグ付きの系列の観測値は、時間の経過とともに発生したように見える効果があります。

これは、米国の月次失業率(y)とその第1および第2のラグ付き系列(それぞれy_lag_1とy_lag_2)を示しています。ラグ付きの系列の値が時間の経過とともにシフトされていることに注意してください。

import pandas as pd

Federal Reserve dataset: https://www.kaggle.com/federalreserve/interest-rates

reserve = pd.read_csv(
"../input/ts-course-data/reserve.csv",
parse_dates={'Date': ['Year', 'Month', 'Day']},
index_col='Date',
)

y = reserve.loc[:, 'Unemployment Rate'].dropna().to_period('M')
df = pd.DataFrame({
'y': y,
'y_lag_1': y.shift(1),
'y_lag_2': y.shift(2),
})

df.head()

時系列をラグすることにより、予測しようとしている値と同時に過去の値が表示されるようになります(言い換えれば、同じ行になります)。これにより、ラグ付きの系列はシリアル依存性をモデル化するための特徴として役立ちます。米国の失業率系列を予測するために、y_lag_1とy_lag_2を特徴として使用して、ターゲットのyを予測することができます。これにより、未来の失業率を前2か月の失業率の関数として予測します。

ラグプロット

時系列のラグプロットは、その値をそのラグに対してプロットしたものを示します。時系列のシリアル依存性は、ラグプロットを見ることでよく明らかになります。米国の失業率のこのラグプロットから、現在の失業率と過去の失業率との間に強く、明らかに線形の関係があることがわかります。

最も一般的に使用されるシリアル依存性の尺度は、自己相関として知られています。これは、時系列がそのラグの1つと持っている相関です。米国の失業率は、ラグ1で0.99、ラグ2で0.98という自己相関を持っています。

ラグの選択

特徴として使用するラグを選択するとき、大きな自己相関を持つすべてのラグを含めるのは一般的に有用ではありません。たとえば、米国の失業率では、ラグ2の自己相関がラグ1の「減衰した」情報から完全に結果として生じるかもしれません。ラグ2が何か新しいものを持っていない場合、既にラグ1を持っている場合にそれを含める理由はありません。

部分自己相関は、すべての前のラグを考慮したラグの相関を示します。言い換えれば、ラグが寄与する「新しい」相関の量です。部分自己相関をプロットすることで、どのラグ特徴を使用するかを選択するのに役立ちます。以下の図では、ラグ1からラグ6が「相関なし」の間隔(青色)の外側にありますので、米国の失業率の特徴としてラグ1からラグ6を選択することができます。(ラグ11はおそらく偽陽性です。)

上記のようなプロットは、コレログラムとして知られています。コレログラムは、ラグ特徴に対して、フーリエ特徴に対するペリオドグラムと基本的に同じものです。

最後に、自己相関と部分自己相関は線形依存性の尺度であることを念頭に置く必要があります。実世界の時系列はしばしば大きな非線形依存性を持っているので、ラグ特徴を選択するときは、ラグプロットを見るか、相互情報のようなもっと一般的な依存性の尺度を使用するのが最善です。太陽黒点系列には、自己相関で見逃してしまう可能性のある非線形依存性を持つラグがあります。

このような非線形の関係は、線形に変換するか、適切なアルゴリズムで学習させることができます。

© 2025, blueqat Inc. All rights reserved