一些变量筛选方法——3、部分其它变量筛选方法

由于《An Introduction to Statistical Learning with R》书中的方法书中的方法都是一些比较基础的方法,在做模拟实验以及真实超高维数据时,会出现很多局限性。因此本文后半部分介绍了课本上未提及到的一些方法。这些方法会在后面的模拟实验以及真实数据中进行应用,并且比较书上传统的方法与下述三种方法的真实变量筛选效果。

首先介绍将 L 0 L^0 L0范数与 L 1 L^1 L1范数相结合的SCAD方法。


SCAD(Smoothly Clipped Absolute Deviation)

与岭回归相比,SCAD降低了模型的预测方差,与此同时与Lasso相比,SCAD又缩小了参数估计的偏差,同时它还有很多前面算法所不具备的优秀性质,因而受到了广泛的关注。

SCAD将前面博客提到的 g λ ( β ) = λ f ( β ) g_\lambda(\beta) = \lambda f(\beta) gλ(β)=λf(β),变为如下形式:
g λ ( β ) = { λ ∣ β j ∣ , 0 ≤ ∣ β j ∣ < λ , − ( ∣ β j ∣ 2 − 2 a λ ∣ β j ∣ + λ 2 ) / ( 2 a − 2 ) , λ ≤ ∣ β j ∣ < a λ , ( a + 1 ) λ 2 / 2 , ∣ β j ∣ ≥ a λ . g_\lambda(\beta) = \left\{ \begin{array}{ll} \lambda |\beta_j|, & 0 \leq |\beta_j| < \lambda,\\ -(|\beta_j| ^ 2 - 2a \lambda |\beta_j| + \lambda^2)/(2a-2), & \lambda \leq |\beta_j| < a\lambda,\\ (a+1)\lambda^2 / 2, & |\beta_j| \geq a \lambda. \\ \end{array} \right. gλ(β)=λβj,(βj22aλβj+λ2)/(2a2),(a+1)λ2/2,0βj<λ,λβj<aλ,βjaλ.

其中, λ ≥ 0 , a > 2 \lambda \geq 0, a>2 λ0,a>2,Fan和Li\cite{article11} 建议a取3.7。特别地,若设计矩阵 X X X正交时,SCAD法参数估计显式表达式如下:
β ^ S C A D = { s i g n ( β j ^ ) ∣ β j ^ ∣ − λ ) , 0 ≤ ∣ β j ∣ < 2 λ , ( ( a − 1 ) β j ^ − s i g n ( β j ^ ) a λ ) / ( a − 2 ) , 2 λ ≤ ∣ β j ^ ∣ < a λ , β j ^ , ∣ β j ^ ∣ ≥ a λ . \hat{\beta}^{SCAD} = \left\{ \begin{array}{ll} sign(\hat{\beta_j}) |\hat{\beta_j}| - \lambda ), & 0 \leq |\beta_j| < 2 \lambda,\\((a - 1)\hat{\beta_j} - sign(\hat{\beta_j})a\lambda)/(a-2), & 2\lambda \leq |\hat{\beta_j}| < a\lambda,\\ \hat{\beta_j}, & |\hat{\beta_j}| \geq a \lambda. \\\end{array} \right. β^SCAD=sign(βj^)βj^λ),((a1)βj^sign(βj^)aλ)/(a2),βj^,0βj<2λ,2λβj^<aλ,βj^aλ.

一些变量筛选方法——3、部分其它变量筛选方法_第1张图片

上图说明了 L 0 L^0 L0惩罚, L 1 L^1 L1惩罚,与SCAD三者惩罚之间的差别。可以看出, L 0 L^0 L0方法只会进行变量筛选,不会进行压缩, L 1 L^1 L1(LASSO)既会进行变量筛选,也会对系数继续一定的调整。而SCAD可以从图中很明显的其结合了两种方法,对系数较大的变量不进行惩罚,对系数较少的进行压缩或者删去,因此这种方法既可以筛选变量,也有着Oracle的性质,使其预测效果和真实模型别无二致。

SCAD虽然有相应的迭代算法,但是由于其复杂度高,所以计算速度相对较慢。另外老师上课讲过的将 L 1 L^1 L1 L 2 L^2 L2范数相结合的Elastic Net方法\cite{article16},也是基于前面的一种衍生方法,本文不再进行阐述。


SIS(Sure Independence Screening)

当今大数据时代,维数远大于样本量的情况已经非常多见。尽管前面所提出的方法,而且也能一定程度上解决髙维数据问题。但当遇到超高维数据,即维数P无穷大时,上述的算法也会出现问题。针对这类超高维问题,Fan和Lv\cite{article12} 提出了SIS的方法。

针对线性回归模型(2),按照SIS的思想,首先 Y Y Y为中心化向量,计算 Y Y Y与每一个自变量 x i x_i xi的相关系数,记为
ω = X T Y , \omega = X^T Y , ω=XTY,
其中 ω = ( ω 1 , ⋯   , ω p ) T \omega = (\omega_1,\cdots,\omega_p)^T ω=(ω1,,ωp)T,若 ω i \omega_i ωi越大,说明 x i x_i xi Y Y Y相关性越强。所以,可以根据 ∣ ω i ∣ |\omega_i| ωi的大小来进行变量选择。对任意的 γ ∈ ( 0 , 1 ) \gamma \in (0,1) γ(0,1),对 ∣ ω i ∣ |\omega_i| ωi进行从大到小排序,然后取其一个子集

M γ = { 1 ≤ i ≤ p : ∣ ω i ∣ 是前 [ γ n ] 个最大的 } , M_\gamma = \lbrace 1 \leq i \leq p:|\omega_i| \text{是前}[\gamma n] \text{个最大的} \rbrace, Mγ={1ip:ωi是前[γn]个最大的},

其中, n n n是样本数, [ γ n ] [\gamma n] [γn] γ n \gamma n γn的整数部分,进而保证了 [ γ n ] < n [\gamma n] < n [γn]<n,与之对应的自变量则入选模型。如果觉得选择 [ γ n ] [\gamma n] [γn]不便于确定,可以选择 n − 1 n - 1 n1 n / log ⁡ n n/\log n n/logn

而关于相关系数,可以选用自己认为合适的。本文后面的模拟选用传统的Pearson相关系数,以及近几年比较火的可用于检验独立的无参数假设的距离相关性(Distance Covariance),下面其计算公式:

距离相关性(Distance Covariance)

a j , k = ∥ X j − X k ∥ , j , k = 1 , 2 , … , n , b j , k = ∥ Y j − Y k ∥ , j , k = 1 , 2 , … , n , \begin{aligned} a_{j,k}&=\|X_{j}-X_{k}\|,\qquad j,k=1,2,\ldots ,n,\\b_{j,k}&=\|Y_{j}-Y_{k}\|,\qquad j,k=1,2,\ldots ,n, \end{aligned} aj,kbj,k=XjXk,j,k=1,2,,n,=YjYk,j,k=1,2,,n,
其中: ∣ ∣ ⋅ ∣ ∣ ||\cdot|| 表示Euclidean范数(欧几里得距离),有:
A j , k : = a j , k − a ‾ j ⋅ − a ‾ ⋅ k + a ‾ ⋅ ⋅ , B j , k : = b j , k − b ‾ j ⋅ − b ‾ ⋅ k + b ‾ ⋅ ⋅ , A_{j,k}:=a_{j,k}-{\overline {a}}_{j\cdot }-{\overline {a}}_{\cdot k}+{\overline {a}}_{\cdot \cdot },\qquad B_{j,k}:=b_{j,k}-{\overline {b}}_{j\cdot }-{\overline {b}}_{\cdot k}+{\overline {b}}_{\cdot \cdot }, Aj,k:=aj,kajak+a,Bj,k:=bj,kbjbk+b,

其中: a ‾ j ⋅ \overline {a}_{j\cdot} aj表示由 a j , k a_{j,k} aj,k组成的矩阵,第 j j j行均值, a ‾ ⋅ k \overline {a}_{\cdot k} ak 表示第 k k k列均值,以及 a ‾ ⋅ ⋅ \overline {a}_{\cdot \cdot } a X X X样本中所有数取平均。 b b b的符号标记同 a a a一样,则样本的距离相关性定义为:
dCov n 2 ( X , Y ) : = 1 n 2 ∑ j = 1 n ∑ k = 1 n A j , k   B j , k . \text{dCov}_{n}^{2}(X,Y):={\frac {1}{n^{2}}}\sum _{j=1}^{n}\sum _{k=1}^{n}A_{j,k}\,B_{j,k}. dCovn2(X,Y):=n21j=1nk=1nAj,kBj,k.


利用随机森林进行变量筛选

其实使用随机森林进行变量筛选是一个比较小众的方法,但其实代表了一类方法。模型本身是用于预测的模型,但在预测过程中,可以对变量重要性进行排序,然后通过这种排序来进行变量筛选。这类方法其实还适用于最近比较火的xgboost,lightgbm等一些非常流行的基于树的机器学习算法,在实际应用中,效果都非常突出。

本文只以较为基础的随机森林中的变量筛选为例:

变量重要性评判用Gini指数为标准,针对一棵树中的每个节点 k k k,我们都可以计算一个Gini指数:
G k = 2 p ^ k ( 1 − p ^ k ) , G_k = 2 \hat{p}_k (1 - \hat{p}_k), Gk=2p^k(1p^k),
其中 p ^ k \hat{p}_k p^k表示样本在节点 k k k属于任意一类的概率估计值。

一个节点的重要性由节点分裂前后Gini指数的变化量来确定:
I △ k = G k − G k 1 − G k 2 , I_{\triangle k} = G_k - G_{k1} - G_{k2}, Ik=GkGk1Gk2,
G k 1 G_{k1} Gk1 G k 2 G_{k2} Gk2分别表示 G k G_k Gk产生的子节点。针对森林中的每棵树,都用上述的标准来递归产生,最终随机抽取样本和变量,产生森林,假设森林共产生 T T T棵树。

森林中,如果变量 X i X_i Xi在第 t t t棵树中出现 M M M次,则变量 X i X_i Xi在第 t t t棵树的重要性为:
I i t = ∑ j = 1 M I △ j . I_{it} = \sum_{j = 1}^M I_{\triangle j}. Iit=j=1MIj.

X i X_i Xi在整个森林中的变量重要性为:
I ( i ) = 1 n ∑ t = 1 T I i t . I_{(i)} =\frac{1}{n} \sum_{t = 1}^T I_{it}. I(i)=n1t=1TIit.

最终我们根据变量重要性来选择变量,选择的个数可以用SIS中的方法,选取 n − 1 n - 1 n1 n / log ⁡ n n/\log n n/logn个。

至此,变量筛选的一些方法已进行了简要的概述,包括课本中的以及一些延伸的方法。下面将用模拟实验以及真实数据,来对这些方法进行比较分析。


原始对偶激活集算法(PDAS)

原始对偶激活集算法(Primal Dual Active Set,PDAS)是一个非常新的方法,但做的事情是最优子集选择的事情。其主要思想是引入激活集,对所有的 β \beta β进行批量迭代更新。这个方法的优势在于,可以处理超高维数据(上万维),而最优子集选择一旦超过了50维,基本就完全没办法进行运算。后面我们也将采用PDAS来进行模拟。

其算法如下:

  1. 给定某固定的 T T T,初始的 β 0 \beta^0 β0 d 0 = − g ( β 0 ) h ( β 0 ) d^0=-\dfrac{g(\beta_0)}{h(\beta_0)} d0=h(β0)g(β0),根据 β 0 \beta^0 β0 d 0 d^0 d0得出 A 0 \mathcal{A}^0 A0 I 0 \mathcal{I}^0 I0。令 k = 0 k=0 k=0
  1. For k = 0 , 1 , 2 , … , K m a x k=0,1,2,\ldots,K_{max} k=0,1,2,,Kmax, do
    (2.a) 更新 ( β k + 1 , d k + 1 ) (\beta^{k+1},d^{k+1}) (βk+1,dk+1):
    { β I k k + 1 = 0 d A k k + 1 = 0 β A k k + 1 = a r g   m i n   l ( β A k ∣ Y , X A k ) d I k k + 1 = − g ( β I k k ) h ( β I k k ) \left\{ \begin{array}{ll} \beta_{I^k}^{k+1}=0\\ d_{A^k}^{k+1}=0\\ \beta_{A^k}^{k+1}=arg\,min\,l(\beta_{A^k}|\textit{Y},\textit{X}_{A^k})\\ d_{I^k}^{k+1}=-\dfrac{g(\beta_{I^{k}}^{k})}{h(\beta_{I^{k}}^{k})} \end{array} \right. βIkk+1=0dAkk+1=0βAkk+1=argminl(βAkY,XAk)dIkk+1=h(βIkk)g(βIkk)
    (2.b) 通过以下方式计算新的激活集 A k + 1 \mathcal{A}^{k+1} Ak+1和非激活集 I k + 1 \mathcal{I}^{k+1} Ik+1:
    A k + 1 = { j : − h ( β j k + 1 ) ∣ β j k + 1 + d j k + 1 ∣ ⩾ − h ( β j k + 1 ) ∥ β j k + 1 + d j k + 1 ∥ T , ∞ } , A^{k+1}=\lbrace{j}:\sqrt{-h(\beta_{j}^{k+1})}\vert\beta_{j}^{k+1}+d_{j}^{k+1}\vert\geqslant\sqrt{-h(\beta_{j}^{k+1})}\Vert\beta_{j}^{k+1}+d_{j}^{k+1}\Vert_{T,\infty}\rbrace, Ak+1={j:h(βjk+1) βjk+1+djk+1h(βjk+1) βjk+1+djk+1T,},
    I k + 1 = ( A k + 1 ) c I^{k+1}=(A^{k+1})^c Ik+1=(Ak+1)c
    (2.c) 如果 A k + 1 = A k \mathcal{A}^{k+1}=\mathcal{A}^{k} Ak+1=Ak,则停止迭代;否则令 k = k + 1 k=k+1 k=k+1,继续(2.a)和(2.b)步。
    (2.d) 输出 β = β k + 1 \beta=\beta^{k+1} β=βk+1

后面我们将对前面提及的一些算法进行模拟,以及真实案例操作。传送门:一些变量筛选方法——4、模拟实验

你可能感兴趣的:(统计学习)