SPSS 預測分析預測,使用 Notebook 中時間序列資料的資料準備

時間序列資料的資料準備 (TSDP) 所提供的功能,可將原始時間資料(採用壓縮多維格式,其中包括交易(事件)型及直欄型資料),轉換為後續時間序列分析方法所需的一般時間序列資料(採用壓縮橫列型格式)。

TSDP 的主要工作是根據維度欄位中每個唯一值與度量欄位的組合來產生時間序列。 此外,它還會根據時間戳記對資料進行排序、擷取時間變數的 meta 資料、使用另一個時間精度(間隔)透過套用聚集或分佈函數來轉換時間序列、檢查資料品質,並在需要時處理遺漏值。

Python 程式碼範例:

from spss.ml.forecasting.timeseriesdatapreparation import TimeSeriesDataPreparation

tsdp = TimeSeriesDataPreparation(). \
    setMetricFieldList(["Demand"]). \
    setDateTimeField("Date"). \
    setEncodeSeriesID(True). \
    setInputTimeInterval("MONTH"). \
    setOutTimeInterval("MONTH"). \
    setQualityScoreThreshold(0.0). \
    setConstSeriesThreshold(0.0)

tsdpOut = tsdp.transform(data)

TimeSeriesDataPreparationConvertor

這是日期/時間轉換器 API ,用來提供 TSDP 內日期/時間轉換器的部分功能,以供應用程式使用。 此元件共有兩個使用案例:

  • 計算指定的開始與結束時間之間的時間點。 在此情況下,開始與結束時間皆發生在前一個 TSDP 輸出中的第一個觀察值之後。
  • 計算開始索引與結束索引之間參照前一個 TSDP 輸出中最後一個觀察值的時間點。

時間因果建模

時間因果建模 (TCM) 是指使用 Granger 因果關係與迴歸演算法的組合進行變數選取,以嘗試探索時間序列資料中主要時間關係的一套方法。

Python 程式碼範例:

from spss.ml.forecasting.timeseriesdatapreparation import TimeSeriesDataPreparation
from spss.ml.common.wrapper import LocalContainerManager
from spss.ml.forecasting.temporalcausal import TemporalCausal
from spss.ml.forecasting.params.predictor import MaxLag, MaxNumberOfPredictor, Predictor
from spss.ml.forecasting.params.temporal import FieldNameList, FieldSettings, Forecast, Fit
from spss.ml.forecasting.reversetimeseriesdatapreparation import ReverseTimeSeriesDataPreparation

tsdp = TimeSeriesDataPreparation().setDimFieldList(["Demension1", "Demension2"]). \
    setMetricFieldList(["m1", "m2", "m3", "m4"]). \
    setDateTimeField("date"). \
    setEncodeSeriesID(True). \
    setInputTimeInterval("MONTH"). \
    setOutTimeInterval("MONTH")
tsdpOutput = tsdp.transform(changedDF)

lcm = LocalContainerManager()
lcm.exportContainers("TSDP", tsdp.containers)

estimator = TemporalCausal(lcm). \
    setInputContainerKeys(["TSDP"]). \
    setTargetPredictorList([Predictor(
    targetList=[["", "", ""]],
    predictorCandidateList=[["", "", ""]])]). \
    setMaxNumPredictor(MaxNumberOfPredictor(False, 4)). \
    setMaxLag(MaxLag("SETTING", 5)). \
    setTolerance(1e-6)

tcmModel = estimator.fit(tsdpOutput)
transformer = tcmModel.setDataEncoded(True). \
    setCILevel(0.95). \
    setOutTargetValues(False). \
    setTargets(FieldSettings(fieldNameList=FieldNameList(seriesIDList=[["da1", "db1", "m1"]]))). \
    setReestimate(False). \
    setForecast(Forecast(outForecast=True, forecastSpan=5, outCI=True)). \
    setFit(Fit(outFit=True, outCI=True, outResidual=True))

predictions = transformer.transform(tsdpOutput)
rtsdp = ReverseTimeSeriesDataPreparation(lcm). \
    setInputContainerKeys(["TSDP"]). \
    setDeriveFutureIndicatorField(True)

rtsdpOutput = rtsdp.transform(predictions)
rtsdpOutput.show()

時間因果自迴歸模型

自動迴歸 (AR) 模型是建置來計算非目標數列預測值數列的樣本外預測。 這些預測值預測隨後可用於計算目標系列的樣本外預測。

由 TemporalCausal 產生的模型

TemporalCausal 會匯出下列輸出:

  • 包含 TemporalCausal 模型資訊的 JSON 檔
  • 包含多系列模型的 XML 檔

Python 程式碼範例:

from spss.ml.common.wrapper import LocalContainerManager
from spss.ml.forecasting.temporalcausal import TemporalCausal, TemporalCausalAutoRegressiveModel
from spss.ml.forecasting.params.predictor import MaxLag, MaxNumberOfPredictor, Predictor
from spss.ml.forecasting.params.temporal import FieldNameList, FieldSettingsAr, ForecastAr

lcm = LocalContainerManager()
arEstimator = TemporalCausal(lcm). \
    setInputContainerKeys([tsdp.uid]). \
    setTargetPredictorList([Predictor(
        targetList = [["da1", "db1", "m2"]],
        predictorCandidateList = [["da1", "db1", "m1"],
                                  ["da1", "db2", "m1"],
                                  ["da1", "db2", "m2"],
                                  ["da1", "db3", "m1"],
                                  ["da1", "db3", "m2"],
                                  ["da1", "db3", "m3"]])]). \
    setMaxNumPredictor(MaxNumberOfPredictor(False, 5)). \
    setMaxLag(MaxLag("SETTING", 5))

arEstimator.fit(df)

tcmAr = TemporalCausalAutoRegressiveModel(lcm).\
    setInputContainerKeys([arEstimator.uid]).\
    setDataEncoded(True).\
    setOutTargetValues(True). \
    setTargets(FieldSettingsAr(FieldNameList(
        seriesIDList=[["da1", "db1", "m1"],
                      ["da1", "db2", "m2"],
                      ["da1", "db3", "m3"]]))).\
    setForecast(ForecastAr(forecastSpan = 5))

scored = tcmAr.transform(df)
scored.show()

時間因果異常值偵測

建置 TCM 模型的其中一個優點是能夠偵測基於模型的異常值。 異常值偵測是指根據 TCM 模型,識別目標系列中值偏離其預期(擬合)值過多的時間點之功能。

時間因果主要原因分析

主要原因分析是指探索 Granger 因果圖,以分析導致有問題異常值的關鍵/主要值之功能。

時間因果情境分析

實務範例分析是指 TCM 模型的功能,以人為方式設定時間序列值的影響。 情境是一組預測,透過用替代值的向量替換主要時間序列的值來執行。

時間因果摘要

TCM 摘要會根據一個模型品質測量來選取前 N 個模型。 共有五個模型品質測量:「均方根誤差 (RMSE)」、「均方根百分比誤差 (RMSPE)」、「貝氏資訊準則 (BIC)」、「赤池資訊準則 (AIC)」及「R 平方 (RSQUARE)」。 使用者可以設定 N 及模型品質測量。

時間序列探索

「時間序列探索」會根據部分統計資料及測試來探索時間序列資料的性質,以在建模之前產生有關時間序列的初步洞察。 它不但涵蓋適用於專家級使用者的分析方法(包括時間序列叢集、單根檢定及相關性),而且還為商業使用者提供以簡式時間序列分解方法為基礎的自動探索程序。

Python 程式碼範例:

from spss.ml.forecasting.timeseriesexploration import TimeSeriesExploration

tse = TimeSeriesExploration(). \
    setAutoExploration(True). \
    setClustering(True)

tseModel = tse.fit(data)
predictions = tseModel.transform(data)
predictions.show()

時間序列資料的反向資料準備

「反向資料準備時間序列資料 (RTSDP)」提供的功能可將 TimeSeriesDataPreperation (TSDP) 或 TemporalCausal模型 (TCM 評分) 產生的精簡列型 (CRB) 格式轉換回平面化多維度 (FMD) 格式。

Python 程式碼範例:

from spss.ml.common.wrapper import LocalContainerManager
from spss.ml.forecasting.params.temporal import GroupType
from spss.ml.forecasting.reversetimeseriesdatapreparation import ReverseTimeSeriesDataPreparation
from spss.ml.forecasting.timeseriesdatapreparation import TimeSeriesDataPreparation

manager = LocalContainerManager()
tsdp = TimeSeriesDataPreparation(manager). \
    setDimFieldList(["Dimension1", "Dimension2", "Dimension3"]). \
    setMetricFieldList(
    ["Metric1", "Metric2", "Metric3", "Metric4", "Metric5", "Metric6", "Metric7", "Metric8", "Metric9", "Metric10"]). \
    setDateTimeField("TimeStamp"). \
    setEncodeSeriesID(False). \
    setInputTimeInterval("WEEK"). \
    setOutTimeInterval("WEEK"). \
    setMissingImputeType("LINEAR_INTERP"). \
    setQualityScoreThreshold(0.0). \
    setConstSeriesThreshold(0.0). \
    setGroupType(
    GroupType([("Metric1", "MEAN"), ("Metric2", "SUM"), ("Metric3", "MODE"), ("Metric4", "MIN"), ("Metric5", "MAX")]))

tsdpOut = tsdp.transform(changedDF)
rtsdp = ReverseTimeSeriesDataPreparation(manager). \
    setInputContainerKeys([tsdp.uid]). \
    setDeriveFutureIndicatorField(True)

rtdspOut = rtsdp.transform(tsdpOut)
import com.ibm.spss.ml.forecasting.traditional.TimeSeriesForecastingModelReEstimate

val tsdp = TimeSeriesDataPreparation().
   setDimFieldList(Array("da", "db")).
   setMetricFieldList(Array("metric")).
   setDateTimeField("date").
   setEncodeSeriesID(false).
   setInputTimeInterval("MONTH").
   setOutTimeInterval("MONTH")

val lcm = LocalContainerManager()
lcm.exportContainers("k", tsdp.containers)

val reestimate = TimeSeriesForecastingModelReEstimate(lcm).
  setForecast(ForecastEs(outForecast = true, forecastSpan = 4, outCI = true)).
  setFitSettings(Fit(outFit = true, outCI = true, outResidual = true)).
  setOutInputData(true).
  setInputContainerKeys(Seq("k"))

val rtsdp = ReverseTimeSeriesDataPreparation(tsdp.manager).
  setInputContainerKeys(List(tsdp.uid)).
  setDeriveFutureIndicatorField(true)

val pipeline = new Pipeline().setStages(Array(tsdp, reestimate, rtsdp))
val scored = pipeline.fit(data).transform(data)
scored.show()

上層主題: SPSS 預測分析演算法