天天看点

Andrew Ng机器学习公开课笔记 -- Regularization and Model Selection

网易公开课,第10,11课 

model selection

首先需要解决的问题是,模型选择问题,如何来平衡bais和variance来自动选择模型?比如对于多项式分类,如何决定阶数k,对于locally weighted regression如何决定窗口大小,对于svm如何决定参数c 

Andrew Ng机器学习公开课笔记 -- Regularization and Model Selection

0, 1, . . . , or 10.  alternatively, suppose we want to automatically choose the bandwidth parameter τ for locally weighted regression, or the parameter c for our ℓ1-regularized svm.

cross validation

最典型的就是交叉验证,有3种方法,

hold-out cross validation (also called simple cross validation) 

用70%的数据作为训练集,用30%数据作为测试集,找出训练误差最小的h(7:3是比较典型的比例) 

这个方法的问题是,我们浪费了30%的数据,即使你在选定model后,拿整个数据集再做一遍训练,也无法改变你只用了70%来选择最优模型的事实 

尤其对于一些领域,数据集的收集的代价是很高的,就不太合适

k-fold cross validation,通常k=10 

把数据集随机分为k份,用k-1份来训练,用剩下的那份来测试,这样的过程可以进行k次(不同的组合) 

最终选取平均测试误差最小的h 

这个的问题,显然是计算量比较大

leave-one-out cross validation 

k-fold的特例,k=m,即k等于样本数,一份就是一个样本 

适用于样本非常少的情况

feature selection

one special and important case of model selection is called feature selection. 

对于比如文本分类问题,垃圾邮件分类,会有很大量的features,但其实只有其中一小部分和分类问题相关,比如很多stop word,a,the,都和分类不相关,而buy,shop等比较相关的只是一小部分,所以我们需要减少feature数来降低复杂度

Andrew Ng机器学习公开课笔记 -- Regularization and Model Selection

显然计算和比较那么多的模型是不现实的,所以我们用heuristic search procedure,启发式的方式,去找到一个good feature subset,

forward search or backward search

属于贪心算法,forward是一个个加,backward是一个个减,然后每次加减都通过cross validation做次局部最优的选择,即加个误差最小的,或减个误差最大的 

这种需要通过训练测试的方式来选择的,称为wrapper model feature selection,因为它就像wrapper,需要反复调用学习算法来评估feature。 

Andrew Ng机器学习公开课笔记 -- Regularization and Model Selection

filter feature selection

效果没有wrapper那么好,但是比较cheaper,思路就是计算每个feature的score s(i) that measures how informative each feature xi is about the class labels y,最终我们只需要pick分数最高的那k个features就可以了,最常用的score就是mutual information 

in practice, it is more common (particularly for discrete-valued features xi) to choose s(i) to be the mutual informationmi(xi, y) between xi and y:

Andrew Ng机器学习公开课笔记 -- Regularization and Model Selection

为了更直观的理解mutual information,这个式子还可以表示成,kullback-leibler (kl) divergence:

Andrew Ng机器学习公开课笔记 -- Regularization and Model Selection

这个kl表示p(xi, y) and p(xi)p(y)的差异程度, 

Andrew Ng机器学习公开课笔记 -- Regularization and Model Selection

bayesian statistics and regularization

这节内容主要讨论如何用贝叶斯规范化来解决过拟合(overfit)问题

可以想想前面碰到的回归问题,都是用的最大似然估计,

Andrew Ng机器学习公开课笔记 -- Regularization and Model Selection

即找到让训练集最为正确的那组参数,这样很容易过拟合 

从统计学上看,最大似然估计,是一种frequentist statistics,即仅仅用频率来客观的估计概率,不加入任何主观的先验观念 

对于这里,就是完全根据客观出现的训练集来估计真实的参数 

Andrew Ng机器学习公开课笔记 -- Regularization and Model Selection
frequentist or bayesian <a href="http://cos.name/2012/12/the-odyssey-of-stat-frequentist-or-bayesian/">http://cos.name/2012/12/the-odyssey-of-stat-frequentist-or-bayesian/</a>

那么在统计学中,对应于frequentist statistics的学派,叫bayesian statistics 

Andrew Ng机器学习公开课笔记 -- Regularization and Model Selection
Andrew Ng机器学习公开课笔记 -- Regularization and Model Selection

根据bayes定理,s表示训练集

Andrew Ng机器学习公开课笔记 -- Regularization and Model Selection

分子比较好理解,分母我不理解,不过没事,反正仅仅需要比较大小,分母都是可以略去的

于是可以得到,

Andrew Ng机器学习公开课笔记 -- Regularization and Model Selection

可以看看和上面极大似然的差别, 

Andrew Ng机器学习公开课笔记 -- Regularization and Model Selection
Andrew Ng机器学习公开课笔记 -- Regularization and Model Selection

为何加上先验概率就可以防止过拟合?

Andrew Ng机器学习公开课笔记 -- Regularization and Model Selection
Andrew Ng机器学习公开课笔记 -- Regularization and Model Selection
Andrew Ng机器学习公开课笔记 -- Regularization and Model Selection
Andrew Ng机器学习公开课笔记 -- Regularization and Model Selection

实际的效果证明, bayesian logistic regression在文本分类上有很好的效果,即便对于文本分类,特征数n要远远大于训练集m

下面的内容其实在第11课占很多的时间,但是在讲义中是没有的 

关注的问题,其实可以说是ml实战,觉得挺有意义的,所以记录在这里

debugging learning algorithms

在使用ml算法,一定会碰到的问题是,如果算法实验的效果或准确率很差,我们应该怎样改进?

比如,用贝叶斯logistics回归做垃圾邮件过滤,结果误差有20%,如何改进? 

原因有可能有很多, 

训练样本集不够多,增加训练样本 (高variance) 

特征太多,减少特征数                (高variance) 

特征太少,增加特征数                 (高bias) 

特征选取的不恰当,选取更好的特征  (高bias)

梯度下降迭代的不够多,没有收敛     (优化算法问题) 

或应该使用其他的最优化算法,如牛顿 (优化算法问题) 

目标函数中的参数不够合理,调节参数 (目标函数问题) 

可能应该使用svm。。。。。。        (目标函数问题) 

当然可能有几百种改进的方法,其中一些是有效的,也许是无效的,但都会耗费很多的时间 

所以,我们需要准确的找到优化的方向

首先需要确定的一点就是,当前的误差是高bias还是高variance?

这个其实很简单, 

如果训练误差远远小于测试误差,那么一定是高variance误差 

如果是高bias,那么训练误差也一定会很大,比如用线性函数去拟合二次函数

那么对于高variance误差,增加训练集就会比较有效果 

因为随着训练集m的增大,测试误差会逐渐变小,而训练误差会逐渐变大,从而缩小他们之间的差距 

为何训练集m变大,训练误差会变大,因为训练集越大,就越难完美的拟合

而对于高bias误差,训练误差已经超出预期,那么增加训练集是没有任何效果的,因为增加训练集只会更多增加训练误差,而也无法减小测试误差

其次,需判断的是,到底是因为优化算法有问题导致没有收敛,还是目标函数本身就选择的不对? 

比如还是上面的例子, 

你用贝叶斯logistics回归做垃圾邮件过滤,发现结果不是很满意,于是你使用svm试了下,发现结果比较好,但是出于简单和效率考虑,你还是想用贝叶斯logistics回归 

此时如何定位问题? 

这里对于贝叶斯logistics回归或svm,最终的目标都是拟合出最优的θ参数,即找到使目标函数j(θ)最大的θ 

那么这里我们可以把logistics回归或svm得到的参数θ1和θ2,都代入贝叶斯logistics回归的目标函数j(θ)中,

如果j(θ1) &lt; j(θ2), 即svm确实找到了更优的参数θ,那么一定是我们的优化函数有问题,没有收敛到最优参数 

如果j(θ1) &gt; j(θ2), 即svm找到的参数不是更优参数,但是他实际的分类效果却比贝叶斯logistics回归好,说明当前的目标函数无法很好的描述这个问题,需要改变目标函数

其实我觉得这个方法有个问题,就是一定要找到类似svm这样比当前算法效果好的相应算法 

ng又举了个他做直升机自动驾驶的例子,如果发现效果不好,可能的原因有 

直升机模拟器,无法模拟真实环境 

使用的强化学习算法有问题,无法收敛 

目标函数或cost function有问题

那么他是如何来进行诊断的? 

首先他要确认是否是模拟环境的问题,方法是用训练出的参数,分别在模拟环境和真实环境中实验,如果模拟环境中运行的很好,而真实环境的效果很差,那么就是模拟环境有问题 

再者,和上面的思路一样,要找到一个比当前效果好的case 

上面使用的是svm,而这里他是让人来实际驾驶直升机从而得到一组参数,人驾驶的效果一定是很好的 

下面就和上面一样,如果这组参数是更优参数,那么就是最优化算法的问题,否则就是目标函数有问题

error analysis

这个其实是一个比较简单的思路

因为在实际系统中,会有很多组件组成,当我们要优化这个系统时,首先需要知道这个系统的bottleneck在什么地方 

比如,ng举例,从图片中识别人的系统, 

会有,背景去除,人脸识别,眼睛识别,鼻子识别,logistics回归算法。。。 

到底优化哪个会对系统的整体提升最大

方法是,如果要知道这个模块提升的空间,就将该模块替换成基准值,即100%正确的值,这样看系统准确率的提升

比如将背景去除替换成基准值时,准确率从80%提升到81%,那么你就知道这是不值得优化的,因为就是优化到100%也只能提升整体的1% 

如果将人脸识别替换成基准值,准确率从80%提升到90%,那么你就知道这就是系统的bottleneck

另外一个思路也很自然,就是当系统有很多特性的时候,你想知道到底每个特性对系统的贡献有多大? 

比如对于垃圾邮件分类,你加了一些特别的特性,发送ip,标点符号,语法分析 

如果想知道,每个特性对系统的贡献,

方法是,把这个特性拿掉,看看系统的损失是多大,称为ablate分析

本文章摘自博客园,原文发布日期:2014-06-25

继续阅读