Task03:偏差与方差理论

优化基础模型

方差与偏差

偏差度量的是单个模型的学习能力,而方差度量的是同一个模型在不同数据集上的稳定性。
好的泛化性能,则需使偏差较小,即能够充分拟合数据,并且使方差较小,即使得数据扰动产生的影响小。

方差

测试均方误差呈U形(表明了在测试均方误差中两种力量在博弈)
一般来说,模型的复杂度越高,测试的方差越大。训练误差越小。
在这里插入图片描述

偏差:

为了选择一个简单的模型去估计真实函数所带入的误差。假如真实的数据X与Y的关系是二次关系,但是我们选择了线性模型进行建模,那由于模型的复杂度引起的这种误差我们称为偏差。

偏差与方差和误差之间的关系:
在这里插入图片描述
测试均方误差的期望值可以分解为𝑓̂ (𝑥0)的方差、𝑓̂ (𝑥0)的偏差平方和误差项𝜖的方差。模型的测试均方误差达到最小值,也就是同时最小化偏差的平方和方差。

方差(Variance)反映的是模型每一次输出结果与模型输出期望之间的误差,即模型的稳定性。
Bias和模型复杂度的关系:当模型复杂度上升时,Bias减小。当模型复杂度降低时,Bias增加。(反比关系)
Variance和模型复杂度的关系:当模型复杂度低时,Variance更低,当模型复杂度高时,Variance更高。(正比关系)

特征提取

目标:选择测试误差最小的模型
很难对实际的测试误差做精确的计算,因此我们要对测试误差进行估计,估计的方式有两种:训练误差修正与交叉验证。
训练误差修正
已知:
模型越复杂,训练误差越小(偏差也越小。测试误差先减后增)
特征个数越多。模型越复杂。
因此:
我们先构造一个特征较多的模型使其过拟合,此时训练误差很小而测试误差很大,那这时我们加入关于特征个数的惩罚。因此,当我们的训练误差随着特征个数的增加而减少时,惩罚项因为特征数量的增加而增大,抑制了训练误差随着特征个数的增加而无休止地减小。
Cp、AIC赤池信息量准则(用的最多)、BIC贝叶斯信息量准则(惩罚最重,特征数最小)

在测试误差能够被合理的估计出来以后,我们做特征选择的目标就是:从p个特征中选择m个特征,使得对应的模型的测试误差的估计最小。对应的方法有:

压缩估计(正则化)

除了刚刚讨论的直接对特征自身进行选择以外,我们还可以对回归的系数进行约束或者加罚的技巧对p个特征的模型进行拟合(最小化训练误差+惩罚项,最小化测试误差的估计值。)显著降低模型方差,这样也会提高模型的拟合效果。具体来说,就是将回归系数往零的方向压缩,这也就是为什么叫压缩估计的原因了
岭回归(线性回归用于L2正则化的例子)
对模型本身进行改进,对线性回归的优化在于:线性回归的损失函数加入l2正则化从而牺牲了无偏性去降低方差。
寻找最优参数属于最优化内容。
Lasso回归(L1正则化的例子)
LARS最小角回归计算最优w
在这里插入图片描述
最优的参数为椭圆形曲线与菱形和圆形区域相切的点。而岭回归的约束是一个圆域,没有尖点,因此与RSS曲线相交的地方一般不会出现在坐标轴上,因此无法让某个特征的系数为0,因此无法做到特征提取

降维

方差的控制方式:
使用原始变量的子集(特征提取)
将变量系数压缩至零(正则化)
将原始的特征空间投影到一个低维的空间实现变量的数量变少(降维)
前两种都是基于原始特征得到的。降维本质是学习一个映射函数 f : x->y,其中x是原始数据点的表达,目前最多使用向量表达形式。 y是数据点映射后的低维向量表达,通常y的维度小于x的维度(当然提高维度也是可以的)。之所以使用降维后的数据表示是因为在原始的高维空间中,包含有冗余信息以及噪音信息。在实际应用例如图像识别中造成了误差,降低了准确率;而通过降维,我们希望减少 冗余信息 所造成的误差 (去噪),提高识别(或其他应用)的精度。又或者希望通过降维算法来寻找数据内部的本质结构特征**(无监督学习的一种)**。在很多算法中,降维算法成为了数据预处理的一部分,如PCA。事实上,有一些算法如果没有降维预处理,其实是很难得到很好的效果的。
主成分分析(PCA)
思想:通过最大投影方差 将原始空间进行重构,即由特征相关重构为无关,即落在某个方向上的点(投影)的方差最大。

对模型超参数进行调优(调参)

参数与超参数
我们很自然的问题就是岭回归中的参数𝜆和参数w之间有什么不一样?事实上,参数w是我们通过设定某一个具体的𝜆后使用类似于最小二乘法、梯度下降法等方式优化出来的,我们总是设定了𝜆是多少后才优化出来的参数w。因此,类似于参数w一样,使用最小二乘法或者梯度下降法等最优化算法优化出来的数我们称为参数,类似于𝜆一样,我们无法使用最小二乘法或者梯度下降法等最优化算法优化出来的数我们称为超参数。
模型参数是模型内部的配置变量,其值可以根据数据进行估计。

进行预测时需要参数。
它参数定义了可使用的模型。
参数是从数据估计或获悉的。
参数通常不由编程者手动设置。
参数通常被保存为学习模型的一部分。
参数是机器学习算法的关键,它们通常由过去的训练数据中总结得出 。
模型超参数是模型外部的配置,其值无法从数据中估计。
超参数通常用于帮助估计模型参数。
超参数通常由人工指定。
超参数通常可以使用启发式设置。
超参数经常被调整为给定的预测建模问题。

网格搜索GridSearchCV()
超参数做排列组合,在带进去寻找最优
随机搜索 RandomizedSearchCV()
超参数做排列组合中随机取一个,此种方法一般的到的不是最优的。
贝叶斯优化

尝试使用sklearn,对一组数据先进行特征的简化(使用三种方式),再使用回归模型,最后使用网格搜索调参,观察三种方法的优劣。

# 我们先来对未调参的SVR进行评价: 
from sklearn.svm import SVR     # 引入SVR类
from sklearn.pipeline import make_pipeline   # 引入管道简化学习流程
from sklearn.preprocessing import StandardScaler # 由于SVR基于距离计算,引入对数据进行标准化的类
from sklearn.model_selection import GridSearchCV  # 引入网格搜索调优
from sklearn.model_selection import cross_val_score # 引入K折交叉验证
from sklearn import datasets


boston = datasets.load_boston()     # 返回一个类似于字典的类
X = boston.data
y = boston.target
features = boston.feature_names
pipe_SVR = make_pipeline(StandardScaler(),
                                                         SVR())
score1 = cross_val_score(estimator=pipe_SVR,
                                                     X = X,
                                                     y = y,
                                                     scoring = 'r2',
                                                      cv = 10)       # 10折交叉验证
print("CV accuracy: %.3f +/- %.3f" % ((np.mean(score1)),np.std(score1)))
#定义向前逐步回归函数
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)
boston_data = pd.DataFrame(X,columns=features)
boston_data["Price"] = y
import statsmodels.api as sm #最小二乘
from statsmodels.formula.api import ols #加载ols模型
forward_select(data=boston_data,target="Price") #利用向前逐步回归筛选变量
# 下面我们使用网格搜索来对SVR调参:
from sklearn.pipeline import Pipeline
pipe_svr = Pipeline([("StandardScaler",StandardScaler()),
                                                         ("svr",SVR())])
param_range = [0.0001,0.001,0.01,0.1,1.0,10.0,100.0,1000.0]
param_grid = [{"svr__C":param_range,"svr__kernel":["linear"]},  # 注意__是指两个下划线,一个下划线会报错的
                            {"svr__C":param_range,"svr__gamma":param_range,"svr__kernel":["rbf"]}]
gs = GridSearchCV(estimator=pipe_svr,
                                                     param_grid = param_grid,
                                                     scoring = 'r2',
                                                      cv = 10)       # 10折交叉验证
gs = gs.fit(X,y)
print("网格搜索最优得分:",gs.best_score_)
print("网格搜索最优参数组合:\n",gs.best_params_)

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
网格搜索最优得分: 0.6081303070817127
网格搜索最优参数组合:
{‘svr__C’: 1000.0, ‘svr__gamma’: 0.001, ‘svr__kernel’: ‘rbf’}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值