00 系列文章目录
0.1 算法原理目录
SLS 机器学习介绍(01): 时序统计建模
SLS 机器学习介绍(02): 时序聚类建模
SLS 机器学习介绍(03): 时序异常检测建模
SLS 机器学习介绍(04): 规则模式挖掘
SLS 机器学习介绍(05): 时间序列预测
0.2 算法最佳实践
SLS 机器学习最佳实战: 时序异常检测和报警
SLS 机器学习最佳实战: 时序预测
一, 问题背景
场景一: 计量预测
我们在使用阿里云的产品, 能不能提供一下我们服务未来一周或者未来一天的相关计量指标的预测, 方便计算服务外来的花费等问题?
场景二: 服务容量预测
能否根据历史数据, 预测一下, 网站请求量的情况? 存储容量的预测? OSS 使用情况的预测?
能否根据在 ECS 中的机器的使用情况, 能否更好的辅助运维同学做各种资源的调度, 让用户的服务更加弹性, 提高服务的可用性?
能否预测稳定业务的机柜和机架的电量消耗, 帮助数据中心降低资源消耗, 节约成本?
场景三: 业务预测告警
根据服务的历史访问情况, 进行未来一天的访问请求预测, 当实际值与预测值偏差较大时, 立马告知相关的运营同学, 分析用户留存等问题, 帮助产品持续迭代?
二, 我们提供了什么?
2.1 统计学模型
1. 使用默认的 arma(p=3, q=1)模型进行预测
ts_predicate_simple(unixtime, val, nPred, samplePeriod, sampleMethod)
2. 使用 ar(p)模型进行预测
ts_predicate_ar(unixtime, val, p, nPred, samplePeriod, sampleMethod)
3. 使用 arma(p, q)模型进行预测
ts_predicate_arma(unixtime, val, p, q, nPred, samplePeriod, sampleMethod)
4. 使用 arima(p, d, q)模型进行预测
ts_predicate_arima(unixtime, val, p, d, q, nPred, samplePeriod, sampleMethod)
2.2 机器学习模型
1. 不对数据做任何处理, 直接使用 GBRT 模型进行预测
ts_regression_predict(unixtime, val, nPred, 'origin', samplePeriod, sampleMethod)
2. 对数据做时序分解, 对分解出来的序列分别做预测, 在进行整合
ts_regression_predict(unixtime, val, nPred, 'forest', samplePeriod, sampleMethod)
3. 不对数据做任何处理, 使用线性模型进行预测
ts_regression_predict(unixtime, val, nPred, 'linear', samplePeriod, sampleMethod)
4. 使用 auto 参数, 算法尽可能根据时序自身的特征, 进行学习预测
ts_regression_predict(unixtime, val, nPred, 'auto', samplePeriod, sampleMethod)
传送门在这里: 机器学习简介
三, 内部的算法逻辑
3.0 数据的基本预处理
数据先进行归一化, 去均值操作, 这个很重要, 需要将信号中的直流分量去除让算法分析时效果更加稳定.
按照一定的策略将数据进行补齐, 具体的操作详见文档: Signal extension modes. 这里展示出补点结果的示意图, 其中红色的曲线点是原始的时序序列, 其中黑色的点是按照不通方式补充的点示意图. 本平台内置的算法使用的补点策略是 Periodic 模式.
3.1 小波分解算法
3.1.1 形象的认识下小波
针对小波变换, 聊深了就会涉及到大量的问题定义, 性质分析, 定理证明等. 仅仅想明白下为什么用小波而不选择大家熟悉的傅立叶变换, 就要写上几篇文章, 且需要在不通的问题中去对比分析. 作者非数学系出身, 非信号出身, 对于冗长的证明就是看看就好, 重在了解小波的特点而解决相应的问题.
小波是啥?
傅立叶变换主要给大家提供了一种在不通空间进行信号表达的桥梁, 但是该桥梁是一个独木桥(仅仅有一个维度: 时间或者频率). 针对平稳时间信号而言, 频率相对稳定(随时间变化较小), 这种信号可以使用傅立叶变换去解决, 很好的分析相应的频域特征;
现实中信号大都是非平稳信号, 在计算机系统中的各个指标都会不同, 当想去提取有用的信息时, 最初往往是通过加窗口的傅立叶变换的方法在不通窗口将频域的相关信息进行展开. 其中涉及到窗口的选择和相应的变换基 (就是作用函数, 这里我们就先这么称呼哈), 复杂度较高. 因此, 各路大神, 将尺度信息和位置信息整合在一起(是按照一定的函数关系互相联动), 在很多约束下(能量守恒, 正交性等) 设计出不通性质的小波函数(也叫小波基), 可以更直观的分析在高维空间中的特性, 从而更好的解决问题.
可视化一些小波基函数
Haar 小波: Haar 小波函数, 是小波分析中最早使用的一个具有紧支撑的正交小波函数, 也是最简单的一个小波函数. Haar 小波在时域上是不连续的, 所以作为基本小波性能并不是很好.
Daubechies 小波: 多贝西小波, 一般简写成 DB-N, 其中 N 是小波的阶数. DB-N 小波具有很好的正则性, 即该小波作为稀疏基所引入的光滑误差不容易被察觉, 使得信号重构过程比较光滑. DB-N 小波的特点是随着阶数的增加, 消失矩的阶数也会越大, 其中消失矩越高, 重构的信号的光滑性越好, 频域的局部化能力就越强, 频带的划分效果越好, 但是会使得支撑域减弱, 同时计算量加大.
Symlet 小波: Symlet 小波函数是对 DB-N 系列小波函数的一种改进. Symlet 小波系通常表示为 Sym-N.SymN 小波的支撑范围为 2N-1, 消失矩为 N, 同时也具备较好的正则行. 与 DB-N 小波相比, 在连续性, 支撑集长度, 滤波器长度等方面与 DB-N 小波一致, 但 sym-N 小波具有更好的对称性, 即一定程度上能够减少对信号进行分析和重构时的相位失真.
Meyer 小波: Meyer 小波的小波函数和尺度函数都是在频率域中进行定义的, 它不是紧支撑的, 但是它的收敛速度很快.
3.1.2 Mallat 小波分解
序列的小波分解的具体的逻辑关系如下
分解逻辑解释
将时间序列进行小波分解, 每一层分解的结果是上次分解得到的低频信号再分解成高频和低频两个部分, 如此进行 N 层分解后, 源信号 X 被分解成:
$$ X = D_1 + D_2 + ... + D_N + A_N $$
其中,$D_1, D_2, D_3, ..., D_N$ 分别为第一层, 第二层到第 N 层分解得到的高频信号,$A_N$ 为第 N 层分解得到的低频信号. 对 $D_1, D_2, D_3, ..., D_N$ 分别进行预测, 然后进行小波重构实现对源信号的预测:
对源序列进行小波分解, 得到各层小波系数
对各层小波系数分别建立时序模型, 对各层小波系数进行预测
用得到的预测小波系数对原始序列进行重构
其中步骤 2 中的时序模型, 可以为 ARMA 模型, Forest 模型, 神经网络模型, SVR 模型等.
PS: 拿到各个分解出来的序列信号, 还能做些什么?
针对低频部分的可以分别去检测序列的周期性
举个例子, 看看 Mallat 分解算法对于信号的处理能力
以某集群的 CPU 负载情况为例, 来看下分析的能力
图中各个区域的含义:
蓝色表示 15 分钟一个粒度的某集群 CPU 负载曲线的实际图
A1,A2,A3 表示不同层级的低频信号重构出来的时域信号信息
D1,D2,D3 表示相应层级的高频信号重构出来的时域信号信息
某网站的近 10 天 PV 情况为例子, 来看下分析能力
图中各个区域的含义:
蓝色表示 10 分钟一个粒度的某 webSite 的 PV 曲线的实际图
A1,A2,A3 表示不同层级的低频信号重构出来的时域信号信息
D1,D2,D3 表示相应层级的高频信号重构出来的时域信号信息
3.1.3 小波收缩 (WaveletShrinkage) 算法
WaveShrink 方法来对未知信号进行降噪, 此方法的原理是将小波系数趋向零收缩, 从而达到降噪目的. 一般而言, 信号经小波变换后, 得到一系列的小波系数. 一般情况下, 较大系数代表信号, 较小系数代表噪声, 将小系数剔除后, 在进行小波逆变换, 重构信号中的噪声含量便降低了.
WaveShrink 降噪分为以下三步:
将信号进行小波变换, 求小波系数;
根据经验公式计算阈值, 并对小波系数进行阈值处理;
将处理后的小波系数逆变换. 阈值处理方法采用软阈值方式, 软阈值方式是讲小波系数通阈值相比较, 绝对值小于阈值的系数被设置成零, 绝对值大于阈值的系数将阈值从其绝对值中减掉;
经过软阈值降噪的信号比较平滑, 但是信号会产生一定的偏差;
基于 Stein's Unbiased Risk Estimate 原理 (SURE) 产生阈值
对于一个给定的阈值 $\lambda$ 最小化, 就得到了所选择的阈值, 给定阈值 $\lambda$ 定义为:
$$ \lambda = \sigma * 2 * \sqrt(log(n) / n), \sigma = MAD / 0.6745 $$
MAD 为最佳尺度上小波系数轨迹的绝对均值, 因子 0.6745 是高斯分布矫正选择的.
以某集群中某机柜的电量使用情况, 可以在具体的使用的效果
图中, 蓝色的曲线是原始的机柜电量的示意图, 橙色曲线是经过小波收缩后的结果示意图, 可以很好的滤掉序列中的高频噪声, 而对低频信号的保留相对较好, 相比于在时序进行各种简单平滑操作得到的效果好处显而易见.
3.2 机器学习算法
经过上述各种时域和频域的变换操作后, 我们拿到一些数据预处理之后的结果, 针对该结果, 进行更好的时序预测. 这时要们要使用机器学习中的相关算法进行建模, 得到最合理的时序预测结果.
3.2.0 模型构建和验证流程
现在模型学习和模型验证思路大多是:
直接比较不同模型在相同的训练集中的效果如何? 或是相同模型的不同参数在同一个数据集合中的效果如何?
在另一份数据中去验证模型在不同指标的好坏, 最终通过相关的结果评估公式选择一个目前最好的模型作为最终的模型
当前讨论问题是对时序进行预测, 因此, 模型衡量的标准就是在验证集合中时序的预测效果, 衡量效果的指标就是 MAE/MSE/R-Square/Adj-R-Square.
3.2.1 线性模型(Linear Regression)
回归就是使用若干已知的样本对公式参数的估计.$Y=F(X_1,X_2,X_3)$, 这里的回归函数 $F(...)$ 可以是任意函数, 其中线性回归的模型如下所示:
$$ Y = F(X_1,X_2,X_3) = a*X_1 + b*X_2 + c*X_3 + d $$
其中,$X_1,X_2,X_3$ 是训练样本集合中样本的各个维度,$a,b,c,d$ 是模型中的未知参数.
通过对线性模型的训练, 可以较好的得到模型中各个变量之间的关系.
常用的线性模型
线性回归
多元线性回归
岭回归
Lasso 回归
按照最小均方误差函数进行操作, 得到的优化目标函数如下:
$$ f(x_i) = \sum_{m=1}^{p} w_m * x_{im} + w_0 = w^{T} * x_i $$
使用各种优化方法, 求解 $w$ 向量, 得到线性模型中的相关参数, 在使用逐点预测的方式, 得到相应的预测结果.
3.2.3 非线性模型(Non-Linear Regression)
在之前的文章中介绍过时序统计学模型 (AR,ARMA,ARIMA) 模型, 建模的思路源于针对当前观测点的最近 P 个点和最近 Q 个点的误差值进行建模, 结构如下:$Y_t = \sum_{j=1}^{P}\phi_j * Y_{t-j} - \sum_{k=i}^{Q} \theta_k * \epsilon_{t-k} + \epsilon_t$. 在利用相应的数学工具进行求解, 具体的原理文章, 请见 SLS 机器学习介绍(01): 时序统计建模
这里, 我们介绍下机器学习算法中, 如何进行时序预测~~~
现实背景中, 很多数据并不是严格按照线性关系刻画的, 算法工程师为了兼顾模型的可解释性, 将非线性的数据进行各种变换 (幂函数变换, 倒数变换, 指数变换, 对数变换, Box-Cax 等) 将一个非线性问题转换成一个呈现线性关系的问题, 再利用相应的模型进行解决.
机器学习算法可以进行回归预测的模型如下
- Logistic Regression
- GBRT(MART)/XGBOOST
神经网络模型
支持向量机(SVR)
不同学习方法在不同特性方面的体现
特性 | 神经网络 | SVM | 树 | MARS | K-NN 核 |
---|---|---|---|---|---|
混合类型数据的自然处理 | 差 | 差 | 好 | 好 | 中等 |
遗漏值的处理 | 差 | 差 | 好 | 好 | 好 |
对输入空间中孤立点的健壮性 | 差 | 差 | 好 | 差 | 好 |
对输入的单调转换的不敏感性 | 差 | 差 | 好 | 差 | 差 |
计算的可伸缩性 | 差 | 差 | 好 | 好 | 差 |
处理不相关输入的能力 | 差 | 差 | 好 | 好 | 差 |
提取特征的线性组合的能力 | 好 | 好 | 差 | 差 | 中等 |
可解释性 | 差 | 差 | 中等 | 好 | 差 |
预测能力 | 好 | 好 | 差 | 中等 | 好 |
在数据挖掘应用中, 包含在分析中的大量预测例子变量仅有一小部分与预测是实际相关联的. 同时, 与模式识别等诸多应用不同, 这里很少有可靠的领域知识帮助建立特别相关的特征或者过滤掉不相关的特征, 其结果是严重降低了许多方法的性能.
对速度, 可解释性的要求和数据凌乱的特性严重限制了大量学习过程, 使之无法作为数据挖掘的 "现货方法"."现货" 方法是一种可以直接应用于数据, 而不需要花费太多时间进行数据预处理或对学习过程小心进行调整的方法.
PS: 上述表格出自《统计机器学习基础: 数据挖掘, 推理与预测》第 10 章.
本平台使用 GBRT 算法进行时间序列的预测, 下面具体介绍下 GBRT 算法的基本流程和本平台的建模流程!
3.2.3.1 回归树算法简介
数据组织如下, P 个输入和一个响应, 以及 N 个观测: 即 $(x_i, y_i)$, 其中 $i=1,2,3,...,N$,$x_i = (x_{i1}, x_{i2}, ..., x_{ip})$. 算法需要自动确定分裂变量和分裂点, 以及树应该有什么样的拓扑结构.
假设已经将空间划分成 M 个区域 $R_1, R_2, ..., R_M$, 并且在每个区域内用常量 $c_m$ 对响应建模.
$$ f(x) = \sum_{m=1}^{M}c_m * I(x \in R_m) $$
优化的目标函数采用误差平方和 $\sum (y_i - f(x_i))^2$ 极小华作为我们的准则, 则推导得到最佳的 $\hat{c}_m$ 恰好是 $y_i$ 在区域 $R_m$ 的平均值
$$ \hat{c}_m = avg(y_i | x_i \in R_m) $$
从所有的数据开始, 考虑一个分裂变量 j 和分裂点 s, 并定义一对半平面:
$$ R_1(j, s) = \{X|X_j \leq s\} , R_2(j, s) = \{X | X_j> s\} $$
然后搜索分裂变量 j 和分裂点 s, 它求解:
$$ min_{j,s} = [min_{c_1} \sum_{x_i \in R_1(j, s)}(y_i - c_1)^2 + min_{c_2} \sum_{x_i \in R_2(j, s)}(y_i - c_2)^2] $$
对于任意的 j 和 s, 内部极小化可以用下式求解:
$$ \hat{c}_1 = avg(y_i|x_i \in R_1(j, s)), \hat{c}_2 = avg(y_i|x_i \in R_2(j, s)) $$
找到最好的分裂, 我们把数据划分成两个结果区域, 并对每个区域重复分裂过程. 然后对素偶偶的结果区域重复这一过程.
PS: 这仅仅是回归算法的简单描述, 并没有详细说明其中越到的各种坑.
3.2.3.2 时序特征的构造
拿到一条时间序列, 我们能从中构造哪些特征???
给定一个窗口, 从中挖掘相应的特征, 同时也方便后续进行滚动预测.
平台实验
具体如何使用相关算法的说明和实例在 SLS 机器学习最佳实战: 时序预测这篇文章中有详细的描述, 大家如果在使用过程中遇到什么 BadCase 可以告知我们.
硬广时间
日志进阶
阿里云日志服务针对日志提供了完整的解决方案, 以下相关功能是日志进阶的必备良药:
机器学习语法与函数: https://help.aliyun.com/document_detail/93024.html
日志上下文查询: https://help.aliyun.com/document_detail/48148.html
快速查询: https://help.aliyun.com/document_detail/88985.html
实时分析: https://help.aliyun.com/document_detail/53608.html
快速分析: https://help.aliyun.com/document_detail/66275.html
基于日志设置告警: https://help.aliyun.com/document_detail/48162.html
配置大盘: https://help.aliyun.com/document_detail/69313.html
更多日志进阶内容可以参考: 日志服务学习路径.
联系我们
纠错或者帮助文档以及最佳实践贡献, 请联系: 悟冥
问题咨询请加钉钉群:
参考文献
游程检验的方法和公式
各种小波系数值以及相应的图像信息 http://wavelets.pybytes.com/
小波变换比傅里叶变换好在哪里?
形象易懂讲解算法 I-- 小波变换 https://zhuanlan.zhihu.com/p/22450818
小波变换完美通俗讲解系列之 (一) https://zhuanlan.zhihu.com/p/44215123
小波变换完美通俗讲解系列之 (二) https://zhuanlan.zhihu.com/p/44217268
Gradient Tree Boosting Algorithm
梯度提升树 (GBDT) 原理小结 https://www.cnblogs.com/pinard/p/6140514.html
集成方法: 渐进梯度回归树 GBRT(迭代决策树)
XGBoost https://www.yuque.com/7125messi/ow0syq/bdegsx
来源: https://yq.aliyun.com/articles/684169