Day03-集成学习-机器学习-回归-优化基础模型(DataWhale)

4. 优化基础模型

  • 训练数据集:去估计模型参数的数据集
  • 测试数据集:未出现在训练数据集的未知数据集
  • 估计参数原则:使得损失函数在训练集达到最小值
  • 回归模型的目的:使得模型在测试数据中表现优异

    解决估计参数的原则与模型最优的矛盾

4.1 均方误差

MSE = 1 N ∑ i = 1 N ( y i − f ^ ( x i ) ) 2 \text{MSE} = \frac{1}{N}\sum_{i=1}^{N}(y_i - \hat{f}(x_i))^2 MSE=N1i=1N(yif^(xi))2

f ^ ( x i ) \hat{f}(x_i) f^(xi)是基于样本 x i x_i xi建立的模型 f ^ \hat{f} f^预测的结果

  • 训练均方误差:基于训练集上的数据得到的均方误差
  • 测试均方误差:基于测试集上的数据得到的均方误差
  • 训练误差不是测试误差的良好估计。训练均方误差最小时,测试均方误差不一定小,甚至很大
  • 过拟合:模型在训练均方误差很小,但是测试均方误差很大

4.2 偏差-方差的衡量

E D [ ( f ^ ( x ) − y D ) 2 ] = b i a s 2 ( x ) + v a r ( x ) + ϵ 2 \text{E}_D\left[\left(\hat{f}(x)-y_D\right)^2\right]= bias^2(x)+var(x)+\epsilon^2 ED[(f^(x)yD)2]=bias2(x)+var(x)+ϵ2

泛化误差:偏差、方差、噪声之和。

一般来讲,增加模型的复杂度,会增加模型的方差,减少模型的偏差

  • D:训练集
  • x x x:测试样本
  • y D y_D yD x x x在数据集中的标记
  • y y y x x x的真实标记
  • f ^ ( x ) \hat{f}(x) f^(x) :训练集D上学得模型 f f f x x x上的预测输出
  • f ˉ ( x ) = E D [ f ^ ( x ) ] \bar{f}(x) = E_D[\hat{f}(x)] fˉ(x)=ED[f^(x)]:学习算法的期望预测
  • b i a s 2 ( x ) = ( f ˉ ( x ) − y ) 2 bias^2(x) = \left(\bar{f}\left(x\right)-y\right)^2 bias2(x)=(fˉ(x)y)2: 期望输出与真实标记的差别称为偏差(bias)
  • v a r ( x ) = E D [ ( f ^ ( x ) − f ˉ ( x ) ) 2 ] var(x) = E_D\left[\left(\hat{f}(x)-\bar{f}\left(x\right)\right)^2\right] var(x)=ED[(f^(x)fˉ(x))2]: 样本数相同的不同训练集产生的方差。模型的复杂度越高,f的方差越大
  • ϵ 2 = E D [ ( y D − y ) 2 ] \epsilon^2 = E_D\left[\left(y_D-y\right)^2\right] ϵ2=ED[(yDy)2]: 样本数相同的不同训练集产生的噪声

在这里插入图片描述

我们选择模型时,需要选择测试误差(泛化误差)达到最小的模型。很难对实际的测试误差做精确的计算,需要对测试误差做估计。分为:训练误差修正与交叉验证。

4.3 特征提取

4.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)
R S S = ∑ i = 1 N ( y i − f ^ ( x ) ) 2 RSS = \sum_{i=1}^N(y_i - \hat{f}(x))^2 RSS=i=1N(yif^(x))2
d d d:模型特征个数

σ ^ 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)

4.3.2 交叉验证

**原理:**对测试误差直接估计。

方法:

  • K折交叉验证: 将训练样本分成K等分,然后用K-1个样本集当作训练集,剩下的一份样本集为验证集去估计K-1个样本集得到的模型精度,这个过程重复K次取平均值得到测试误差的一个估计 C V ( K ) = 1 K ∑ i = 1 K M S E i CV_{(K)} = \frac{1}{K}\sum_{i=1}^K MSE_i CV(K)=K1i=1KMSEi
    在测试误差能够被合理的估计出来后,做特征选择的目标是:从p个特征中选择m个特征,是的对应的模型的测试误差的估计最小。

    对应的方法有:
    • 最优子集选择:

      (i) 记不含任何特征的模型为 M 0 M_0 M0,计算这个 M 0 M_0 M0的测试误差

      (ii) 在 M 0 M_0 M0基础上增加一个变量,计算p个模型的RSS,选择RSS最小的模型记作 M 1 M_1 M1,并计算 M 1 M_1 M1的测量误差

      (iii) 再增加变量,计算p-1个模型的RSS,并选择RSS最小的模型记作 M 2 M_2 M2,并计算 M 2 M_2 M2的测试误差

      (iv) 重复以上的过程,直到拟合的模型有p个特征为止,并选择p+1个模型 { M 0 , M 1 , . . . , M p } \{M_0,M_1,...,M_p\} {M0,M1,...,Mp}中测试误差最小的模型作为最优模型。
    • 向前逐步选择:

      最优子集选择会随着数据特征维度p的增加,子集的数量为 2 p 2^p 2p,计算效率会很低,因此使用向前逐步选择的算法:

      (i) 记不含任何特征的模型为 M 0 M_0 M0,计算 M 0 M_0 M0的测试误差

      (ii) 在 M 0 M_0 M0的基础上增加一个变量,计算p个模型的RSS,选择RSS最小的模型记作 M 1 M_1 M1,并计算 M 1 M_1 M1的测试误差

      (iii) 在最小的RSS模型下,继续增加一个变量,选择RSS最小的模型记作 M 2 M_2 M2,并计算 M 2 M_2 M2的测试误差

      (iv) 重复以上的过程,直到拟合的模型有p个特征为止,并选择p+1个模型 { M 0 , M 1 , . . . , M p } \{M_0,M_1,...,M_p\} {M0,M1,...,Mp}中测试误差最小的模型作为最优模型

4.4 压缩估计(正则化)

除了可以对特征自身进行选择以外,可以对回归系数进行约束或者加罚的技巧对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}(y_i - w_0 - \sum_{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 J(w) = \sum_{i=1}^{N}(y_i - w_0 - \sum_{j=1}^{p}w_jx_{ij})^2+\lambda\sum_{j=1}^{p}w_j^2 J(w)=i=1N(yiw0j=1pwjxij)2+λj=1pwj2
    其中, λ ≥ 0 \lambda \ge 0 λ0
    w ^ = ( X T X + λ I ) − 1 X T Y \hat{w} = (X^TX + \lambda I)^{-1}X^TY w^=(XTX+λI)1XTY
    调节参数 λ \lambda λ的大小是影响压缩估计的关键, λ \lambda λ越大,乘法的力度越大,系数则越趋近于0,反之,选择合适的 λ \lambda λ对模型精度来讲很重要。

    岭回归通过牺牲线性回归的无偏性降低方差,有可能使得模型整体的测试误差较小,提高模型的泛化能力。

  • Lasso回归

    岭回归的显著特点:将模型的系数向零的方向压缩,但岭回归的系数只能趋于0不能等于0,无法做特征选择。使用系数向量的L1范数替换岭回归中的L2范数,可以做到像特征最优子集选择一样的提取重要特征。

    J ( w ) = ∑ i = 1 N ( y i − w 0 − ∑ j p w j x i j ) 2 + λ ∑ j = 1 p ∣ w j ∣ J(w) = \sum_{i=1}^{N}(y_i - w_0 -\sum_{j}^{p}w_jx_{ij})^2+\lambda\sum_{j=1}^p|w_j| J(w)=i=1N(yiw0jpwjxij)2+λj=1pwj
    其中, λ ≥ 0 \lambda \ge 0 λ0

lasso可以做到特征选择,岭回归不可以,是因为Lasso回归的约束在每个坐标轴上都有拐点,当RSS曲线与坐标轴相交时,恰好回归系数中的某一个为0,这样就实现了特征提取。岭回归的约束是一个圆域,没有尖点,RSS曲线相交的地方不会出现在坐标轴,无法让某个特征的系数为0,无法进行特征提取。(椭圆曲线为RSS等高线)

4.5 降维

前面对方差的控制有两种:一种是使用原始变量的子集,一种是将变量系数压缩至0,这两种都是基于原始特征 x 1 , x 2 , . . . , x p x_1,x_2,...,x_p x1,x2,...,xp得到的。

降维:将原始的特征空间投影到一个低维的空间实现变量的数量变少。如:将二维平面投影至一维空间。

机器学习领域的降维:采用某种映射方法,将高维空间中的数据点映射到低维度空间。

降维的本质是学习一个映射函数f: x ->y

降维的原因是原始的高维空间中,包含有冗余信息以及噪音信息,在实际应用中造成了误差,降低了准确率;通过降维希望减少冗余信息所造成的误差,提高识别进度,又希望通过降维算法来寻找数据内部的本质结构特征。

4.5.1 主成分分析(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_{i=1}^{N}x_i = \frac{1}{N}X_T1_N,其中1_N = (1,1,...,1)^T_N xˉ=N1i=1Nxi=N1XT1N1N=(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_{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=N1XTHXH=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 1u 1=1

(iii) 计算投影方差: J = 1 N ∑ i = 1 N [ ( x i − x ˉ ) T u ⃗ 1 ] 2 , ∣ ∣ u ⃗ 1 ∣ ∣ = 1 J = \frac{1}{N}\sum_{i=1}^{N}[(x_i-\bar{x})^T\vec{u}_1]^2,||\vec{u}_1||=1 J=N1i=1N[(xixˉ)Tu 1]2u 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 \vec{u}_1 = argmax_{u1} \frac{1}{N}\sum_{i=1}^{N}[(x_i-\bar{x})^T\vec{u}_1]^2 u 1=argmaxu1N1i=1N[(xixˉ)Tu 1]2
s . t . u ⃗ 1 T u ⃗ 1 = 1 ( u ⃗ 1 之 后 不 再 带 向 量 符 号 ) s.t.\vec{u}_1^T\vec{u}_1 = 1(\vec{u}_1之后不再带向量符号) s.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_{i=1}^{N}[(x_i-\bar{x})^T\vec{u}_1]^2\\ = \frac{1}{N}\sum_{i=1}^{N}[u_1^T(x_i-\bar{x})(x_i-\bar{x})^Tu_1] \\ \; = u_1^T[\frac{1}{N}\sum_{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 − a λ u 1 = 0 即 : S 2 u 1 = λ u 1 \hat{u}_1 = argmax_{u1}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-a\lambda u_1 = 0\\ 即:S^2u_1 = \lambda u_1 u^1=argmaxu1u1TS2u1s.t.u1Tu1=1L(u1,λ)=u1TS2u1+λ(1u1Tu1)u1L=2S2u1aλu1=0S2u1=λu1

可以看到: λ \lambda λ S 2 S^2 S2的特征值, u 1 u_1 u1 S 2 S^2 S2的特征向量。我们只需要对中心化后的协方差矩阵进行特征值分解,得到的特征向量即为投影向量。如果需要降维,只需要取p的前M个特征向量即可。

案例1:向前逐步回归

#定义向前逐步回归函数
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:
        #如果目前的aci值大于最好的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 pandas as pd
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(1)
CRIMZNINDUSCHASNOXRMAGEDISRADTAXPTRATIOBLSTATPRICE
00.0063218.02.310.00.5386.57565.24.091.0296.015.3396.94.9824.0
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.4386331672176, 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.7263878250624, 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 0x21b5c568430>
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:21:40:04 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.

查看每个系数的p值,显著性都比较好,整个模型的 R 2 R^2 R2也还行

案例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)

参数

  • X:用于训练的数据
  • y:目标值
  • alpha:正则强度,必须是正浮点型。正则化改善了问题的状况,并减少了估计的方差。值越大表示正则化更强。如果传递数组,则认为惩罚是特定于目标的。因此,它们必须在数量上对应。
  • sample_weight:每个样本的独立权重。如果给定一个浮点值,则每个样本的权量都相同。如果sample_weight不为None且solver =‘auto’,则solver将被设置为’cholesky’。
  • solver:计算例程的求解器。{‘auto’, ‘svd’, ‘cholesky’, ‘lsqr’, ‘sparse_cg’, ‘sag’, ‘saga’}, default=’auto’
  • max_iter:共轭梯度求解器的最大迭代次数。
  • tol:解决方案的准确率。float, default=1e-3
  • verbose:详细程度。设置verbose> 0将显示其他信息
  • random_state:在solver=='sag’或’saga’打乱数据时使用。
  • returen_n_inter:如果为True,则该方法还返回n_iter,由求解器执行的实际迭代次数。bool, default=False
  • return_intercept:如果为True且X是稀疏的,则该方法还会返回截距,并且求解器会自动更改为’sag’。default=False
  • check_input:如果为False,将不检查输入数组X和y。default=True

属性

  • coef:权重向量。
  • n_iter:求解器执行的实际迭代次数。仅在return_n_iter为True时返回。
  • intercept:模型的截距。仅当return_intercept 为True且X为稀疏数组时返回
from sklearn import linear_model
reg_rid = linear_model.Ridge(alpha=0.5)
reg_rid.fit(X,y)
reg_rid.score(X,y)
0.739957023371629

案例3:Lasso

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

属性

  • coef:权重向量。
  • n_iter:求解器执行的实际迭代次数。仅在return_n_iter为True时返回。
  • intercept:模型的截距。仅当return_intercept 为True且X为稀疏数组时返回

方法

  • fit(X,y):
  • get_params():
  • path(X,y):计算具有坐标下降的弹性网路径
  • predict(X):
  • score(X,y):返回决定系数 R 2 R^2 R2
  • set_params:设置此估算器的参数。
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、付费专栏及课程。

余额充值