9.21 指数平滑法
oml.esm
関数は、指数平滑法(ESM)アルゴリズムを使用して時系列モデルを作成します。
指数平滑法は、半世紀以上にわたって予測に広く使用されています。戦略的、戦術的および運用レベルで応用できます。たとえば、戦略的レベルでは、投資利益率、つまり革新による成長率や効果を見積るために予測が使用されます。戦術的レベルでは、コスト、在庫要件、顧客満足を見積るために予測が使用されます。運営レベルでは、ターゲットを設定し、品質や基準への準拠を予想するために予測が使用されます。
最も単純な形式の指数平滑法は単一パラメータを使用した移動平均法であり、この手法では、将来の値に対する過去のレベルの影響の指数関数的な減少をモデル化します。指数平滑法は、様々な拡張によって、Box-Jenkins自己回帰和分移動平均(ARIMA)法などの、他のよく知られた方法よりも幅広いクラスのモデルを扱います。Oracle Machine Learningは、理論上およびパフォーマンス上の利点を提供する単一の誤差原因(SSOE)の仮定を組み込んだ最先端の状態空間法を使用する指数平滑法を実装します。
複数の時系列を操作できると、時系列回帰への入力を作成するのに便利です。複数の時系列で、時系列回帰への入力として使用する、共通の時間間隔が設定された複数の時系列モデルを作成します。時系列モデルの1つが、対象であるターゲット時系列として識別されます。複数時系列モデルの詳細は、Oracle Machine Learning for SQLコンセプト・ガイドを参照してください。
指数平滑化の動作は、許容可能な時系列モデルを自動的に検索するように変更されています。モデル・タイプ(EXSM_MODEL)
を指定しなかった場合、アルゴリズムはデフォルトでモデル・タイプを自動的に決定します。詳細は、Oracle Machine Learning for SQLコンセプト・ガイドを参照してください。
ESMモデルの設定
次の表に、ESMモデルの設定を示します。
表9-18 ESMモデルの設定
設定名 | 設定値 | 説明 |
---|---|---|
EXSM_MODEL |
{EXSM_SIMPLE, EXSM_SIMPLE_MULT, EXSM_HOLT, EXSM_HOLT_DMP, EXSM_MUL_TRND, EXSM_MULTRD_DMP, EXSM_SEAS_ADD, EXSM_SEAS_MUL, EXSM_HW, EXSM_HW_DMP, EXSM_HW_ADDSEA, EXSM_DHW_ADDSEA, EXSM_HWMT, EXSM_HWMT_DMP}セット内の値を取ることができます |
この設定により、モデルが指定されます。
デフォルト値は |
|
|
この設定では、季節的な周期の長さとして正の整数値を指定します。指定する値は、 この設定は、季節性を持つモデルにのみ適用可能であり、指定する必要があります。それ以外の場合、モデルによりエラーがスローされます。
|
|
{EXSM_INTERVAL_YEAR, EXSM_INTERVAL_QTR, EXSM_INTERVAL_MONTH,EXSM_INTERVAL_WEEK, EXSM_INTERVAL_DAY, EXSM_INTERVAL_HOUR, EXSM_INTERVAL_MIN,EXSM_INTERVAL_SEC}セット内の値を取ることができます |
この設定は、時間列( 入力表の時間列が日時型の場合、 入力表の時間列がOracle数値型の場合、 |
|
{EXSM_ACCU_TOTAL, EXSM_ACCU_STD, EXSM_ACCU_MAX, EXSM_ACCU_MIN, EXSM_ACCU_AVG, EXSM_ACCU_MEDIAN, EXSM_ACCU_COUNT}セット内の値を取ることができます |
この設定は、時間列が日時タイプである場合にのみ適用され、指定する必要があります。この設定により、入力時系列から累積された時系列の値を生成する方法が指定されます。 |
|
{EXSM_MISS_MIN, EXSM_MISS_MAX, EXSM_MISS_AVG, EXSM_MISS_MEDIAN, EXSM_MISS_LAST, EXSM_MISS_FIRST, EXSM_MISS_PREV, EXSM_MISS_NEXT, EXSM_MISS_AUTO}セット内の値を取るオプションを指定することもできます。 |
この設定では、欠損値の処理方法を指定します。欠損値は、入力データや時系列の累積処理で発生することがあります。数値またはオプションのどちらかを指定できます。数値が指定された場合は、すべての欠損値がその数値に設定されます。
この設定が指定されていない場合、 |
|
1から30の間の数に設定する必要があります。 |
この設定では、何ステップ先の予測を行うかを指定します。 設定されていない場合、デフォルト値は |
|
0から1の間(両端を含まない)の数値にする必要があります。 |
この設定では、予測に対して目的とする信頼水準を指定します。 指定した信頼区間の上限と下限が報告されます。この設定が指定されていない場合、デフォルトの信頼水準は |
EXSM_OPT_CRITERION |
集合{EXSM_OPT_CRIT_LIK, EXSM_OPT_CRIT_MSE, EXSM_OPT_CRIT_AMSE, EXSM_OPT_CRIT_SIG, EXSM_OPT_CRIT_MAE}に含まれる値を設定します。 |
この設定では、目的とする最適化基準を指定します。最適化基準は、同じデータへのモデルの適合性を比較するための診断として役立ちます。
デフォルト値は、 |
|
正の整数 |
この設定により、誤差メトリックの平均二乗誤差の平均(AMSE)を計算するときに使用されるウィンドウの長さが指定されます。 |
ノート: Oracle Database 23aiでのみ使用できます。 |
時系列列のカンマ区切りリスト |
この設定を使用すると、ターゲット系列に加えて最大20個の予測子系列を予測できます。
接頭辞 |
ノート: Oracle Database 23aiでのみ使用できます。 |
|
設定EXSM_INITVL_OPTIMIZE によって、モデルの作成中に初期値が最適化されるかどうかが決まります。デフォルト値はEXSM_INITVL_OPTIMIZE_ENABLE です。
ノート: EXSM_INITVL_OPTIMIZE をEXSM_INITVL_OPTIMIZE_DISABLE に設定できるのは、ユーザーがEXSM_MODEL をEXSM_HW またはEXSM_HW_ADDSEA に設定した場合のみです。EXSM_MODEL が別のモデル・タイプに設定されているか、指定されていない場合、エラー40213 (競合する設定)がスローされ、モデルは作成されません。
|
例9-20 oml.esmクラスの使用
この例では、ESMモデルを作成し、oml.esm
クラスのメソッドの一部を使用します。
import oml
import pandas as pd
df = pd.DataFrame({'EVENT': ['A', 'B', 'C', 'D'],
'START': ['2021-10-04 13:29:00', '2021-10-07 12:30:00',
'2021-10-15 04:20:00', '2021-10-18 15:45:03'],
'END': ['2021-10-08 11:29:06', '2021-10-15 10:30:07',
'2021-10-29 05:50:15', '2021-10-22 15:40:03']})
df['START'] = pd.to_datetime(df['START'])
df['END'] = pd.to_datetime(df['END'])
df['DURATION'] = df['END'] - df['START']
df['HOURS'] = df['DURATION'] / pd.Timedelta(hours=1)
df['MINUTES'] = df['DURATION'] / pd.Timedelta(minutes=1)
#For on-premises database follow the below command to connect to the database#
oml.connect("<username>","<password>", dsn="<dsn>")
dat = oml.create(df, table='DF')
train_x = dat[:, 1]
train_y = dat[:, 4]
setting = {'EXSM_INTERVAL':'EXSM_INTERVAL_DAY'}
esm_mod = oml.esm(**setting).fit(train_x, train_y, time_seq = 'START')
esm_mod
train_x = dat[:, 4]
train_y = dat[:, 5]
esm_mod = oml.esm().fit(train_x, train_y, time_seq = 'HOURS')
esm_mod
この例のリスト
Create pandas DataFrame with start and end dates for an event. Convert start and end date columns to datetime, and create new columns that contain timedelta between the start and end dates. Convert timedelta into total number of hours and convert timedelta into total number of minutes.
>>> import oml
>>> import pandas as pd
>>> df = pd.DataFrame({'EVENT': ['A', 'B', 'C', 'D'],
'START': ['2021-10-04 13:29:00', '2021-10-07 12:30:00',
'2021-10-15 04:20:00', '2021-10-18 15:45:03'],
'END': ['2021-10-08 11:29:06', '2021-10-15 10:30:07',
'2021-10-29 05:50:15', '2021-10-22 15:40:03']})
>>> df['START'] = pd.to_datetime(df['START'])
>>> df['END'] = pd.to_datetime(df['END'])
>>> df['DURATION'] = df['END'] - df['START']
>>> df['HOURS'] = df['DURATION'] / pd.Timedelta(hours=1)
>>> df['MINUTES'] = df['DURATION'] / pd.Timedelta(minutes=1)
>>> #For on-premises database follow the below command to connect to the database#
>>> oml.connect("<username>","<password>", dsn="<dsn>")
>>> dat = oml.create(df, table='DF')
Using Datetime type
>>> train_x = dat[:, 1]
>>> train_y = dat[:, 4]
>>> setting = {'EXSM_INTERVAL':'EXSM_INTERVAL_DAY'}
>>> esm_mod = oml.esm(**setting).fit(train_x, train_y, time_seq = 'START')
>>> esm_mod
Algorithm Name: Exponential Smoothing
Mining Function: TIME_SERIES
Target: HOURS
Settings:
setting name setting value
0 ALGO_NAME ALGO_EXPONENTIAL_SMOOTHING
1 EXSM_ACCUMULATE EXSM_ACCU_TOTAL
2 EXSM_CONFIDENCE_LEVEL .95
3 EXSM_INTERVAL EXSM_INTERVAL_DAY
4 EXSM_NMSE 3
5 EXSM_OPTIMIZATION_CRIT EXSM_OPT_CRIT_LIK
6 EXSM_PREDICTION_STEP 1
7 EXSM_SETMISSING EXSM_MISS_AUTO
8 ODMS_BOXCOX ODMS_BOXCOX_ENABLE
9 ODMS_DETAILS ODMS_ENABLE
10 ODMS_MISSING_VALUE_TREATMENT ODMS_MISSING_VALUE_AUTO
11 ODMS_SAMPLING ODMS_SAMPLING_DISABLE
12 PREP_AUTO ON
Computed Settings:
setting name setting value
0 EXSM_MODEL EXSM_SIMPLE
Global Statistics:
attribute name attribute value
0 -2 LOG-LIKELIHOOD -21.1618
1 AIC 48.3236
2 AICC None
3 ALPHA 0.000100034
4 ALPHA DISC 0.9999
5 AMSE 12175.3
6 BIC 46.4825
7 CONVERGED YES
8 INITIAL ALPHA 0.000100034
9 INITIAL LEVEL 179.353
10 MAE 84.403
11 MSE 9843.9
12 NUM_ROWS 4
13 SIGMA 140.313
14 STD 140.313
Attributes:
Partition: NO
Prediction:
TIME_SEQ VALUE PREDICTION LOWER UPPER
0 2021-10-04 94.001667 179.352705 NaN NaN
1 2021-10-07 190.001944 179.344167 NaN NaN
2 2021-10-15 337.504167 179.345233 NaN NaN
3 2021-10-18 95.916667 179.361069 NaN NaN
4 2021-10-19 NaN 179.352712 -95.656158 454.361582
Using Float type
>>> train_x = dat[:, 4]
>>> train_y = dat[:, 5]
>>> esm_mod = oml.esm().fit(train_x, train_y, time_seq = 'HOURS')
>>> esm_mod
Algorithm Name: Exponential Smoothing
Mining Function: TIME_SERIES
Target: MINUTES
Settings:
setting name setting value
0 ALGO_NAME ALGO_EXPONENTIAL_SMOOTHING
1 EXSM_CONFIDENCE_LEVEL .95
2 EXSM_NMSE 3
3 EXSM_OPTIMIZATION_CRIT EXSM_OPT_CRIT_LIK
4 EXSM_PREDICTION_STEP 1
5 EXSM_SETMISSING EXSM_MISS_AUTO
6 ODMS_BOXCOX ODMS_BOXCOX_ENABLE
7 ODMS_DETAILS ODMS_ENABLE
8 ODMS_MISSING_VALUE_TREATMENT ODMS_MISSING_VALUE_AUTO
9 ODMS_SAMPLING ODMS_SAMPLING_DISABLE
10 PREP_AUTO ON
Computed Settings:
setting name setting value
0 EXSM_MODEL EXSM_HOLT
Global Statistics:
attribute name attribute value
0 -2 LOG-LIKELIHOOD 4.47424
1 AIC 1.05153
2 AICC None
3 ALPHA 0.000104161
4 AMSE 0.0190133
5 BETA 0.000104153
6 BIC -2.017
7 CONVERGED YES
8 INITIAL LEVEL 8.00977
9 INITIAL TREND 0.452033
10 LAMBDA 4.08563e-05
11 MAE 1175.53
12 MSE 0.0266914
13 NUM_ROWS 4
14 SIGMA 0.188649
15 STD 0.188649
Attributes:
Partition: NO
Prediction:
TIME_SEQ VALUE PREDICTION LOWER UPPER
0 94 5640.100000 4807.666451 NaN NaN
1 95 5755.000000 7554.329741 NaN NaN
2 190 11400.116667 11869.239245 NaN NaN
3 337 20250.250000 18649.004898 NaN NaN
4 338 NaN 29301.840039 19894.31833 41663.104953