9.20 指数平滑法

oml.esm関数は、指数平滑法(ESM)アルゴリズムを使用して時系列モデルを作成します。

指数平滑法は、半世紀以上にわたって予測に広く使用されています。戦略的、戦術的および運用レベルで応用できます。たとえば、戦略的レベルでは、投資利益率、成長率、イノベーションの効果などを推定するために予測が使用されます。戦術的レベルでは、原価、在庫要件、顧客満足などを推定するために予測が使用されます。運用レベルでは、ターゲットの設定や品質および標準への適合性を予想するために予測が使用されます。

最も単純な形式の指数平滑法は単一パラメータを使用した移動平均法であり、この手法では、将来の値に対する過去のレベルの影響の指数関数的な減少をモデル化します。指数平滑法は、様々な拡張によって、Box-Jenkins自己回帰和分移動平均(ARIMA)法などの、他のよく知られた方法よりも幅広いクラスのモデルを扱います。Oracle Machine Learningは、理論上およびパフォーマンス上の利点を提供する単一の誤差原因(SSOE)の仮定を組み込んだ最先端の状態空間法を使用する指数平滑法を実装します。

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_SIMPLE: 単純指数平滑法モデルが適用されます。

EXSM_SIMPLE_MULT: 積乗型誤差を含む単純指数平滑法モデルが適用されます。

EXSM_HOLT: Holt線形指数平滑法モデルが適用されます。

EXSM_HOLT_DMP: 減衰傾向を持つHolt線形指数平滑法モデルが適用されます。

EXSM_MUL_TRND: 積乗型傾向を持つ指数平滑法モデルが適用されます。

EXSM_MULTRD_DMP: 積乗型減衰傾向を持つ指数平滑法モデルが適用されます。

EXSM_SEAS_ADD: 加法型季節性を持つが傾向を持たない指数平滑化が適用されます。

EXSM_SEAS_MUL: 積乗型季節性を持つが傾向を持たない指数平滑化が適用されます。

EXSM_HW: Holt-Winters三重指数平滑法モデル、加法型傾向、積乗型季節性が適用されます。

EXSM_HW_DMP: 減衰傾向、加法型傾向、積乗型季節性を持つHolt-Winters積乗型指数平滑法モデルが適用されます。

EXSM_HW_ADDSEA: Holt-Winters加法型指数平滑法モデル、加法型傾向、加法型季節性が適用されます。

EXSM_DHW_ADDSEA: 減衰傾向、加法型傾向、加法型季節性を持つHolt-Winters加法型指数平滑法モデルが適用されます。

EXSM_HWMT: 積乗型傾向、積乗型傾向、積乗型季節性を持つHolt-Winters積乗型指数平滑法モデルが適用されます。

EXSM_HWMT_DMP: 減衰積乗型傾向、積乗型傾向、積乗型季節性を持つHolt-Winters積乗型指数平滑法モデルが適用されます。

デフォルト値はEXSM_SIMPLEです。

EXSM_SEASONALITY

正の整数 > 1

この設定により、季節性循環の長さとして正の整数値が指定されます。指定する値は、1より大きい必要があります。たとえば、4の値を設定すると、4つの各監視グループが季節性循環を形成することを意味します。

この設定は、季節性を持つモデルにのみ適用可能であり、指定する必要があります。それ以外の場合、モデルによりエラーがスローされます。

EXSM_INTERVALが設定されていない場合、この設定は元の入力時系列に適用されます。EXSM_INTERVALが設定されている場合、この設定は累積された時系列に適用されます。

EXSM_INTERVAL

{EXSM_INTERVAL_YEAR, EXSM_INTERVAL_QTR, EXSM_INTERVAL_MONTH,EXSM_INTERVAL_WEEK, EXSM_INTERVAL_DAY, EXSM_INTERVAL_HOUR, EXSM_INTERVAL_MIN,EXSM_INTERVAL_SEC}セット内の値を取ることができます

この設定は、時間列(case_id列)が日時タイプである場合にのみ適用され、指定する必要があります。この設定により、累積された等間隔の時系列の間隔が指定されます。

入力表の時間列が日時型の場合、EXSM_INTERVAL設定が指定されていないと、モデルからエラーがスローされます。

入力表の時間列がOracle数値型の場合、EXSM_INTERVAL設定が指定されていると、モデルからエラーがスローされます。

EXSM_ACCUMULATE

{EXSM_ACCU_TOTAL, EXSM_ACCU_STD, EXSM_ACCU_MAX, EXSM_ACCU_MIN, EXSM_ACCU_AVG, EXSM_ACCU_MEDIAN, EXSM_ACCU_COUNT}セット内の値を取ることができます

この設定は、時間列が日時タイプである場合にのみ適用され、指定する必要があります。この設定により、入力時系列から累積された時系列の値を生成する方法が指定されます。

EXSM_SETMISSING

{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}セット内の値を取るオプションを指定することもできます。

この設定では、欠損値の処理方法を指定します。欠損値は、入力データや時系列の累積処理で発生することがあります。数値またはオプションのどちらかを指定できます。数値が指定された場合は、すべての欠損値がその数値に設定されます。

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: EXSMモデルは入力データを不規則な(等間隔でない)時系列として処理します。

この設定が指定されていない場合、EXSM_MISS_AUTOがデフォルト値です。その場合、モデルでは入力時系列が不規則な時系列として処理され、欠損値がギャップとして表示されます。

EXSM_PREDICTION_STEP

1-30の数値に設定する必要があります。

この設定では、何ステップ先の予測を行うかを指定します。

設定されていない場合、デフォルト値は1です。この場合、モデルでは1ステップ先の予測が提供されます。30より大きい値を指定すると、エラーになります。

EXSM_CONFIDENCE_LEVEL

0と1の間の数値(0と1を含まない)に設定する必要があります。

この設定では、予測に対して目的とする信頼水準を指定します。

指定した信頼区間の上限と下限が報告されます。この設定が指定されていない場合、デフォルトの信頼水準は95%です。

EXSM_OPT_CRITERION

集合{EXSM_OPT_CRIT_LIK, EXSM_OPT_CRIT_MSE, EXSM_OPT_CRIT_AMSE, EXSM_OPT_CRIT_SIG, EXSM_OPT_CRIT_MAE}に含まれる値を設定します。

この設定では、目的とする最適化基準を指定します。最適化基準は、同じデータへのモデルの適合性を比較するための診断として役立ちます。

EXSM_OPT_CRIT_LIK: モデルの対数尤度の2倍を減算。

EXSM_OPT_CRIT_MSE: モデルの平均平方誤差。

EXSM_OPT_CRIT_AMSE: ユーザー指定の時間ウィンドウの平均平方誤差。

EXSM_OPT_CRIT_SIG: モデルの残差の標準偏差。

EXSM_OPT_CRIT_MAE: モデルの平均絶対誤差。

デフォルト値は、EXSM_OPT_CRIT_LIKです。

EXSM_NMSE

正の整数

この設定により、誤差メトリックの平均二乗誤差の平均(AMSE)を計算するときに使用されるウィンドウの長さが指定されます。

例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