模型选择的方法——正则化与交叉验证

一 预备知识:
在典型的机器学习应用中,为进一步提高模型在预测未知数据的性能,还要对不同的参数设置进行调优与比较,该过程称为模型选择,指的是针对某一特定问题,调整参数以寻求最优超参数的过程。
偏差:描述的是预测值(估计值)的期望与真实值之间的差距。偏差越大,越偏离真实数据集。
学习算法的期望预测为(学习不变,模型参数不变,期望是针对数据集而言的,同样的算法不同的数据集) f ( x ) = E D [ f ( x ; D ) ] ] f(x)=E_D[f(x;D)]] f(x)=ED[f(x;D)]](注意此时的x是测试集中的一个样本)
学习算法的偏差的计算公式: b i a s 2 ( x ) = ( f ( x ) − y ) 2 bias^2(x)=(f(x)-y)^2 bias2(x)=(f(x)y)2( f ( x ) 是 学 习 算 法 的 期 望 预 测 f(x)是学习算法的期望预测 f(x))
(偏差和方差都是针对模型在不同的数据集上来讲的,我们要评估下学习算法或者说模型是否恰当,就要考察偏差和方差,可以证明好的模型都是偏差和方差比较小的模型,即泛化误差可以分解为偏差和方差!!)

**方差:**描述的是预测值的变化范围,离散程度,也就是估计值离其期望值的距离。方差越大,预测结果数据的分布越分散。

v a r ( x ) = E D [ ( ( f ( x ; D ) − f ( x ) ) 2 ] var(x)=E_D[((f(x;D)-f(x))^2] var(x)=ED[((f(x;D)f(x))2]( f ( x ) 代 表 预 测 的 期 望 , 符 号 不 好 打 , 将 就 下 吧 f(x)代表预测的期望,符号不好打,将就下吧 f(x))

结论:高偏差就是欠拟合,高方差就是过拟合。

偏差是指我们忽略了多少数据,而方差是指我们的模型对数据的依赖程度

过拟合模型表现在数据集上具有高方差低偏差
(划重点:如何判断一个模型是不是过拟合了??)

前面说过了方差是针对模型在数据集上来讲的,其实方差反映了模型响应训练数据变化的程度
如果我们的模型具有高方差的话,它高度依赖训练数据,那么针对不同的测试集,模型将完全不同,这样在测试集上的效果肯定不好。

**偏差是方差的另一面,因为它代表了我们对数据做出假设的强度。**这么理解这句话呢?首先明确一点的就是,高偏差说白了就是我们的算法对训练数据的学习不够充分,有些重要的东西没有学到(可以认为忽略掉了)

高方差会产生过拟合,高偏差会产生欠拟合,都是我们不希望看到的,那么怎么办呢?

可以设置一个”预测试“来评估我们的模型,并在真正的测试之前进行改进。这种预测试被称为验证集,是模型开发的关键部分

总结:
过拟合:过分依赖训练数据(学习算法能力太强了,特定数据集一些特有的细节也学到了)
欠拟合:未能充分学习到训练数据中的关系(学习能力弱,忽略掉一些共有的东西)
高方差:模型根据训练数据集显著变化
高偏差:对模型的假设不够导致忽略训练数据
过拟合和欠拟合会导致泛化性差
一个验证集模型可以防止过拟合。

评价数据拟合程度好坏,通常用代价函数J。如果只关注训练集误差Jtrain的话,通常会导致过拟合,因此还需要关注Jcv(交叉验证集误差)

高偏差:Jtrain和Jcv都很大,并且 Jtrain 约等于 Jcv,对应欠拟合
高方差:Jtrain较小,Jcv远大于Jtrain。对应过拟合。

如何理解高偏差和高方差:
1)高偏差对应着欠拟合,此时的Jtrain也较大,可以理解为对任何的新数据(不论是否属于训练集),都有较大的Jcv误差,偏离真实预测较大。
2)高方差对应着过拟合,此时Jtrain很小,对于很数据来说,如果其属性和训练集类似,它的Jcv就会小些,如果属性与训练集不同,Jcv就会很大,因此有一个比较大的波动,因此说是高方差。
(解释的真透彻,前面说了高方差就是太依赖数据集导致的,这样训练出来的模型用来测试的话,就看测试集的特点是不是与训练集类似,越接近的Jcv就越小,反之越大,导致有波动即高方差,完美啊!)

实际优化过程中,更多的是调整防止过拟合参数 λ λ λ,λ对应正则化系数(越大,对过拟合的限制越强)

**学习曲线:**是描述Jtrain和Jcv和数据样本规模的关系曲线。
在这里插入图片描述
左图对应高偏差(欠拟合),有图对应过拟合,可以看出当模型处于高偏差时,随着样本数据规模的增大,性能不会有多大改善,过拟合中的误差则在持续减小。可以这样理解:欠拟合一般是因为模型比较简单,不能准确描述数据特征,因此盲目增加数据量是没用的;而过拟合是模型比较复杂,描述数据过于准确了,因此增加一些数据量可以减小过拟合。

模型修改策略:
过拟合:增大数据规模,减少数据特征数(维数)、增大正则化系数 λ λ λ
欠拟合:增大数据特征数,添加高次多项式特征,减小正则化系数。

二 模型选择:
正则化:
模型选择的典型方法是正则化。正则化是结构风险最小化策略的实现,是在经验风险上加一个正则化项或罚项。
正则化项一般是模型复杂度的单调递增函数,模型越复杂,正则化值越大。比如正则化项可以是模型参数向量的范数

正则化一般具有如下形式:
m i n 1 N ∑ i = 1 N L ( y i , f ( x i ) ) + λ J ( f ) min\frac{1}{N}\displaystyle\sum_{i=1}^{N}L(y_i,f(x_i))+λJ(f) minN1i=1NL(yi,f(xi))+λJ(f)
其中第一项是经验风险,第2项是正则化项, λ ≥ 0 λ≥0 λ0为调整两者之间关系的系数。

第一项的经验风险较小的模型可能比较复杂(有多个非零参数),这时第2项的模型复杂度会较大。正则化的作用是选择经验风险与模型复杂度同时较小的模型。

正则化符合奥卡姆剃刀原理

正则化处理时,调整参数 λ λ λ的选取很重要,如果 λ λ λ取的太小了,仍然会存在过拟合问题,如果 λ λ λ取的过大,可能会出现欠拟合。

选择合适的 λ λ λ,一般通过交叉验证,我们选择一系列想要测试的 λ λ λ值,通常为0-10之间呈现2倍关系的值(0、0.01、0.02、0.04、0.08、0.16、0.32、0.64、1.28、2.56、5.12、10)
随着 λ λ λ增加,训练误差不断增加(惩罚项导致模型不能太复杂,所以训练误差会增大),交叉验证误差先减小后增加,我们要找的是交叉验证误差最小点。

从贝叶斯估计的角度来看,正则化项对应于模型的先验概率。

先验知识:
正则化是对经验风险函数进行约束,可以理解为引入先验知识,具有引导作用,使优化过程中倾向与选择满足约束条件梯度减小的方向进行

L1,L2正则化可以理解为模型导入了先验分布,对模型进行惩罚,L1正则化引入拉普拉斯分布,L2正则化引入了高斯分布。

贝叶斯角度理解正则化:

贝叶斯学派和频率学派:
频率学派和贝叶斯学派最大的区别其实产生于对参数空间的认知上。

频率学派:
认为需要推断的参数 θ θ θ视作未知的定值,而样本X 是随机的,其着眼点在样本空间,有关的概率计算都是针对X的分布,频率学派认为参数虽然我们不知道,但是它是固定的,我们要通过随机产生的样本去估计这个参数,所以才有了极大似然估计这些方法。

贝叶斯学派:
把参数 θ θ θ视为满足某一个分布的随机变量(这点和频率学派不同,人家是当做了未知的定值),而样本是固定的,其着眼点在参数空间,重视参数 θ θ θ的分布,固定的操作模式是通过参数的先验分布结合样本信息得到参数的后验分布。

P ( θ ∣ X ) = P ( X ∣ θ ) ∗ P ( θ ) P ( X ) P(θ|X)=\frac{P(X|θ)*P(θ)}{P(X)} P(θX)=P(X)P(Xθ)P(θ) 贝叶斯经典公式
其求解过程就是把每个类别的标签看出上面的参数θ,然后用样本去推测出标签的分布

还有两点要说的就是:

  1. 因为贝叶斯学派很多时候需要去估计先验的分布,所以如果估计的不好的话,效果也不好
  2. 当实验次数足够多的时候(趋于正无穷时),人先验的影响几乎不存在了

正则化与先验:
有了上面的理解就很容易理解正则化项跟先验的关系了,因为我们要求满足模型的参数 ω ω ω的分布,
P ( ω ∣ X , y ) P(ω|X,y) P(ωX,y)

并且 P ( ω ∣ X , y ) = P ( y ∣ X , ω ) ∗ P ( ω ) P ( X ) P(ω|X,y)=\frac{P(y|X,ω)*P(ω)}{P(X)} P(ωX,y)=P(X)P(yX,ω)P(ω)
因为分母都一样,只看分子,而 P ( y ∣ X , ω ) P(y|X,ω) P(yX,ω)这一部分单独拿出来的话,做最大似然估计就是不加正则化的结果,而再乘以 P ( ω ) P(ω) P(ω)就是加入了一个参数 ω ω ω的先验认知。

而参数 ω ω ω的先验可以是高斯分布(L2正则化项对应岭回归)或者拉普拉斯分布(L1正则化对应Lasso回归)
对比拉普拉斯分布和高斯分布,可以看到拉普拉斯分布在0值附近突出;而高斯分布在0值附近分布平缓,两边分布稀疏。对应地,L1正则倾向于产生稀疏模型,L2正则对权值高的参数惩罚重

P ( A i ∣ B ) = P ( A i ) ∗ P ( B ∣ A i ) P ( B ) P(A_i|B)=\frac{P(A_i)*P(B|A_i)}{P(B)} P(AiB)=P(B)P(Ai)P(BAi)
其中, P ( A i ) P(A_i) P(Ai)是先验概率
P ( A i ∣ B ) 是 在 给 定 信 息 下 的 修 正 的 概 率 , 称 为 后 验 概 率 P(A_i|B)是在给定信息下的修正的概率,称为后验概率 P(AiB)
P ( B ∣ A i ) P(B|A_i) P(BAi)是在给定 A i A_i Ai下的证据似然函数
P ( B ) 是 证 据 P(B)是证据 P(B)

正则化项对应后验概率估计中的先验信息,损失函数对应似然函数,两者乘积得到贝叶斯最大后验概率
对贝叶斯后验概率,取对数,可以转化为:损失函数+正则化项

概率论角度解释平滑与稀疏:
1)高斯分布,对大的w,概率较低,而在接近0的时候,概率变换缓慢,所以对于小概率容忍较好,最终解的w趋于0附近
2)拉普拉斯分布,只有很小的w,才能得到较大的概率,偏向于0,更加稀疏
3)分析时要考虑先验,当0较多时,模型偏于简单,先验会较低

极大似然估计与后验概率:
1)最大后验估计可以根据经验数据,对难以观察的量进行估计,如参数估计,与最大似然不同的是,最大后验融入了估计量的先验分布,即事先知道估计量满足的分布模型,因此最大后验估计可以看作规则化的最大似然估计;
2)L1 L2正则化,都可以转化为:极大似然 * 参数的先验模型
在这里插入图片描述

交叉验证:
如果给定的样本数据充足,进行模型选择的一种简单方法是随机的将数据切分成三部分:分别是训练集、验证集和测试集。
训练集用来训练模型,验证集用于模型选择,而测试集用于最终对学习方法的评估。
在学习到的不同复杂度模型中,选择对验证集有最小预测误差的模型。由于验证集有足够多的数据,用它对模型选择时有效的。
但是,在很多的实际应用中数据时不充足的,为了选择好的模型,可以采用交叉验证方法,交叉验证的基本思想是重复的利用数据。
1)为什么要进行交叉验证?
为了得到可靠稳定的模型,交叉验证是一种模型选择方法,其将样本的一部分用于训练,另一部分用于验证。
因此不仅考虑了训练误差,同时也考虑了泛化误差

交叉验证有哪些方法:

1 简单交叉验证
将原始数据分为两组:一组是训练集,一组是验证集,利用训练集训练模型,然后利用验证集验证模型,进行多次划分,选择误差最小的模型。
优点:简单,只需要将原始数据随机的分成两组就行了
缺点:
(1)没有达到交叉的效果。
(2)随机分组,验证集分类的准确率与原始数据分组的关系很大。
(3)有些数据可能从未做过训练或测试数据;而有些数据不止一次选为训练或测试数据。

2 S折交叉验证
将原始数据分成个S个互不相交的大小相同的组,每个子集数据分别做一次验证集,其余的S-1组子集数据作为训练集,这样会得到S个模型,然后选出S次评测中平均验证误差最小的模型(为啥是S次评测呢?因为原始数据分成了S份啊,又要进行S次循环,这样就会有S个模型,对应S个评分)
具体做法是:将超参数在一定的范围内循环,在每一个超参数给定的情况下,都进行一次S折交叉验证(cross_val_score),取S次评测中误差最小的超参数为参数进行模型训练。

S的取值:
一般是大于等于2,只有在原始数据集合数据量小的时候才会取2
优点:
有效的避免过拟合和欠拟合

3 留一交叉验证
S折交叉验证的特殊情形是S = N,称为留一交叉验证,往往在数据缺乏的情况下使用。此处N是给定数据集的容量。

模型选择过程:
通过采用不同的输入训练样本,来决定机器学习算法中包含的各个参数值,叫做模型选择。
(1)首先准备q个候选的模型
(2)对每个模型求解它的学习结果
(3)对学习误差排序,选择误差最小的模型作为最终的模型

举例:将有标注的data分为训练集,(交叉)验证集,测试集三份:
在做模型选择,更确切的说做模型参数选择的时候,这里以多项式kernel的SVM为例,我们需要选择的参数是多项式的阶数:
1 训练:先用训练集在一次模型、二次模型、三次模型(几次指的是的z=Zθ(x) 阶数)情况下跑一下,然后用数值优化的算法求得在指定阶数情况下,使Training error最小的参数θ分别是多少
2 参数寻优:用交叉验证集在1中得到的每个模型M(1,θ1)…M(k,θk)…M(n,θn)跑一下,计算出Cross Validation error,选择使这个error最小的模型次数k
3 最终训练:给定阶数k,训练得出在Training Set+CV Set上,使Training error最小的参数θ,得到模型M(k,θk’)

总结:
利用n-fold交叉验证,是现在做机器学习实验最常用的做法
(1)数据按比例划分为训练集A、测试集B
(2)使用训练数据A进行n-fold验证,训练集分为a1~an共n份,n份中的每一份ai轮流做CV set,其余n-1份作为Training set,这样训练n次,取n次所得CV error平均值作为一个模型最终的CV error,以此选出最优模型参数。
(3) 再用整个训练集A在选出的最优模型参数下训练出一个模型。
(4)最后在测试集B上测试给出结果。

附加:交叉验证的作用

1:用于调整超参数,选取最佳参数

交叉验证的方法可以帮助我们进行调参,最终得到一组最佳的模型参数
用交叉验证选取K近邻算法最佳的k值

用于调节参数
from sklearn.cross_validation import cross_val_score
# search for an optimal value of K for KNN model
k_range = range(1,31)
k_scores = []
for k in k_range:
    knn = KNeighborsClassifier(n_neighbors=k)
    scores = cross_val_score(knn, X, y, cv=10, scoring='accuracy')
    k_scores.append(scores.mean())

print k_scores

2 用于模型选择
分别使用iris数据,KNN和logistic回归模型进行模型的比较和选择。

# 10-fold cross-validation with the best KNN model
knn = KNeighborsClassifier(n_neighbors=20)
print cross_val_score(knn, X, y, cv=10, scoring='accuracy').mean()
0.98
# 10-fold cross-validation with logistic regression
from sklearn.linear_model import LogisticRegression
logreg = LogisticRegression()
print cross_val_score(logreg, X, y, cv=10, scoring='accuracy').mean()
0.953333333

3.用于特征选择

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值