ODM和OLAP实现时序预测(二)

 
Part 2 时序预测之单步预测
在这部分中,涵盖了如何使用part1中所述的数据挖掘方法做单步或开循环预测。通过例子来讲解每一步,最后与传统时序预测方法做一个比较。
单步预测不能使用预测值作为预测的输入值,只能做下一时间间隔的预测,因此叫做单步。单步预测可以直接使用Oracle Data Miner的应用和测试挖掘活动或是SQL PREDICTION函数。
方法
正如在part1中讨论的,当建模时序时,要做如下的决策:
1.       差异稳定和趋势移动Variance stabilization and trend removal
2.       目标常态化Target normalization
3.       迟滞属性选择Lagged attribute selection
在完成这些步骤之后,可能创建出预测模型来用于预测序列的未来数据。为了说明这个过程,让我们看一个例子,非固定季节性时序。数据在书中提供: Time Series Analysis: Forecasting and Control 由Box和Jenkins编著(1976)。数据反映了从1949年1月到1960年12月每月国际航班乘客数(以千为单位)。见下图:

'>1

准备序列
在建模时间序列之前,我们需要稳定(stabilize)序列。从差异variance和意指Mean中移除趋势。如果意指有趋势,序列的平均值在一段时间内或者增加或者降低,如果差异有趋势,则差异在一段时间内会稳定上升或下降。
首先,我们稳定差异,这能通过应用Box-Cox power transform来实现。这种转换形式如下:如果h<>0时,y(h)=(y^h-1)/h,如果h=0,y(h) = log(h)。一般来说,LOG转换(当h=0时)对于消除增加差异是一种好选择。图2显示了经过log()转换后的序列。

   EXECUTE IMMEDIATE v_stmt;

   FOR i IN 1..p_max_lag LOOP
      v_stmt:=
        'SELECT CORR(' || p_base_col || ', lag_val) ' ||
        'FROM (SELECT ' || p_base_col || ',' ||
                      'LAG(' || p_lag_col || ',' || i || ') ' ||
                      'OVER(ORDER BY ' || p_seq_col || ') lag_val ' ||
              'FROM ' || p_in_table || ')';
      EXECUTE IMMEDIATE v_stmt INTO v_corr;
      v_stmt:='INSERT INTO ' || p_out_table ||
             ' (lag_num, correlation) VALUES(:v1, :v2)';
      EXECUTE IMMEDIATE v_stmt using i, v_corr;
   END LOOP;       
END;
/
SHOW ERRORS;

建模
准备完序列,选择lagged变量后,我们准备创建预测未来值得模型。起始点是在上面的airline_norm视图中准备序列计算。Month列是顺序的范围从1到144随时间增长。第一行是空作为我们原始序列的差异。
首先,我们创建带12个lagged变量的视图:
CREATE VIEW airline_lag AS 
SELECT a.*
FROM (SELECT month, passengers, tp,
             LAG(tp, 1) OVER (ORDER BY month) L1,
             LAG(tp, 2) OVER (ORDER BY month) L2,
             LAG(tp, 3) OVER (ORDER BY month) L3,
             LAG(tp, 4) OVER (ORDER BY month) L4,
             LAG(tp, 5) OVER (ORDER BY month) L5,
             LAG(tp, 6) OVER (ORDER BY month) L6,
             LAG(tp, 7) OVER (ORDER BY month) L7,
             LAG(tp, 8) OVER (ORDER BY month) L8,
             LAG(tp, 9) OVER (ORDER BY month) L9,
             LAG(tp, 10) OVER (ORDER BY month) L10,
             LAG(tp, 11) OVER (ORDER BY month) L11,
             LAG(tp, 12) OVER (ORDER BY month) L12
      FROM airline_norm) a;
我们也可以使用ODMR的计算列向导创建这个视图。
接下来,我们将airline_lag视图中的子集作为训练集。因为我们想测试一下模型的预测能力,我们可以在旧的数据抽样基础上做训练,对于测试,使用序列中最近的抽样。抽样132-144作为测试集,我们也需要过滤最开始的13行,因为他们中有lag变量是null。下面的视图创建了训练集:
CREATE VIEW airline_train AS
SELECT month, tp, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12
FROM    airline_lag a
WHERE month > 13 AND month < 132;
最后,我们构建模型,可以使用ODMR或数据挖掘api。对于这个例子,我们使用PL/SQL API并且默认设置SVM回归算法。注意,这里的dbms_data_mining包只有在10g中才有。
BEGIN 
DBMS_DATA_MINING.CREATE_MODEL(     model_name          => 'airline_SVM',    mining_function     => dbms_data_mining.regression,    data_table_name     => 'airline_train',    case_id_column_name => 'month',    target_column_name => 'tp');
END;
这个语句创建了SVM回归模型,模型名为airline_SVM,使用视图airline_train作为训练数据。
预测
要创建预测,我们仅需要应用模型到新数据上,例如,应用模型到airline_lag视图上生成包含训练数据(1-131)的单步预测。下面的查询完成此工作:
SELECT month, passengers,
            PREDICTION(airline_svm USING a.*) pred
      FROM airline_lag a;
然而,因为模型预测反应转换后的数据,我们不能直接将原始值和预测值做比较,要比较的话,需要反向转换,将结果倒推回原始数据度量。下面的步骤必须按照顺序执行:
1.       常态化(Normalization):乘标准方差(0.046276747)并且增加mean(0.00409976)
2.       差分化(Differencing):将序列中早先的值加到早先步骤的结果上。
3.       对数(Log):log(10)早先步骤结果。
下面的查询转换预测结果,并且创建一个表保存预测值和原始值。
CREATE TABLE airline_pred AS
SELECT month, passengers, power(10, pred) pred
FROM (SELECT month, passengers,
             pred + LAG(lp,1) OVER (ORDER BY month) pred
      FROM (SELECT month, passengers, LOG(10, passengers) lp,
                   (PREDICTION(airline_SVM USING a.*)
                    * 0.046271162 + 0.003919158) pred
            FROM airline_lag a));
最内层的查询恢复常态化和原始序列的对数计算。带LAG函数的子查询恢复移动趋势的差分步骤,最外层查询恢复用于稳定差异的LOG转换。
与其他技术比较
下表提供了 Root Mean Squared Error (RMSE) 和 Mean Absolute Error (MAE) 在训练和预测数据集上的对比,模型为数据挖掘方法(SVM)和linear autoregressive model (AR).
Model
RMSE Training
MAE Training
RMSE Test
MAE Test
SVM
3.7
3.2
18.9
13.4

AR
10.1
7.7
19.3
15.9
 
数据挖掘方法执行的更好,在训练和测试时,具有更小的 RMSE MAE
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值