回归变量选择

子集回归

  • 特征子集选择独立于回归模型拟合,属于封装器特征选择

最优子集

  • 特点
    • 可以得到稀疏的模型
    • 但搜索空间离散,可变性大,稳定性差

Forward Feature Elimination

前向变量选择

步骤

  • 初始变量集合$S_0 = \varnothing$
  • 选择具有某种最优特性的变量进入变量集合,得到$S_1$
  • 第j步时,从剩余变量中选择最优变量进入集合,得到$S_{j+1}$
  • 若满足终止条件,则结束,否则重复上步添加变量
    • j达到上限
    • 添加剩余变量均无法满足要求

Backward Feature Elimination

后向变量选择

步骤

  • 初始变量集合$S_0$包含全部变量
  • 从变量集合中剔除具有某种最差特性变量,得到$S_1$
  • 第j步时,从剩余变量中剔除最差变量,得到$S_{j+1}$
  • 若满足终止条件,则结束,否则重复上步添加变量
    • j达到上限
    • 剔除剩余变量均无法满足要求

范数正则化约束

  • 回归过程中自动选择特征,属于集成特征选择

Ridge Regression

  • 在L2范数约束下最小化残差平方
  • 作为连续收缩方法
    • 通过bias-variance trade-off,岭回归较普通最小二乘 预测表现更好
    • 倾向于保留所有特征,无法产生疏系数模型

LASSO

能够选择部分特征,产生疏系数模型

  • p > n时,即使所有特征都有用,LASSO也只能从中挑选n个
  • 如果存在相关性非常高的特征,LASSO倾向于只从该组中选择 一个特征,而且是随便挑选的
    • 极端条件下,两个完全相同的特征函数,严格凸的罚函数 (如Ridge)可以保证最优解在两个特征的系数相等,而 LASSO的最优解甚至不唯一

Elastic Net

Naive Elastic Net

  • 弹性网在Lasso的基础上添加系数的二阶范数

    • 能同时做变量选择和连续收缩
    • 并且可以选择一组变量
  • 传统的估计方法通过二阶段估计找到参数

    • 首先设置ridge系数$\lambda_2$求出待估参数$\beta$, 然后做lasso的收缩
    • 这种方法有两次收缩,会导致估计偏差过大,估计不准
  • 弹性网可以变换为LASSO,因而lasso的求解方法都可以用于 elastic net

elastic_net

Least Angle Regression

  • 线性回归即找的一组系数能够用自变量的线性组合表示 因变量

Forward Selection/Forward Stepwise Regression

  • 从所有给定predictors中选择和y相关系数绝对值最大的变量 $x_{j1}$,做线性回归

    • 对于标准化后的变量,相关系数即为变量之间的内积
    • 变量之间相关性越大,变量的之间的夹角越小,单个变量 能解释得效果越好
    • 此时残差同解释变量正交
  • 将上一步剩余的残差作为reponse,将剩余变量投影到残差上 重复选择步骤

    • k步之后即可选出一组变量,然后用于建立普通线性模型
  • 前向选择算法非常贪心,可能会漏掉一些有效的解释变量,只是 因为同之前选出向量相关

Forward Stagewise

前向选择的catious版本

  • 和前向选择一样选择和y夹角最小的变量,但是每次只更新较小 步长,每次更新完确认和y夹角最小的变量,使用新变量进行 更新

    • 同一个变量可能会被多次更新,即系数会逐渐增加
    • 每次更新一小步,避免了前向选择的可能会忽略关键变量

Spark MLLib

MLLib

Spark MLLib:Spark平台的机器学习库

  • 能直接操作RDD数据集,可以和其他BDAS其他组件无缝集成, 使得在全量数据上进行学习成为可能

  • 实现包括以下算法

    • Classification
    • Regression
    • Clustering
    • Collaborative Filtering
    • Dimensionality Reduction
  • MLLib是MLBase中的一部分

    • MLLib
    • MLI
    • MLOptimizer
    • MLRuntime
  • 从Spark1.2起被分为两个模块

    • spark.mllib:包含基于RDD的原始算法API
    • spark.ml:包含基于DataFrame的高层次API
      • 可以用于构建机器学习PipLine
      • ML PipLine API可以方便的进行数据处理、特征转换、 正则化、联合多个机器算法,构建单一完整的机器学习 流水线
  • MLLib算法代码可以在examples目录下找到,数据则在data 目录下
  • 机器学习算法往往需要多次迭代到收敛为止,Spark内存计算、 DAG执行引擎象相较MapReduce更理想
  • 由于Spark核心模块的高性能、通用性,Mahout已经放弃 MapReduce计算模型,选择Spark作为执行引擎

mllib.classification

Classification

Logistic Regression

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from pyspark.mllib.classification import \
LogisticRegressionWithLBFGS, LogisticRegressionModel
from pyspark.mllib.regression import LabledPoint

def parse_point(line):
value = [float(i) for i line.split(", \r\n\t")

data = sc.textFile("data/mllib/sample_svm_data.txt")
parsed_data = data.map(parse_point)
# map `parse_point` to all data

model = LogisticRegressionWithLBFGS.train(parsed_data)
labels_and_preds = parsed_data.map(lambda p: (p.label, model.predict(p.features)))
train_err = labels_and_preds \
.filter(lambda lp: lp[0] != lp[1]) \
.count() / float(parsed_data.count())

model.save(sc, "model_path")
same_model = LogisticRegressionModel.load(sc, "model.path")
  • Decision Tree
  • Random Forest
  • Gradient
  • boosted tree
  • Multilaye Perceptron
  • Support Vector Machine
  • One-vs-Rest Classifier
  • Naive Bayes

Clustering

K-means

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import numpy as np
from pyspark.mllib.clustering import KMeans, KMeansModel

data = sc.textFile("data/mllib/kmeans_data.txt")
parsed_data = data.map(lambda line: np.array([float(i) for i in line.split()]))

cluster_model = KMeans.train(
parsed_data,
maxIteration=10,
initializationMode="random"
)
def error(point):
center = cluster_model.centers[cluster.predict(point)]
return np.sqrt(sum([i**2 for i in (point - center)]))
WSSSE = parsed_data \
.map(lambda point.error(point)) \
.reduce(lambd x, y: x + y)

cluster_model.save(sc, "model_path")
same_model = KMeansModel.load(sc, "model_path")

Gaussian Mixture Model(GMM)

  • 混合密度模型
    • 有限混合模型:正态分布混合模型可以模拟所有分布
    • 迪利克莱混合模型:类似于泊松过程
  • 应用
    • 聚类:检验聚类结果是否合适
    • 预测:

      todo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import numpy as np
from pyspark.mllib.clustering import GussianMixture, \
GussianMixtureModel

data = sc.textFile("data/mllib/gmm_data.txt")
parsed_data = data.map(lambda line: np.array[float(i) for i in line.strip()]))

gmm = GaussianMixture.train(parsed_data, 2)
for w, g in zip(gmm.weights, gmm.gaussians):
print("weight = ", w,
"mu = ", g.mu,
"sigma = ", g.sigma.toArray())

gmm.save(sc, "model_path")
same_model = GussainMixtureModel.load(sc, "model_path")

Latent Dirichlet Allocation(LDA)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from pyspark.mllib.clustering import LDA, LDAModel
from pyspark.mllib.linalg import Vectors

data = sc.textFile("data/mllib/sample_lda_data.txt")
parsed_data = data.map(lambda line: Vector.dense([float(i) for i in line.strip()]))

corpus = parsed_data.zipWithIndex() \
.map(lambda x: [x[1], x[0]).cache()
ldaModel = LDA.train(corpus, k=3)

topics = ldaModel.topicsMatrix()

for word in range(0, ldaModel.vocabSize()):
for topic in word:
print(topic)

ldaModel.save(sc, "model_path")
same_model = LDAModel.load("model_path")
  • Disecting K-means

Regression

Linear Regression

  • 耗时长、无法计算解析解(无意义)
  • 使用MSE作为极小化目标函数,使用SGD算法求解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from pyspark.mllib.regression import LabledPoint, \
LinearRegressionWithSGD, LinearRegressionModel

def parse_point(line):
value = [float(i) for i line.split(", \r\n\t")

data = sc.textFile("data/mllib/ridge-data/lpsa.data")
parsed_data = data.map(parse_point)
# map `parse_point` to all data

model = LinearRegressionWithSGD.train(
parsed_data,
iteration=100,
step=0.00000001
)
values_and_preds = parsed_data.map(lambda p:(p.label, model.predict(p.features)))
MSE = values_and_preds \
.map(lambda vp: (vp[0] - vp[1]) ** 2) \
.reduce(lambda x, y: x + y) / values_and_preds.count()

model.save(sc, "model_path")
# save model
same_model = LinearRegressionModel.load(sc, "model_path")
# load saved model
  • Generalized Linear Regression
  • Decision Tree Regression
  • Random Forest Regression
  • Gradient-boosted Tree Regression
  • Survival Regression
  • Isotonic Regression

Collaborative Filtering

协整与误差修正模型

Spurious Regression

  • 多变量分析中,平稳性非常重要,忽略序列平稳性判断,容易出现伪回归现象

  • GrangerNewbold 的非平稳序列的伪回归随机模型实验(两个独立随机游走模型)表明

    • 非平稳场合,参数显著性检验犯弃真错误的概率远大于 $\alpha$,伪回归显著成立
    • 即 $P(|t| \geqslant t_{\alpha/2}(n) | 非平稳序列) \leqslant \alpha$

Cointegration 协整关系

  • ${x_1}, {x_2}, \cdots, {x_k}$:自变量序列
  • $y_t$:响应变量序列
  • ${\epsilon_t}$:平稳回归残差序列

协整检验

  • 假设条件

    • $H_0: \epsilon_t ~ I(k), k \geqslant 1$:多元非平稳序列之间不存在协整关系
    • $H_1: \epsilon_t ~ I(0)$:多元非平稳序列之间存在协整关系
  • 建立响应序列与输入序列之间的回归模型

  • 对回归残差序列进行 EG 平稳性检验

Error Correction Model

ECM:误差修正模型,解释序列短期波动关系

  • Granger 证明协整模型、误差修正模型具有 1-1 对应关系
    • 协整模型度量序列之间长期均衡关系
  • 实务中,响应序列与解释序列很少处于均衡点上,实际观测的是序列间短期或非均衡关系

Granger 表述定理

  • 如果变量 $X$、$Y$ 是协整的,则他们之间的短期非均衡关系总能用一个误差修正模型表述 $$
      \Delta Y_t = lagged(\Delta Y, \Delta X) - \lambda ECM_{t-1} + \epsilon_t
    
    $$
  • 对关系 $y_t = \beta x_t + \epsilon_t$

  • 响应序列当期波动 $\Delta y_t$ 主要受到三方面短期波动影响

    • $\Delta x_t$:输出序列当前波动
    • $ECM_{t-1}$:上一期误差
    • $\epsilon_t$:纯随机波动

误差修正模型

  • $\beta_1 < 0$:表示负反馈机制
    • $ECM_{t-1} > 0$:正向误差,则会导致下一期值负向变化
    • $ECM_{t-1} < 0$:负向误差,则会导致下一期值正向变化

Granger 因果关系

  • 因果关系:原因导致结果

    • 时间角度:原因发生在前,结果发生在后
    • 影响效果:$X$ 事件发生在前,且对 $Y$ 事件发展结果有意义
  • Granger 检验可检验统计学意义上的 Granger 因果关系

    • 统计意义上的因果关系和现实意义上因果关系不同
    • 现实意义上变量因果关系强调逻辑自洽

Granger 因果关系

  • 序列 $X$ 是序列 $Y$ 的 Granger 原因,当且仅当最优线性预测函数使得下式成立 $$

      \theta^2(y_{t+1}|I_t) \leq \theta^2(y_{t+1}|I_t-X_t)
    

    $$

  • $It = { x_t, x{t-1}, \cdots, yt, y{t-1}, \cdots }$:$t$ 时刻所有有用信息集合

  • $Xt = { x_t, x{t-1}, \cdots }$:t时刻所有序列信息集合
  • $\theta^2(y_{t+1}|I_t)$:使用所有可获得历史信息 (包括 ${x}$ 序列历史信息)得到的一期预测值方差
  • $\theta^2(y_{t+1}|I_t-X_t)$:从所有信息中刻意扣除 ${x}$ 序列历史信息得到的一期预测值方差
  • Granger 因果关系分类
    • $(x, y)$:相互独立
    • $(x \leftarrow y)$:$x$ 是 $y$ 的 Granger 原因
    • $(x \rightarrow y)$:$y$ 是 $x$ 的 Granger 原因
    • $(x \leftrightarrow y)$:互为因果

Granger 因果检验

  • 建立回归方程

    • $z_t$:其他解释变量集合
    • $\epsilon_t \sim I(0)$
  • 假设

    • $H_0: \alpha_1 = \alpha_2 = \cdots = \alpha_m = 0$
    • $H_1: \alpha_i 不全为0$
  • 检验统计量:F统计量

Granger 因果检验说明

  • Granger 因果检验思想:对响应变量预测精度有显著提高的自变量,就视为响应变量的因

    • 因果性可以推出预测精度提高,但预测精度提高不能等价推出因果性
    • 即使检验结果显著拒绝原假设,也不能说明两个序列之间有真正因果关系
  • Granger 因果检验是处理复杂变量关系时的工具

    • 借助因果检验信息,可以帮助思考模型结果
    • 不一定准确,但是提供信息比完全没有信息好
  • Granger 因果结果说明

    • 检验结果严重依赖解释变量的延迟阶数,不同延迟阶数可能会得到不同的检验结果
    • 检验结果会受到样本随机性影响,样本容量越小随机性越大,所以最好在样本容量比较大时进行检验

时间序列分析

时间序列分析

  • 时间序列数据:在不同时间点收集到的数据,反映某事物、现象随实际变化状态、程度

  • 描述性时序分析:通过直观的数据比较、绘图观测,寻找序列中蕴含的发展规律

    • 操作简单、直观有效,是时序分析的第一步
    • 但是只能展示非常明显的规律性
    • 最早的时序分析方法,所有时序分析的基础
    • 帮助人们找到自然规律
      • 尼罗河的泛滥
      • 范蠡稳定粮价
      • 小麦价格指数序列
      • 太阳黑子运动规律
  • 确定性时序分析:根据序列的观察特征,先构想一个序列运行的理论,默认序列按照此理论确定性运作

    • 侧重于确定性信息的提取
    • 通常不能通过分析误差自行修正模型,只能通过新的模型假定, 推翻旧模型实现分析方法的改进
    • 假定条件决定了序列的拟合精度,如果确定性的假定条件不对, 误差将很大,因此限制其使用范围

时域分析

确定性时域分析

  • 原理:事件的发展通常具有一定的惯性,用统计语言描述就是序列值之间存在一定的相关关系,即某种统计规律

  • 目的:寻找序列值之间的相关关系的统计规律,并拟合适当数学模型描述,进而用于预测

  • 特点

    • 理论基础扎实
    • 操作步骤规范
    • 分析结果易于解释

常用领域

  • 宏观经济领域的 Time Series Decomposition

  • 确定性趋势预测

    • 趋势预测:线性趋势预测、非线性趋势预测
    • 指数平滑预测:简单、两参、三参指数平滑

随机性时域分析

  • 原理:假设序列为随机变量序列,利用对随机变量分析方法研究序列

  • 特点

    • 预测精度更高
    • 分析结果可解释性差
    • 是目前时域分析的主流方法

频域分析

  • 思想:假设任何一种无趋势的实现序列,都可以分解成若干不同频率的周期波动(借助傅里叶变换,用三角函数逼近)

时域分析发展

启蒙阶段

  • AR 模型:George Undy Yule
  • MA 模型、Yule-Walker 方程:Sir Gilbert Thomas Walker

核心阶段

  • ARIMA:经典时间序列分析方法,是时域分析的核心内容
    • Box & Jenkins 书中系统的阐述了ARIMA模型的识别、估计、检验、预测原理和方法

完善阶段

  • 异方差场合

    • ARCHRobert Fry Engle
    • GARCHBollerslov
    • GARCH 衍生模型
      • EGARH
      • IGARCH
      • GARCH-M
      • NGARCH
      • QGARCH
      • TGARCH
  • 多变量场合

    • ARIMAXBox & Jenkins
    • Co-intergration and error correction modelC.Granger,协整理论
    • SYSLINKlein,宏观经济连理方程组模型
    • Vector Autoregressive ModelSims,货币政策及其影响
  • 非线性场合

    • Threshold Autoregressive Model
    • Artificical Neural Network
    • Hebbian Learning:神经可塑性假说
    • Multivariate Adaptive Regression Splines
    • Linear Classifier
    • Support Vector Machines

Vector Auto-regression Model

Vector Auto-regression Model

VAR 模型:向量自回归模型

  • 模型特点

    • 不以经济理论为基础
    • 结构简介明了
    • 预测精度高
  • 模型方程特点

    • 采用多方程联立的形式
    • 需要估计 $m(mp+1)$ 个参数的,对样本数量要求高
    • 模型的每个方程中,内生变量 对模型的全部内生变量滞后项进行回归,估计全部内生变量的动态关系
  • 模型用途

    • 脉冲响应分析
    • 方差分解

VAR 模型参数

  • VAR 模型系数由统计相关性估计

    • 不具有逻辑上的因果关系
    • 通常不直接解读 VAR 模型每个方程的经济学意义
  • VAR 模型参数不进行参数显著性检验,但是允许研究人员对参数施加特殊约束

  • VAR 模型通常是由一系列 非平稳序列构造的平稳系统

    • 所以若包含非平稳变量,其中至少存在 1 个协整关系
    • 协整关系具有经济学意义,可以解读系数(所以需要进行协整检验)

VAR模型形式

两变量 VAR(1)

  • 方程组形式

  • 矩阵形式

  • $u{1,t}, u{2,t} \overset {i.i.d.} {\sim} (0, \theta^2)$:随机波动项,$Cov(u{1,t}, u{2,t}) = 0$

多变量的 VAR(k)(含外生变量)

  • $Yt = (y{1,t}, y{2,t}, \cdots, y{N,t})^T$:内生变量
  • $C = (c_1, c_2, \cdots, c_N)^T$:常数项
  • $\Pi_j = \begin{bmatrix}
      \pi_{11,j} & \pi_{12,j} & \cdots & \pi_{1N,j} \\
      \pi_{21,j} & \pi_{22,j} & \cdots & \pi_{2N,j} \\
      \vdots & \vdots & \ddots & \vdots \\
      \pi_{N1,j} & \pi_{N2,j} & \cdots & \pi_{NN,j} \\
    
    \end{bmatrix}$:内生变量待估参数
  • $Ut = (u{1,t}, u{2,t}, \cdots, u{N,t})^T \overset {i.i.d.} {\sim} (0, \Omega)$:随机波动项
  • $Zt = (z{1,t}, z{2,t}, \cdots, z{N, t})^T$:外生变量

VAR(k) 变换

  • VAR(k) 模型可通过变换附加伴随矩阵式,改写为 VAR(1)

Structured VAR

SVAR:结构 VAR 模型,在 VAR 模型基础上加入内生变量当期值

  • 即解释变量中含有当期变量

两变量 SVAR(1)

含外生变量 VAR(1)

  • $Y_t, Z_t, V_t$:内生变量向量、外生变量向量、误差项向量
  • $A, D, B, F$:模型结构参数
  • $C=A^{-1}D, \Pi_1=A^{-1}B, H=A^{-1}F, U_t=A^{-1}V_t$

VAR 模型稳定性

  • 把脉冲施加在 VAR 模型中某个方程的 Iinnovation 过程上
    • 随着时间推移,冲击会逐渐消失,则模型稳定
    • 冲击不消失的则模型不稳定

一阶 VAR 模型分析

  • $\mu = (I + \Pi_1 + \Pi_2^2 + \cdots + \Pi_1^{t-1})C$:漂移向量
  • $Y_0$:初始向量
  • $U_t$:新息向量
  • $t \rightarrow \infty$ 时有

两变量 VAR(1) 稳定条件

  • 稳定条件
    • 特征方程$|\Pi_1 - \lambda I|=0$根都在单位圆内
    • 相反的特征方程$|I - L\Pi_1|=0$根都在单位圆外

VAR(k) 稳定条件

  • $A$:$Nk$ 阶方阵
  • $N$:回归向量维度
  • $k$:自回归阶数
  • 稳定条件
    • 特征方程 $|A - \lambda I| = 0$ 根全在单位圆内
    • 相反的特征方程 $|I - LA| = 0$ 根全在单位圆外

VEC 模型

N 变量 VEC(k)

  • $\Pi = \sum_{i=1}^k \Pi_i - I$:影响矩阵
  • $\Gammai = -\sum{j=i+1}^k$

VEC(1)

Impulse-Response Function

脉冲响应函数:描述内生变量对误差冲击的反应

  • 脉冲响应函数含义

    • 在随机误差下上施加标准查大小的冲击后,对内生变量当期值和未来值所带来的影响
    • 即将 VAR 模型表示为无限阶的向量 $MA(\infty)$ 过程
  • 对脉冲响应函数的解释的困难源于,实际中各方程对应误差项不是完全非相关

    • 误差相关时,其有一个共同组成部分,不能被任何特定变量识别
    • 故,左乘变换矩阵 $M$ 得到 $V_t = MU_t$ 修正相关性(常用 Cholesky 分解求解)
      • 即将其协方差矩阵变换为对角矩阵 $V_t = MU_t \sim (0, \Omega)$

VAR(1) 转换为 MA

  • $\Psis = A^s = \frac {\partial Y{t+s}} {\partial U_t}$
  • $\Psis[i, j] = \frac {\partial y{i,t+s}} {\partial u{j,t}}$:脉冲响应函数,表示其他误差项在任何时期都不变条件下,第 $j$ 个变量 $y{j,t}$ 在对应误差项 $u{j,t}$ 在 $t$ 期受到一个单位冲击后,对第 $i$ 个内生变量 $y{i,t}$ 在 $t+s$ 期造成的影响

方差分解

方差分解:分析未来 $t+s$ 期 $y_{j, t+s}$ 的预测误差受不同新息冲击影响比例

均方误差

  • 误差可以写为 MA 形式

  • 则预测s期的均方误差为

  • $\Omega = E(U_tU_t^T)$:不同期 $U_t$ 协方差阵为 0

计算比例

  • $v{1,t}, v{2,t}, \cdots, v_{N,t}$不相关
  • 将 $\Omega$ 带入 MSE 表达式中,既可以得到第 $j$ 个新息对 $s$ 期预测量 $\hat Y_{t+s|t}$ 的方差贡献比例

VAR 建模

var_procedure

  • 进行单变量平稳性检验

  • 拟合 VAR(p) 模型

    • 确定模型阶数
      • 理论上初步模型阶数可以任意确定
      • 然后根据 AICBIC、对数似然函数值选择相对最优阶数
  • 若所有变量平稳,则 Granger 因果检验

    • VAR 模型通过平稳性检验,理论上就可以利用模型进行分析、预测
    • VAR 模型是超系数模型,默认所有内生变量互为因果
      • 但实际上变量之间因果关系复杂
      • 可通过 Granger 因果检验判断变量之间长期、短期因果关系
  • 若有变量非平稳

    • 检验模型平稳性
    • Granger 因果检验
    • 协整检验:JJ 检验
      • 非平稳系统必然存在协整关系,具有经济学意义
      • 所以需要找出存在的基础协整关系,解读其代表的长期、短期相关影响
    • 构建 VEC 模型
      • 如果协整检验显示基本协整关系满秩,说明系统中每个序列都是平稳序列,直接建立VAR模型
      • 如果协整检验限制基本协整关系为 0 秩,则系统不存在协整关系,通常说明系统不平稳,需要重新选择变量, 或者适当差分后建模
      • 最常见情况是协整检验显示基本协整关系数量处于 0 至满秩中间,此时建立 $VEC$ 模型
  • 脉冲响应分析

  • 方差分析

  • 模型预测