Partial least squares regression 偏最小二乘回归--潘登同学的Machine Learning笔记
什么时候用PLS
偏最小二乘回归是集主成分分析,典型相关分析和多元线性回归分析3种分析方法的优点于一身
MLR的缺点: 当自变量的数量大于样本量的时候,解不出$\theta$,回顾解析解 $$ \theta = (X^TX)^{-1}X^TY $$
设$X_{nk}$,当$k>n$时,$(X^TX)_{kk}$的秩为n,不是满秩的,所以没有逆矩阵$Rank(AB)\leq Rank(B)$
PCA的缺点: PCA只考虑了自变量的方差,然后选取了方差最大的几个正交变量,可以用于解决共线性问题(计量),没有考虑自变量对因变量的贡献
PLS: 偏最小二乘回归提供一种多对多线性回归建模的方法,特别当两组变量的个数很多,且都存在多重相关性,而样本又比较少的时候。
基本原理
考虑$P$个因变量$y_1,y_2,\cdots,y_p$与$m$个自变量$x_1,x_2,\cdots,x_m$的回归问题。
首先在自变量集中提出第一成分$u_1$($u_1$是$x_1,\ldots,x_n$的线性组合,且尽可能多地提取原自变量集中的变异信息);同时在因变量集中也提取第一成分$v_1$,并要求$u_1$与$v_1$相关程度达到最大。 然后建立因变量$y_1,\ldots,y_p$与$u_1$的回归,重复这个过程直到提取到足够的指定的成分。
计算步骤
先将$X与Y$标准化 $$ A = \begin{bmatrix} x_{11} & \cdots & x_{1m}\ \vdots & & \vdots \ x_{n1} & \cdots & x_{nm} \end{bmatrix} B = \begin{bmatrix} y_{11} & \cdots & y_{1m}\ \vdots & & \vdots \ y_{n1} & \cdots & y_{nm} \end{bmatrix} $$
第一步
- 分别提取两组($X与Y$变量的第一对成分,并使之相关性达到最大 假设从两组变量中第一对成分为$u_1和v_1$,$u_1$是自变量集$X=[x_1,\cdots,x_m]^T$的线性组合,$v_1$是自变量集$X=[y_1,\cdots,y_p]^T$的线性组合 $$ u_1 = \rho_1^T X \ v_1 = \gamma_1^T Y \ $$
为了回归分析的需要,要求
- $u_1和v_1$各自尽可能多地提取所在变量组的变异信息
- $u_1和v_1$的相关程度达到最大
第二步
计算$\rho_1与\gamma_1$
最大化协方差,使得$u_1和v_1$的相关程度达到最大,可以用得分向量$\hat{u_1}和\hat{v_1}$的內积来计算 $$ \max <\hat{u_1},\hat{v_1}> = \rho_1^T A B \gamma_1 \ s.t. \begin{cases} \rho_1^T \rho_1 = 1 \ \gamma_1^T \gamma_1 = 1 \ \end{cases} $$
采用Lagrange乘数法,问题化为求单位向量$\rho_1和\gamma_1$,使$\theta_1 = \rho_1^T A B \gamma_1$达到最大,问题求解只需计算$M=A^TBB^TA$的特征值与特征向量,且$M$的最大特征值为$\theta_1^2$,相应的特征向量就是所要求解的$\rho_1$,进而也能得到$\gamma_1$ $$ \gamma_1 = \frac{1}{\theta_1}B^TA\rho_1 $$
第三步
由两组变量集的标准化观察数据矩阵$X和Y$,可以计算第一对成分的得分向量,记为$\hat{u_1}和\hat{v_1}$ $$ \hat{u_1} = A \rho_1 \ \hat{v_1} = B \gamma_1 \ $$
建立$y_1,\cdots,y_p$对$u_1$的回归及$x_1,\cdots,x_m$对$u_1$的回归,假定回归模型 $$ \begin{cases} A = \hat{u_1}\sigma_1^{T} + A_1 \ B = \hat{u_1}\tau_1^{T} + B_1 \ \end{cases} $$ 其中,$\sigma_1^{T} = [\sigma_{1},\ldots,\sigma_{m}],\tau_1^{T} = [\tau_{1},\ldots,\tau_{m}]$分别是多对一回归模型中的参数向量,$A_1,B_1$是残差阵
回归系数向量$\sigma_1,\tau_1$的最小二乘估计为 $$ \begin{cases} \sigma_1 = \frac{A^T\hat{u_1}}{||\hat{u_1}||^2} \ \tau_1 = \frac{B^T\hat{u_1}}{||\hat{u_1}||^2} \ \end{cases} $$
用残差阵$A_1和B_1$代替$A,B$,重复以上步骤,直到残差阵中元素的绝对值近似为0,每进行一次得到一个$\sigma_t和\tau_t$,
第四步
重复上面的步骤,得到$r$个成分 $$ \begin{cases} A = \hat{u_1}\sigma_1^{T} + \cdots + \hat{u_r}\sigma_r^{T} + A_r \ B = \hat{u_1}\tau_1^{T} + \cdots + \hat{u_r}\tau_r^{T} + B_r \ \end{cases} $$
将$u_1 = \rho_1^T X$代入$Y=\hat{u_1}\tau_1^{T} + \cdots + \hat{u_r}\tau_r^{T}$,即得$P$个因变量的偏最小二乘回归方程式 $$ y_j = c_{j1}x_1 + \ldots + c_{jm}x_m, j= 1,2,\ldots,p $$
交叉有效性检验
应该提取多个个成分,可以使用交叉有效性检验
每次舍去第$i$个观察数据,对余下的$n-1$个观测数据用偏最小二乘回归方法,并考虑抽取$h(h\leq r)$个肠粉后拟合的回归式,然后把舍去的自变量组第$j$个观测数据代入所拟合的回归方程式,得到$y_j(j=1,2,\cdots,p)$在第$i$观测点上的预测值为$\hat{b_{(i)j}}(h)$
对$i=1,2,\ldots,n$重复以上的验证,即得抽取$h$个成分时第$j$个因变量$y_j(j=1,2,\ldots,p)$的预测误差平方和为 $$ PRESS_j(h) = \sum_{i=1}^n(b_{(i)j}-\hat{b}_{(i)j}(h))^2,j=1,2,\ldots,p $$ $Y$的预测误差平方和为 $$ PRESS(h) = \sum_{i=1}^pPRESS_j(h) $$
另外,再采用所有的样本点,拟合含$h$个成分的回归方程。这时,记第$i$个样本点的预测值为$\hat{b}_{ij}(h)$,则可以定义$y_j$的误差平方和为 $$ SS_j(h) = \sum_{i=1}^n(b_{ij}-\hat{b}_{ij}(h))^2 $$ 定义 $h$成分的误差平方和 $$ SS(h) = \sum_{j=1}^p SS_j(h) $$
当$PRESS(h)$达到最小值时,对应的$h$即为所求的成分$l$个数。通常,总有$PRESS(h) > SS(h)$,而$SS(h) < SS(h-1)$。因此在提取成分时,总是希望$\frac{PRESS(h)}{SS(h-1)}$越小于好,一般可以设定阈值为0.05,判定规则为,当 $$ \frac{PRESS(h)}{SS(h-1)} \leq (1-0.05)^2 $$ 时,新加成分对回归改善是有帮助的
因此,可以定义交叉有效性 $$ Q_h^2 = 1 - \frac{PRESS(h)}{SS(h-1)} $$ 在每一步计算结束前,计算交叉有效性,在第$h$步有$\hat{Q_h^2} < 1 - 0.95^2$,则模型到达精度,可以停止提取成分
python实现
from sklearn.cross_decomposition import PLSRegression
pls = PLSRegression(n_compoents=k)
pls.fit(X,Y)
y_pred = pls.predict(X_test)