集中学习-任务3

优化基础模型

偏差-方差的权衡

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(ε)

  • 任何机器学习算法的预测误差可以分解为三部分,即:偏差误差+方差误差+不可约的误差(对于给定的模型,我们不能进一步减少的误差)。

在这里插入图片描述

  • 偏差(Bias):结果偏离目标位置;
  • 方差(Variance):数据的分布状态,数据分布越集中方差越低,越分散方差越高;
  • 模型在训练误差很小,但是测试均方误差很大时,我们称这种情况叫模型的过拟合

方差与偏差产生的原因

  • 产生偏差的原因
    1. 可能对问题本身的假设不正确;如非线性数据或问题使用线性回归算法。
    2. 欠拟合(underfitting)会产生偏差;
    3. 如果训练数据采用的特征跟问题的相关性不强或者根本没有相关性,就会使模型的预测结果偏离真实的结果。
  • 方差产生的原因
    1. 方差在机器学习中的表现为,数据的一点点扰动都会较大的影响模型,换句话说,模型没有完全学习到问题的实质,而学习到了很多噪音;
    2. 模型太复杂,如高阶的多项式回归
    3. 过拟合(overfitting)会产生方差;

方差误差与偏差误差

  • 偏差误差
    这个误差是由于简单的假设所造成的,因为我们的假设越简单,那么我们的模型更加容易去训练。
    一般而言,参数化算法具有较高的偏差,使得学习速度非常快,而且非常容易去理解,但是通常不太灵活。
    低偏差:对目标函数提出更少的假设;
    高偏差:对目标函数提出更多的假设;
    低偏差模型例子:KNN 和 SVM;
    高偏差模型例子:线性回归和逻辑斯特回归;
  • 方差误差
    1)如果我们使用不同的数据去训练同一个模型,那么最后我们得到的目标函数估计也是会改变的。
    2)目标函数是由机器学习的训练数据所估计得到的,所以我们期望训练数据拥有一定的方差。理想情况下,我们不希望目标函数从一个训练数据集到另一个训练数据集有太大的变化,也就是说我们的算法需要很好的从训练数据中找到一些映射的特征关系,这样可以保证不同训练集都有一个差不多的目标函数。
    低方差:随着训练数据集的变化,对目标函数估计值的变化非常小;
    高方差:随着训练数据集的变化,对目标函数估计值的变化非常大;

一般而言,具有很大灵活性的非参数学习算法都具有很高的方差。

高方差例子:KNN 和 SVM。

总结

  1. 一般而言,增加模型的复杂度,会增加模型的方差,但是会减少模型的偏差,我们要找到一个方
    差–偏差的权衡,使得测试均方误差最。
  2. 参数或者线性的机器学习算法一般都会有一个很高的偏差和一个很低的方差。但是,非参数或者非线性的机器学习算法一般都有一个很低的偏差和一个很高的方差。所有,我们需要在这两者之间找到一个平衡点,来优化我们的算法。

特征提取

测试误差进行估计,估计的方式有两种:训练误差修正与交叉验证。

C p = 1 N ( R S S + 2 d σ ^ 2 ) C_{p}=\frac{1}{N}\left(R S S+2 d \hat{\sigma}^{2}\right) Cp=N1(RSS+2dσ^2)
d为模型特征个数
R S S = ∑ i = 1 N ( y i − f ^ ( x i ) ) 2 , σ ^ 2 R S S=\sum_{i=1}^{N}\left(y_{i}-\hat{f}\left(x_{i}\right)\right)^{2}, \hat{\sigma}^{2} RSS=i=1N(yif^(xi))2,σ^2为模型预测误差的方差的估计值,即残差的方差。

训练误差修正

AIC赤池信息量准则

AIC是衡量统计模型拟合优良性的一种标准,由日本统计学家赤池弘次在1974年提出,它建立在熵的概念上,提供了权衡估计模型复杂度和拟合数据优良性的标准。

A I C = 1 d σ ^ 2 ( R S S + 2 d σ ^ 2 ) A I C=\frac{1}{d \hat{\sigma}^{2}}\left(R S S+2 d \hat{\sigma}^{2}\right) AIC=dσ^21(RSS+2dσ^2)

一般而言,当模型复杂度提高时,似然函数L也会增大,从而使AIC变小,但是复杂度过大时,似然函数增速减缓,导致AIC增大,模型过于复杂容易造成过拟合现象。目标是选取AIC最小的模型,AIC不仅要提高模型拟合度(极大似然),而且引入了惩罚项,使模型参数尽可能少,有助于降低过拟合的可能性。可见AIC准则有效且合理地控制了参数的维数。显然AIC准则追求似然函数尽可能大的同时,复杂度要尽可能的小。

  • AIC赤池信息量准则评价
  1. AIC准则的第一部分是极大似然函数的对数,是从样本信息对总体信息的反映程度即模型拟合情况考虑的;第二部分是对模型复杂度的惩罚,达到满足模型有效性和可靠性条件下参数个数最少。它既考虑了模型的拟合情况,又考虑了复杂度的影响,采用在同等拟合优度条件下参数最少的模型作为估计模型。
  2. AIC准则突破了以往仅从模型拟合情况的评价标准,其出发点是最小化K-L距离(相对熵),需要同时满足有效性、可靠性和经济性。AIC值越小,估计概率分布越接近真实分布。
  3. 大样本条件下,AIC准则中第二部分的惩罚较小,第一项起主导作用,最优模型不收敛于真实情况。

BIC贝叶斯信息量准则

贝叶斯信息准则与AIC相似,用于模型选择,1978年由Schwarz提出。训练模型时,增加参数数量,也就是增加模型复杂度,会增大似然函数,但是也会导致过拟合现象,针对该问题,AIC和BIC均引入了与模型参数个数相关的惩罚项,BIC的惩罚项比AIC的大,考虑了样本数量,样本数量过多时,可有效防止模型精度过高造成的模型复杂度过高。

B I C = 1 n ( R S S + log ⁡ ( n ) d σ ^ 2 ) B I C=\frac{1}{n}\left(R S S+\log (n) d \hat{\sigma}^{2}\right) BIC=n1(RSS+log(n)dσ^2)

BIC相比AIC在大数据量时对模型参数惩罚得更多,导致BIC更倾向于选择参数少的简单模型。

HQ规则选择

以上三种模型选择相关总结,参见
HQ,AIC,BIC模型选择

总结

注意这些规则只是刻画了用某个模型之后相对“真实模型”的信息损失【因为不知道真正的模型是什么样子,所以训练得到的所有模型都只是真实模型的一个近似模型】,所以用这些规则不能说明某个模型的精确度,即三个模型A, B, C,在通过这些规则计算后,我们知道B模型是三个模型中最好的,但是不能保证B这个模型就能够很好地刻画数据,因为很有可能这三个模型都是非常糟糕的,B只是烂苹果中的相对好的苹果而已。

这些规则理论上是比较漂亮的,但是实际在模型选择中应用起来还是有些困难的,例如存在5个变量就有32个变量组合,如果是10个变量呢?2的10次方,我们不可能对所有这些模型进行一一验证AIC, BIC,HQ规则来选择模型,工作量太大。

交叉验证

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

K折交叉验证

所谓K折交叉验证,就是将数据集等比例划分成K份,以其中的一份作为测试数据,其他的K-1份数据作为训练数据。然后,这样算是一次实验,而K折交叉验证只有实验K次才算完成完整的一次,也就是说交叉验证实际是把实验重复做了K次,每次实验都是从K个部分选取一份不同的数据部分作为测试数据(保证K个部分的数据都分别做过测试数据),剩下的K-1个当作训练数据,最后把得到的K个实验结果进行平分。

K折交叉验证算法实现

利用sklearn中进行K折算法,具体过程:
K折算法实例

最优子集选择

在这里插入图片描述

  • 子集选择:从p个预测变量中挑选出与相应变量相关的变量形成子集,再对缩减后的变量使用最小二乘法拟合参数。

  • 最优子集选择:对p个预测变量的所有可能组合分别使用最小二乘法进行拟合,最后在所有可能的模型(共2 p 2^p2 p个)中选出一个最优的模型。

  • 算法计算效率不高,当p增大超过40的时候,这样的方法已经不具备计算可行性。此外,当p很大的时候,从一个巨大搜索空间中得到的model通常会过拟合。

向前逐步选择

在这里插入图片描述

针对子集选择,根据贪心算法的思想,依次添加最大程度增加拟合效果的预测变量或者最小程度影响拟合效果的预测变量。这样的方法也叫做向前和向后逐步选择。

逐步选择算法中,每次选择一个最相关的自变量并计算其系数时,算法并不改变其他自变量的系数,这也与贪心算法的无后效性一致。而逐步回归每次增加一个自变量时,都需要重新进行一次OLS来更新所有的自变量的系数,因此需要经过比p更多次迭代才能达到最终的拟合值。

压缩估计(正则化)

岭回归(L2正则化)

线性回归中的损失函数为 J ( w ) = ∑ i = 1 N ( y i − w 0 − ∑ j = 1 p w j x i j ) 2 J(w)=\sum_{i=1}^{N}\left(y_{i}-w_{0}-\sum_{j=1}^{p} w_{j} x_{i j}\right)^{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 \begin{array}{c} J(w)=\sum_{i=1}^{N}\left(y_{i}-w_{0}-\sum_{j=1}^{p} w_{j} x_{i j}\right)^{2}+\lambda \sum_{j=1}^{p} w_{j}^{2}, \quad \text { 其中 }, \lambda \geq 0 \\ \hat{w}=\left(X^{T} X+\lambda I\right)^{-1} X^{T} Y \end{array} J(w)=i=1N(yiw0j=1pwjxij)2+λj=1pwj2, 其中 ,λ0w^=(XTX+λI)1XTY

调节参数的大小是影响压缩估计的关键,越大,惩罚的力度越大,系数则越趋近于0,反之,选择合适的对模型精度来说十分重要。
岭回归通过牺牲线性回归的无偏性降低方差,有可能使得模型整体的测试误差较小,提高模型的泛化能力。

岭回归的性质
  1. 当岭参数为0,得到最小二乘解。
  2. 当岭参数λ趋向更大时,岭回归系数A估计趋向于0。
  3. 岭回归是回归参数A的有偏估计。它的结果是使得残差平和变大,但是会使系数检验变好。
  4. 在认为岭参数λ是与y无关的常数时,是最小二乘估计的一个线性变换,也是y的线性函数。
  5. 但在实际应用中,由于λ总是要通过数据确定,因此λ也依赖于y、因此从本质上说,并非的线性变换,也非y的线性函数。
    6.对于回归系数向量来说,有偏估计回归系数向量长度<无偏估计回归系数向量长度。即 ∣ θ ( λ ) ∥ < ∥ θ ∥ 0 \mid \theta(\lambda)\|<\| \theta \|_{0} θ(λ)<θ0
  6. 存在某一个λ,使得它所对应的的MSE(估计向量的均方误差)<最小二乘法对应估计向量的的MSE。即 存在λ>0,使得 MSE ⁡ ( θ ( λ ) ) < MSE ⁡ ( θ ) \operatorname{MSE}(\theta(\lambda))<\operatorname{MSE}(\theta) MSE(θ(λ))<MSE(θ)
岭参数的一般选择原则
  1. 各回归系数的岭估计基本稳定;
  2. 用最小二乘估计时符号不合理的回归系数,其岭估计的符号变得合理;
  3. 回归系数没有不合乎实际意义的值;
  4. 残差平方和增大不太多。 一般λ越大,系数β会出现稳定的假象,但是残差平方和也会更大。

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

对岭回归的优化函数做小小的调整就行了,我们使用系数向量的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 ∣ , J(w)=\sum_{i=1}^{N}\left(y_{i}-w_{0}-\sum_{j=1}^{p} w_{j} x_{i j}\right)^{2}+\lambda \sum_{j=1}^{p}\left|w_{j}\right|, \quad J(w)=i=1N(yiw0j=1pwjxij)2+λj=1pwj, 其中 , λ ≥ 0 , \lambda \geq 0 ,λ0

  • 与岭回归相比一个是平方数,一个是绝对值数

二者对比

整体比较

  1. 从求解效率上看: L2损失函数是可导的,L2正则化也是可导的,所以L2正则化是有解析解的,求解的效率高。但是L1正则化在零点处是不可导的,所以它是没有解析解的,如果问题是一个稀疏问题(简单地说就是很多特征的系数为0),那么可以采用稀疏算法求解,如果问题不是稀疏的,那求解的效率就很低了。
  2. 从解的角度看:L2正则化得到不会是稀疏性结果,但是L1正则化可能会得到稀疏结果。
  3. L1正则化的优点在于它可以进行特征选择(由于其结果是稀疏的,即很多变量前的系数为0,那么这些系数为0的变量,就是被淘汰的变量);但是L2正则化则不行。(因为L2正则化的结果不是稀疏的)。所以可以认为L1正则化是一种嵌入式的特征选择方法,其特征选择过程与模型的建立过程融为一体,同时完成。

稀疏性比较

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hdpHgn0K-1616423034181)(attachment:image.png)]

问题:

  1. 什么是稀疏性?
  2. 什么是正则化!
    这几个问题自己一直没有弄懂!

降维

讲的是PCA,这块比较熟悉

实例分析

特征提取-向前逐步回归

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
plt.style.use("ggplot")
import seaborn as sns
from sklearn import datasets
boston = datasets.load_boston() # 返回一个类似于字典的类
X = boston.data
y = boston.target
features = boston.feature_names
boston_data = pd.DataFrame(X,columns=features)
boston_data["Price"] = y
boston_data.head()
CRIMZNINDUSCHASNOXRMAGEDISRADTAXPTRATIOBLSTATPrice
00.0063218.02.310.00.5386.57565.24.09001.0296.015.3396.904.9824.0
10.027310.07.070.00.4696.42178.94.96712.0242.017.8396.909.1421.6
20.027290.07.070.00.4697.18561.14.96712.0242.017.8392.834.0334.7
30.032370.02.180.00.4586.99845.86.06223.0222.018.7394.632.9433.4
40.069050.02.180.00.4587.14754.26.06223.0222.018.7396.905.3336.2
#定义向前逐步回归函数
def forward_select(data,target):
    variate=set(data.columns) #将字段名转换成字典类型
    variate.remove(target) #去掉因变量的字段名
    selected=[]
    current_score,best_new_score=float('inf'),float('inf') #目前的分数和最好分数初始值都为
    #循环筛选变量
    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 0x19d25a38c40>
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:Mon, 22 Mar 2021 Prob (F-statistic):5.54e-137
Time:22:16:19 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.

岭回归

from sklearn import linear_model
reg_rid = linear_model.Ridge(alpha=.5)
reg_rid.fit(X,y)
reg_rid.score(X,y)
0.739957023371629

相关参数

  1. alpha:较大的值表示更强的正则化。浮点数
  2. sample_weight:样本权重,默认无。
  3. solver:求解方法,{‘auto’, ‘svd’, ‘cholesky’, ‘lsqr’, ‘sparse_cg’, ‘sag’, ‘saga’}, 默认=’auto’。

Lasso

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

相关参数

  1. alpha:正则化强度,1.0代表标准最小二乘。
  2. fit_intercept:是否计算模型截距。默认true。
  3. normalize:是否标准化,默认false。
  4. positive:是否强制系数为正,默认false。

总结

  1. 本次任务把之前有关回归的内容进行了系统梳理
  2. 对于相关特征选择的方法及应用还需要进一步深入学习弄懂。因为自己专业的论文中基本就是K折算法了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值