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()转换后的序列。
'(lag_num NUMBER, correlation NUMBER)';
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 |
我们也可以使用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 WHEREmonth > 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
。