DataWhale第23期组队集成学习上-Task3

(!tips:依旧是蓝色字有转跳惊喜)

优化基础模型

​ 在回归问题的基本算法中,我们使用数据集去估计模型的参数,如回归模型中的参数 w w w,那么这个数据集,我们称为训练数据集,简称训练集

​ 我们希望建立的机器学习模型在位置且复杂的测试数据上表现优异,而将未出现在训练集的未知数据集成为测试数据集,简称测试集

​ 在回归问题中使用训练集估计模型的参数,一般原则都是使得我们的损失函数在训练集达到最小值,其实在实际问题中是可以让损失函数在训练集最小化为0,如:

​ 线性回归中,将加入非常多的高次项,使得我们模型在训练集的每个数据点都恰好位于曲线上,那这时模型在训练集的损失值也就是误差为0。

在这里插入图片描述

1. 训练均方误差与测试均方误差

​ 在回归中,最常用的评价指标为均方误差。它是参数估计值和实际值的差平方的期望值,是反映估计量与真实值之间的差异度的一种度量。计算公式:
M E S = 1 N ∑ i = 1 N ( y i − f ^ ( x i ) ) 2 MES=\frac{1}{N}\sum\limits_{i=1}^{N}(y_i -\hat{ f}(x_i))^2 MES=N1i=1N(yif^(xi))2
​ 其中, f ^ ( x i ) \hat{ f}(x_i) f^(xi)是*样本 x i x_i xi应用建立的模型 f ^ \hat{f} f^*预测的结果。

​ 而我们所用的数据是训练集的数据,那么这个误差就是训练均方误差;若使用的是测试集数据计算的均方误差,就是测试均方误差

​ 我们一般在意的是模型面对未知的样本集,即测试集上的测试误差,目标是使得我们建立的模型在测试集上的测试误差最小

​ 在模型建立阶段,是不能拿到未知且真实的测试数据来验证模型。在这种情况下,一些观点认为通过训练误差最小化来选择模型也是可行的。但这种方法是具有致命弱点的,那就是:在一个模型训练均方误差最小时,不能保证测试均方误差也很小。对于这种想法构造的模型,一般在训练误差达到最小时,测试均方误差很大

在这里插入图片描述

在这里插入图片描述

​ 由图可知,当模型的训练均方误差很小,测试均方误差反而很大。但我们需要的是测试均方误差达到最小时对应的模型,因此通过训练误差最小化来选择模型是不行的。

​ 而上方右图所示,模型在训练误差很小,但测试均方误差很大时,这种情况就是模型的过拟合

1.1 过拟合

把训练样本自身的一些特点当做所有潜在样本都会具有的一般性质,这样会导致泛化性能下降,在机器学习中,称之为过拟合

​ 与过拟合相对的有欠拟合,它是指对训练样本的一般性质尚未学好,具体表现就是最终模型在训练集上效果好、在测试集上效果差,模型泛化能力弱

在这里插入图片描述

过拟合问题产生原因

  1. 使用模型较复杂,学习能力过强;
  2. 有噪声存在;
  3. 数据量有限。

解决过拟合的方法:

  1. 提前终止(当验证集上的效果变差时候);
  2. 数据集扩增;
  3. 寻找最优参数。

1.1.1 提前终止

提前终止是一种将迭代次数截断来防止过拟合的方法,即在模型对训练数据集迭代收敛之前停止迭代来防止过拟合。

​ 提前终止方法的具体做法:在每个Epoch结束时(一个Epoch为对所有的训练数据的一轮遍历)计算验证数据的精度当精度不再提高时,就停止训练。一般的做法:在训练过程中,记录到目前为止最好的精度,当连续10次Epoch(或更多次没达到最佳精度,则可认为精度不再提高,此时可以停止迭代。

1.1.2 数据集扩增

​ 在数据挖掘领域流行一句话,”有时候更多的数据胜过拥有一个好的模型“。因为我们使用训练数据训练模型,再通过这个模型对将来的数据进行拟合。而在这之间又有一个假设,训练数据与将来的数据是独立同分布的。即使用当前的训练数据对将来的数据进行估计和模拟,而拥有更多的数据往往使估计与模拟更加准确。但往往条件受限而导致收集不了更多的数据,因此会采用一些计算方式与策略在已有的数据集上进行处理,以得到更多的数据。

1.1.3 寻找最优参数

寻找最优参数方法选择适合的学习算法和超参数,以使得偏差和方差都尽可能的低。通俗地理解,可以认为一个模型最优的参数意味着模型的复杂度更低。


2. 偏差 - 方差的权衡

​ 由前方的测试均方误差曲线可看出,测试均方误差曲线呈U型曲线,这表明测试误差曲线中有两种力量在博弈,可证明:
E ( y 0 − f ^ ( x 0 ) ) 2 = Var ⁡ ( f ^ ( x 0 ) ) + [ Bias ⁡ ( f ^ ( x 0 ) ) ] 2 + Var ⁡ ( ε ) E\left(y_{0}-\hat{f}\left(x_{0}\right)\right)^{2}=\operatorname{Var}\left(\hat{f}\left(x_{0}\right)\right)+\left[\operatorname{Bias}\left(\hat{f}\left(x_{0}\right)\right)\right]^{2}+\operatorname{Var}(\varepsilon) E(y0f^(x0))2=Var(f^(x0))+[Bias(f^(x0))]2+Var(ε)
​ 也就是,可以将测试均方误差的期望值分解为** f ^ ( x 0 ) \hat{f}(x_0) f^(x0)的方差**、 f ^ ( x 0 ) \hat{f}(x_0) f^(x0)的偏差平方和误差项 ε \varepsilon ε的方差

​ 为了使模型的测试均方误差达到最小值,也就是同时最小化偏差的平方和方差。因此我们称 Var ⁡ ( ε ) \operatorname{Var}(\varepsilon) Var(ε)建模任务的难度,这个量在我们的任务确定后是无法改变的,也叫作不可约误差

2.1 模型的方差

模型方差就是用不同的数据集去估计 f f f时,估计函数的该变量

下面是举例子:

我们想要建立一个线性回归模型,可以通过输入中国人身高去预测我们的体重。但是显然我们没有办法把全中国13亿人做一次人口普查,拿到13亿人的身高体重去建立模型。我们能做的就是从13亿中抽1000个样本进行建模,我们对这个抽样的过程重复100遍,就会得到100个1000人的样本集。我们使用线性回归模型估计参数,就能得到100个线性回归模型。

​ 由于样本抽样具有随机性,我们将得到100个模型不可能参数完全一样,那么这100个模型之间的差异就是方差。而我们希望得到一个稳定的模型,也就是在不同的样本集估计的模型都不会相差太大,即要求 f f f方差越小越好。一般来说,模型复杂度越高, f f f的方差会越大在这里插入图片描述

2.2 模型的偏差

模型的偏差是指选择一个简单的模型去估计真实函数所带入的误差。假如真实数据X与Y的关系是二次关系,但我们选择线性模型进行建模,由于模型复杂度引起的这种误差,就称为偏差,它的构成是复杂的。偏差度量了学习算法的期望预测与真实结果的偏离程度,即刻画了学习算法本身的拟合能力

偏差度量单个模型的学习能力,而方差度量同一个模型在不同数据集上的稳定性

2.3 偏差 - 方差的权衡

​ “偏差 - 方差分解”说明::泛化性能是由学习算法的能力、数据的充分性以及学习任务本身的难度所共同决定的。给定的学习任务,为取得更好的泛化性能,则需使偏差较小,即能够充分拟合数据,且使方差较小,即使得数据扰动产生的影响小。

在这里插入图片描述

​ 一般而言,增加模型的复杂度,会增加模型的方差,但会减少模型的偏差,我们需要找到一个偏差 - 方差的权衡,使得测试误差最小。在这里插入图片描述

3. 特征提取

​ 因此,我们现在的目标是要选择一个测试误差达到最小的模型,但实际上我们很难对实际的测试误差做精确计算,因此我们需要对测试误差进行估计。估计方法有两种:训练误差修正和交叉检验。

3.1 训练误差修正

模型越复杂,训练误差越小,测试误差先减后增。因此,我们先构造一个特征较多的模型使其过拟合,此时训练误差很小而测试误差很大,那这时我们加入关于特征个数的惩罚。因此,当我们的训练误差随着特征个数的增加而减少时,惩罚项因为特征数量的增加而增大,抑制了训练误差随着特征个数的增加而无休止地减小。

具体的数学量如下:

  • C p = 1 N ( R S S + 2 d σ ^ 2 ) C_p = \frac{1}{N}(RSS + 2d\hat{\sigma}^2) Cp=N1(RSS+2dσ^2),其中d为模型特征个数
  • R S S = ∑ i = 1 N ( y i − f ^ ( x i ) ) 2 RSS = \sum\limits_{i=1}^{N}(y_i-\hat{f}(x_i))^2 RSS=i=1N(yif^(xi))2 σ ^ 2 \hat{\sigma}^2 σ^2为模型预测误差的方差的估计值,即残差的方差。
  • AIC赤池信息量准则: A I C = 1 d σ ^ 2 ( R S S + 2 d σ ^ 2 ) AIC = \frac{1}{d\hat{\sigma}^2}(RSS + 2d\hat{\sigma}^2) AIC=dσ^21(RSS+2dσ^2)
  • BIC贝叶斯信息量准则: B I C = 1 n ( R S S + l o g ( n ) d σ ^ 2 ) BIC = \frac{1}{n}(RSS + log(n)d\hat{\sigma}^2) BIC=n1(RSS+log(n)dσ^2)

3.2 交叉验证

​ 对训练误差修正得到测试误差的估计是间接方法,这种方法的桥梁是训练误差,而交叉验证则是对测试误差的直接估计

​ 交叉验证比训练误差修正的优势在于:能够给出测试误差的一个直接估计。

交叉验证是指将数据集D划分为k个大小相似的互斥子集,即 D = D i ∪ D 2 ∪ . . . ∪ D k D=D_i \cup D_2 \cup ... \cup D_k D=DiD2...Dk,其中 D i ∩ D j D_i \cap D_j DiDj非空且 i ≠ j i \neq j i=j。每个子集 D i D_i Di都尽可能保持数据分布的一致性,即从D中通过分层采样得到

K折交叉验证:每次用 k − 1 k-1 k1子集的并集作为训练集余下的子集作为测试集;这样就可以获得k组训练/测试集,从而可以进行k次训练和测试,最终返回的是这k个测试结果的均值

C V ( K ) = 1 K ∑ i = 1 K M S E i CV_{(K)} = \frac{1}{K}\sum\limits_{i=1}^{K}MSE_i CV(K)=K1i=1KMSEi。5折交叉验证如下图:(蓝色的是训练集,黄色的是验证集)

在这里插入图片描述

​ 在测试误差能够被合理地估计出来后,我们做特征选择的目标是从p个特征中选m个特征,使得对应模型的测试误差最小。对应方法有最优子集选择和向前逐步选择。

3.2.1 最优子集选择
  1. 记不含任何特征的模型为 M 0 M_0 M0,计算这个 M 0 M_0 M0的测试误差。
  2. M 0 M_0 M0基础上增加一个变量,计算p个模型的RSS,选择RSS最小的模型记作 M 1 M_1 M1,并计算该模型 M 1 M_1 M1的测试误差。
  3. 再增加变量,计算p-1个模型的RSS,并选择RSS最小的模型记作 M 2 M_2 M2,并计算该模型 M 2 M_2 M2的测试误差。
  4. 重复以上过程知道拟合的模型有p个特征为止,并选择p+1个模型 { M 0 , M 1 , . . . , M p } \{M_0,M_1,...,M_p \} {M0,M1,...,Mp}中测试误差最小的模型作为最优模型。
3.2.2 向前逐步选择

​ 最优子集选择虽然在原理上很直观,但是随着数据特征维度p的增加,子集的数量为 2 p 2^p 2p,计算效率非常低下且需要的计算内存也很高,在大数据的背景下显然不适用。因此,我们需要把最优子集选择的运算效率提高。

​ 向前逐步选择算法的过程如下:

  1. 记不含任何特征的模型为 M 0 M_0 M0,计算这个 M 0 M_0 M0的测试误差。
  2. M 0 M_0 M0基础上增加一个变量,计算p个模型的RSS,选择RSS最小的模型记作 M 1 M_1 M1,并计算该模型 M 1 M_1 M1的测试误差。
  3. 在最小的RSS模型下继续增加一个变量,选择RSS最小的模型记作 M 2 M_2 M2,并计算该模型 M 2 M_2 M2的测试误差。
  4. 以此类推,重复以上过程知道拟合的模型有p个特征为止,并选择p+1个模型 { M 0 , M 1 , . . . , M p } \{M_0,M_1,...,M_p \} {M0,M1,...,Mp}测试误差最小的模型作为最优模型。

​ 它是属于一种贪心算法,即每一步都尽可能减少误差。一开始将所有的权重都设置为1,然后每一步所做的决策是对某个权重增加或减少一个很小的值。它的相关伪代码如下:

数据标准化,使其分布满足0均值和单位方差
在每轮迭代过程中:
	设置当前最小误差LowestError为正无穷
	对每个特征:
		增大或减少;
			改变一个系数得到一个新的w
			计算新w下的误差
			如果误差Error小于当前最小误差LowestError:设置Wbest等于当前的W
		将w设置为新的Wbest

3.3 压缩估计(正则化)

​ 除了刚刚讨论的直接对特征自身进行选择以外,我们还可以对回归的系数进行约束或者加罚的技巧对p个特征的模型进行拟合,显著降低模型方差,这样也会提高模型的拟合效果。具体来说,就是将回归系数往零的方向压缩,这也就是为什么叫压缩估计的原因了。

岭回归Lasso都是通过在损失函数中加入正则化项来实现的,三者的损失函数对比:

  • 线性回归的损失函数:

J ( w ) = ∑ i = 1 m ( y i − f ( x i ) ) 2 = ∣ ∣ y − X w ∣ ∣ 2 J(w) =\sum\limits_{i=1}^{m}(y_i-f(x_i))^2 = || y-X_w||^2 J(w)=i=1m(yif(xi))2=yXw2

  • 岭回归的损失函数:

J ( w ) = ∑ i = 1 m ( y i − f ( x i ) ) 2 + λ ∑ i = 1 m w i 2 = ∣ ∣ y − X w ∣ ∣ 2 + λ ∣ ∣ w ∣ ∣ 2 J(w)=\sum\limits_{i=1}^{m}(y_i-f(x_i))^2+\lambda\sum\limits_{i=1}^{m}w_i^2=|| y-X_w||^2+\lambda||w||^2 J(w)=i=1m(yif(xi))2+λi=1mwi2=yXw2+λw2

  • Lasso回归的损失函数:

J ( w ) = ∑ i = 1 m ( y i − f ( x i ) ) 2 + λ ∑ i = 1 m ∣ w i ∣ = ∣ ∣ y − X w ∣ ∣ 2 + λ ∣ ∣ w ∣ ∣ 1 2 J(w)=\sum\limits_{i=1}^{m}(y_i-f(x_i))^2+\lambda\sum\limits_{i=1}^{m}|w_i|=|| y-X_w||^2+\lambda||w||_1^2 J(w)=i=1m(yif(xi))2+λi=1mwi=yXw2+λw12

其中, ∣ ∣ ⋅ ∣ ∣ ||·|| 表示2-范数, ∣ ∣ ⋅ ∣ ∣ 1 ||·||_1 1表示1-范数。

3.3.1 岭回归(L2正则化的例子)

​ 在线性回归中,我们的损失函数为 J ( w ) = ∑ i = 1 N ( y i − w 0 − ∑ j = 1 p w j x i j ) 2 J(w) = \sum\limits_{i=1}^{N}(y_i-w_0-\sum\limits_{j=1}^{p}w_jx_{ij})^2 J(w)=i=1N(yiw0j=1pwjxij)2,我们在线性回归的损失函数的基础上添加对系数的约束或者惩罚,即:
J ( w ) = ∑ i = 1 N ( y i − w 0 − ∑ j = 1 p w j x i j ) 2 + λ ∑ j = 1 p w j 2 ,      其 中 , λ ≥ 0 w ^ = ( X T X + λ I ) − 1 X T Y J(w) = \sum\limits_{i=1}^{N}(y_i-w_0-\sum\limits_{j=1}^{p}w_jx_{ij})^2 + \lambda\sum\limits_{j=1}^{p}w_j^2,\;\;其中,\lambda \ge 0\\ \hat{w} = (X^TX + \lambda I)^{-1}X^TY J(w)=i=1N(yiw0j=1pwjxij)2+λj=1pwj2,λ0w^=(XTX+λI)1XTY
调节参数 λ \lambda λ的大小是影响压缩估计的关键, λ \lambda λ越大,惩罚的力度越大,系数则越趋近于0,反之,选择合适的 λ \lambda λ对模型精度来说十分重要。岭回归通过牺牲线性回归的无偏性降低方差,有可能使得模型整体的测试误差较小,提高模型的泛化能力。

​ 岭回归最先用来处理特征数多于样本数的情况,现在也用于在估计中加入偏差,从而得到更好的估计。这里通过引用 λ \lambda λ来限制所有w之和,通过引入惩罚项,能够减少不重要的参数,这个技术在统计学中也叫做缩减

3.3.2 Lasso回归(L1正则化的例子)

​ 回归的一个很显著的特点是:将模型的系数往零的方向压缩,但是岭回归的系数只能趋于0但无法等于0,换句话说,就是无法做特征选择。能否使用压缩估计的思想做到像特征最优子集选择那样提取出重要的特征呢?答案是肯定的!我们只需要对岭回归的优化函数做小小的调整就行了,我们使用系数向量的L1范数替换岭回归中的L2范数:
J ( w ) = ∑ i = 1 N ( y i − w 0 − ∑ j = 1 p w j x i j ) 2 + λ ∑ j = 1 p ∣ w j ∣ ,      其 中 , λ ≥ 0 J(w) = \sum\limits_{i=1}^{N}(y_i-w_0-\sum\limits_{j=1}^{p}w_jx_{ij})^2 + \lambda\sum\limits_{j=1}^{p}|w_j|,\;\;其中,\lambda \ge 0 J(w)=i=1N(yiw0j=1pwjxij)2+λj=1pwj,λ0
为什么Losso能做到特征选择而岭回归却不能做到呢?(如图:左边为lasso,右边为岭回归)

在这里插入图片描述

椭圆形曲线为RSS等高线,菱形和圆形区域分别代表了L1和L2约束,Lsaao回归和岭回归都是在约束下的回归,因此最优的参数为椭圆形曲线与菱形和圆形区域相切的点。但是Lasso回归的约束在每个坐标轴上都有拐角,因此当RSS曲线与坐标轴相交时恰好回归系数中的某一个为0,这样就实现了特征提取。反观岭回归的约束是一个圆域,没有尖点,因此与RSS曲线相交的地方一般不会出现在坐标轴上,因此无法让某个特征的系数为0,因此无法做到特征提取。

4. 降维

到目前为止,我们所讨论的方法对方差的控制有两种方式:一种是使用原始变量的子集,另一种是将变量系数压缩至零。但是这些方法都是基于原始特征 x 1 , . . . , x p x_1,...,x_p x1,...,xp得到的。

​ 现在我们探讨一类新的方法:将原始的特征空间投影到一个低维的空间实现变量的数量变少,如:将二维的平面投影至一维空间。机器学习领域中所谓的降维就是指采用某种映射方法,将原高维空间中的数据点映射到低维度的空间中

​ 降维的本质是学习一个映射函数 f : x->y,其中x是原始数据点的表达,目前最多使用向量表达形式。 y是数据点映射后的低维向量表达,通常y的维度小于x的维度(当然提高维度也是可以的)。f可能是显式的或隐式的、线性的或非线性的。

​ 目前大部分降维算法处理向量表达的数据,也有一些降维算法处理高阶张量表达的数据。之所以使用降维后的数据表示是因为在原始的高维空间中,包含有冗余信息以及噪音信息,在实际应用例如图像识别中造成了误差,降低了准确率;而通过降维,我们希望减少 冗余信息 所造成的误差,提高识别(或其他应用)的精度。又或者希望通过降维算法来寻找数据内部的本质结构特征。在很多算法中,降维算法成为了数据预处理的一部分,如主成分分析PCA。事实上,有一些算法如果没有降维预处理,其实是很难得到很好的效果的。 (摘自:rosenor1博客)

​ 也还会有另一种降维技术是因子分析。在因子分析中,将会假设观察数据的生成中有一些观察不到的隐变量。假设观察数据是这些隐变量和某些噪声的线性组合,那么隐变量的数据可能比观察数据的数目少,也就是通过找到隐变量就可以实现数据的降维。因子分析已经应用于社会科学、金融和其他领域中。

​ 还有一种降维技术是独立成分分析(ICA)。它是假设数据从N个数据源生成的,这里和因子分析有些类似。假设数据为多个数据源的混合观察结果,这些数据源之间在统计上是相互独立的,而在PCA中只假设数据不相关。跟因子分析一样,若数据源的数目少于观察数据的数目,就可以实现降维过程。

4.1 主成分分析(PCA)

​ 在主成分分析(PCA)中,数据从原来的坐标系转换到了新的坐标系,新的坐标系的选择是由数据本身决定的。第一个新坐标轴选择的是原始数据中方差最大的方向,第二个新坐标轴的选择和第一个坐标轴正交且具有最大方差的方向。该过程一直重复,重复次数为原始数据中特征的数目

  • **优点:**降低数据的复杂性,识别最重要的多个特征;

  • 缺点:不一定需要,且可能损失有用信息

  • 使用数值型数据。

    主成分分析的思想:通过最大投影方差 将原始空间进行重构,即由特征相关重构为无关,即落在某个方向上的点(投影)的方差最大。在进行下一步推导之前,我们先把样本均值和样本协方差矩阵推广至矩阵形式:

    样本均值Mean: x ˉ = 1 N ∑ i = 1 N x i = 1 N X T 1 N ,        其 中 1 N = ( 1 , 1 , . . . , 1 ) N T \bar{x} = \frac{1}{N}\sum\limits_{i=1}^{N}x_i = \frac{1}{N}X^T1_N,\;\;\;其中1_N = (1,1,...,1)_{N}^T xˉ=N1i=1Nxi=N1XT1N,1N=(1,1,...,1)NT
    样本协方差矩阵 S 2 = 1 N ∑ i = 1 N ( x i − x ˉ ) ( x i − x ˉ ) T = 1 N X T H X ,        其 中 , H = I N − 1 N 1 N 1 N T S^2 = \frac{1}{N}\sum\limits_{i=1}^{N}(x_i-\bar{x})(x_i-\bar{x})^T = \frac{1}{N}X^THX,\;\;\;其中,H = I_N - \frac{1}{N}1_N1_N^T S2=N1i=1N(xixˉ)(xixˉ)T=N1XTHX,H=INN11N1NT

    最大投影方差的步骤:
    (i) 中心化: x i − x ˉ x_i - \bar{x} xixˉ
    (ii) 计算每个点 x 1 , . . . , x N x_1,...,x_N x1,...,xN u ⃗ 1 \vec{u}_1 u 1方向上的投影: ( x i − x ˉ ) u ⃗ 1 ,        ∣ ∣ u ⃗ 1 ∣ ∣ = 1 (x_i-\bar{x})\vec{u}_1,\;\;\;||\vec{u}_1|| = 1 (xixˉ)u 1,u 1=1

    (iii) 计算投影方差: J = 1 N ∑ i = 1 N [ ( x i − x ˉ ) T u ⃗ 1 ] 2 ,        ∣ ∣ u ⃗ 1 ∣ ∣ = 1 J = \frac{1}{N}\sum\limits_{i=1}^{N}[(x_i-\bar{x})^T\vec{u}_1]^2,\;\;\;||\vec{u}_1|| = 1 J=N1i=1N[(xixˉ)Tu 1]2,u 1=1

    (iv) 最大化投影方差求 u ⃗ 1 \vec{u}_1 u 1
    u ˉ 1 = a r g m a x u 1      1 N ∑ i = 1 N [ ( x i − x ˉ ) T u ⃗ 1 ] 2        s . t . u ⃗ 1 T u ⃗ 1 = 1 ( u ⃗ 1 往 后 不 带 向 量 符 号 ) \bar{u}_1 = argmax_{u_1}\;\;\frac{1}{N}\sum\limits_{i=1}^{N}[(x_i-\bar{x})^T\vec{u}_1]^2 \\ \;\;\;s.t. \vec{u}_1^T\vec{u}_1 = 1 (\vec{u}_1往后不带向量符号) uˉ1=argmaxu1N1i=1N[(xixˉ)Tu 1]2s.t.u 1Tu 1=1(u 1)
    得到:
    J = 1 N ∑ i = 1 N [ ( x i − x ˉ ) T u ⃗ 1 ] 2 = 1 N ∑ i = 1 N [ u 1 T ( x i − x ˉ ) ( x i − x ˉ ) T u 1 ]    = u 1 T [ 1 N ∑ i = 1 N ( x i − x ˉ ) ( x i − x ˉ ) T ] u 1 = u 1 T S 2 u 1 J = \frac{1}{N}\sum\limits_{i=1}^{N}[(x_i-\bar{x})^T\vec{u}_1]^2 = \frac{1}{N}\sum\limits_{i=1}^{N}[u_1^T(x_i-\bar{x})(x_i-\bar{x})^Tu_1]\\ \; = u_1^T[\frac{1}{N}\sum\limits_{i=1}^{N}(x_i-\bar{x})(x_i - \bar{x})^T]u_1 = u_1^TS^2u_1 J=N1i=1N[(xixˉ)Tu 1]2=N1i=1N[u1T(xixˉ)(xixˉ)Tu1]=u1T[N1i=1N(xixˉ)(xixˉ)T]u1=u1TS2u1
    即:
    u ^ 1 = a r g m a x u 1 u 1 T S 2 u 1 ,        s . t . u 1 T u 1 = 1 L ( u 1 , λ ) = u 1 T S 2 u 1 + λ ( 1 − u 1 T u 1 ) ∂ L ∂ u 1 = 2 S 2 u 1 − 2 λ u 1 = 0 即 : S 2 u 1 = λ u 1 \hat{u}_1 = argmax_{u_1}u_1^TS^2u_1,\;\;\;s.t.u_1^Tu_1 = 1\\ L(u_1,\lambda) = u_1^TS^2u_1 + \lambda (1-u_1^Tu_1)\\ \frac{\partial L}{\partial u_1} = 2S^2u_1-2\lambda u_1 = 0\\ 即:S^2u_1 = \lambda u_1 u^1=argmaxu1u1TS2u1,s.t.u1Tu1=1L(u1,λ)=u1TS2u1+λ(1u1Tu1)u1L=2S2u12λu1=0S2u1=λu1
    可以看到: λ \lambda λ S 2 S^2 S2的特征值, u 1 u_1 u1 S 2 S^2 S2的特征向量。因此我们只需要对中心化后的协方差矩阵进行特征值分解,得到的特征向量即为投影方向。如果需要进行降维,那么只需要取p的前M个特征向量即可。

5. 实例

5.1 特征提取的实例:向前逐步回归

案例来源:https://blog.csdn.net/weixin_44835596/article/details/89763300
根据AIC准则定义向前逐步回归进行变量筛选

#定义向前逐步回归函数
def forward_select(data,target):
    variate=set(data.columns)  #将字段名转换成字典类型
    variate.remove(target)  #去掉因变量的字段名
    selected=[]
    current_score,best_new_score=float('inf'),float('inf')  #目前的分数和最好分数初始值都为无穷大(因为AIC越小越好)
    #循环筛选变量
    while variate:
        aic_with_variate=[]
        for candidate in variate:  #逐个遍历自变量
            formula="{}~{}".format(target,"+".join(selected+[candidate]))  #将自变量名连接起来
            aic=ols(formula=formula,data=data).fit().aic  #利用ols训练模型得出aic值
            aic_with_variate.append((aic,candidate))  #将第每一次的aic值放进空列表
        aic_with_variate.sort(reverse=True)  #降序排序aic值
        best_new_score,best_candidate=aic_with_variate.pop()  #最好的aic值等于删除列表的最后一个值,以及最好的自变量等于列表最后一个自变量
        if current_score>best_new_score:  #如果目前的aic值大于最好的aic值
            variate.remove(best_candidate)  #移除加进来的变量名,即第二次循环时,不考虑此自变量了
            selected.append(best_candidate)  #将此自变量作为加进模型中的自变量
            current_score=best_new_score  #最新的分数等于最好的分数
            print("aic is {},continuing!".format(current_score))  #输出最小的aic值
        else:
            print("for selection over!")
            break
    formula="{}~{}".format(target,"+".join(selected))  #最终的模型式子
    print("final formula is {}".format(formula))
    model=ols(formula=formula,data=data).fit()
    return(model)
import statsmodels.api as sm #最小二乘
from statsmodels.formula.api import ols #加载ols模型
forward_select(data=boston_data,target="Price")
aic is 3286.974956900157,continuing!
aic is 3171.5423142992013,continuing!
aic is 3114.0972674193326,continuing!
aic is 3097.359044862759,continuing!
aic is 3069.438633167217,continuing!
aic is 3057.9390497191152,continuing!
aic is 3048.438382711162,continuing!
aic is 3042.274993098419,continuing!
aic is 3040.154562175143,continuing!
aic is 3032.0687017003256,continuing!
aic is 3021.726387825062,continuing!
for selection over!
final formula is Price~LSTAT+RM+PTRATIO+DIS+NOX+CHAS+B+ZN+CRIM+RAD+TAX

<statsmodels.regression.linear_model.RegressionResultsWrapper at 0x16b15545fd0>
lm=ols("Price~LSTAT+RM+PTRATIO+DIS+NOX+CHAS+B+ZN+CRIM+RAD+TAX",data=boston_data).fit()
lm.summary()
OLS Regression Results
Dep. Variable:Price R-squared: 0.741
Model:OLS Adj. R-squared: 0.735
Method:Least Squares F-statistic: 128.2
Date:Sun, 14 Mar 2021 Prob (F-statistic):5.54e-137
Time:20:49:31 Log-Likelihood: -1498.9
No. Observations: 506 AIC: 3022.
Df Residuals: 494 BIC: 3072.
Df Model: 11
Covariance Type:nonrobust
coefstd errtP>|t|[0.0250.975]
Intercept 36.3411 5.067 7.171 0.000 26.385 46.298
LSTAT -0.5226 0.047 -11.019 0.000 -0.616 -0.429
RM 3.8016 0.406 9.356 0.000 3.003 4.600
PTRATIO -0.9465 0.129 -7.334 0.000 -1.200 -0.693
DIS -1.4927 0.186 -8.037 0.000 -1.858 -1.128
NOX -17.3760 3.535 -4.915 0.000 -24.322 -10.430
CHAS 2.7187 0.854 3.183 0.002 1.040 4.397
B 0.0093 0.003 3.475 0.001 0.004 0.015
ZN 0.0458 0.014 3.390 0.001 0.019 0.072
CRIM -0.1084 0.033 -3.307 0.001 -0.173 -0.044
RAD 0.2996 0.063 4.726 0.000 0.175 0.424
TAX -0.0118 0.003 -3.493 0.001 -0.018 -0.005
Omnibus:178.430 Durbin-Watson: 1.078
Prob(Omnibus): 0.000 Jarque-Bera (JB): 787.785
Skew: 1.523 Prob(JB): 8.60e-172
Kurtosis: 8.300 Cond. No. 1.47e+04


Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 1.47e+04. This might indicate that there are
strong multicollinearity or other numerical problems.

5.2 岭回归实例分享

sklearn.linear_model.ridge_regression(X, y, alpha, *, sample_weight=None, solver=‘auto’, max_iter=None, tol=0.001, verbose=0, random_state=None, return_n_iter=False, return_intercept=False, check_input=True)

  • 参数:
    alpha:较大的值表示更强的正则化。浮点数
    sample_weight:样本权重,默认无。
    solver:求解方法,{‘auto’, ‘svd’, ‘cholesky’, ‘lsqr’, ‘sparse_cg’, ‘sag’, ‘saga’}, 默认=’auto’。“ svd”使用X的奇异值分解来计算Ridge系数。'cholesky’使用标准的scipy.linalg.solve函数通过dot(XT,X)的Cholesky分解获得封闭形式的解。'sparse_cg’使用scipy.sparse.linalg.cg中的共轭梯度求解器。作为一种迭代算法,对于大规模数据(可能设置tol和max_iter),此求解器比“ Cholesky”更合适。 lsqr”使用专用的正则化最小二乘例程scipy.sparse.linalg.lsqr。它是最快的,并且使用迭代过程。“ sag”使用随机平均梯度下降,“ saga”使用其改进的无偏版本SAGA。两种方法都使用迭代过程,并且当n_samples和n_features都很大时,通常比其他求解器更快。请注意,只有在比例大致相同的要素上才能确保“ sag”和“ saga”快速收敛。您可以使用sklearn.preprocessing中的缩放器对数据进行预处理。最后五个求解器均支持密集和稀疏数据。但是,当fit_intercept为True时,仅’sag’和’sparse_cg’支持稀疏输入。
from sklearn import linear_model
reg_rid = linear_model.Ridge(alpha=.5)
reg_rid.fit(X,y)
reg_rid.score(X,y)
0.739957023371629

5.3 Lasso实例分享

class sklearn.linear_model.Lasso(alpha=1.0, *, fit_intercept=True, normalize=False, precompute=False, copy_X=True, max_iter=1000, tol=0.0001, warm_start=False, positive=False, random_state=None, selection=‘cyclic’)

  • 参数:
    alpha:正则化强度,1.0代表标准最小二乘。
    fit_intercept:是否计算模型截距。默认true。

    normalize:是否标准化,默认false。
    positive:是否强制系数为正,默认false。

from sklearn import linear_model
reg_lasso = linear_model.Lasso(alpha = 0.5)
reg_lasso.fit(X,y)
reg_lasso.score(X,y)
0.7140164719858566
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值