您的位置:首页 > 其它

机器学习之&&Andrew Ng课程复习--- 怎样选择机器学习方法、系统

2014-12-02 16:57 441 查看
通过Ng公开课前些章节的学习,我们已经掌握了部分机器学习算法,可是怎么样选择合适的算法去解决自己的问题,构建属于自己的机器学习系统呢?Ng第六堂课给了我们答案。
Ng的关注重点是:假如你在开发一个机器学习系统,或者试着改进一个机器学习系统时,你应该如何决定接下来应该如何做。为了解释这个过程,我们仍然使用预测房价的例子,假设我们已经实现了用规则化的线性回归方法预测房价:



这个就是最小化代价函数J(θ),在你得到你的学习参数以后,但发现该预测应用于一个新的训练数据上时有很大误差(error),(有可能是过拟合)这时候你想改进该算法,应采取一些解决方案:
Get more training examples
Try smaller sets of features
Try getting additional features
Try adding polynomial features (e.g. x1^2, x2^2,x1x2...)
Try decreasing λ
Try increasing λ
这么多方法,人们应该选择哪一个或者哪几个方法去改进现有的算法呢,通常大多数人们都随机选择一个或者几个进行尝试,盲目随机,走了很多弯路,其实存在科学的方法帮大家从以上几种方法中去除几个,留下似乎很有前途的方法,从而节省大量的时间。接下来的俩小结,分别从怎么样评估机器学习算法的性能,和讨论机器学习诊断法入手。
Machine Learning 方法的诊断:
- 什么是诊断Dignostic呢?诊断就是能够判断一种学习算法能不能work,并且改善该算法性能的一个测试。
Diagnostic: A test that you can run to gain insight whatis/isn't working with a learning algorithm, and gain guidance as to how best toimprove its performance.
-诊断的效果:Diagnostics can take time to implement, but doingso can be a very good use of your time.



评价方法假设——Evaluating a hypothesis
在过去,我们确定学习算法的参数时,我们考虑的是选择参数使得训练误差最小化,有人认为得到训练误差最小一定是一个好事,但事实证明,仅仅是训练误差最小不一定是一个好的假设,有可能过拟合,那么怎么证明或者发行过拟合现象的出现呢。画图仅仅适合低纬的假设,那么我们需要另外一种评价假设的方法,如下给出了一种评价假设的标准方法。

首先呢,我们将所有数据分为两个集合,一个Trainning set和一个Testing set,用Training set得到参数向量,用Testing set进行测试(比如分类)。(训练集和测试集都随机选取)





我们已经知道了学习一个假设,我们需要costFunction在训练集上最小,现在我们需要CostFuntion在测试集上也能达到最小值,这样我们的模型理论上是最优的模型。(其实还是不公平、不准确的,因为我们在模型选择的时候就是利用测试集上的CF最小来确定的,模型确定以后,验证其泛化能力又用测试集来验证显然不公平,解决方法后面会讲)
这时,将test set的error分为线性回归linear regression和逻辑回归logistic regression两类

线性回归的error:



逻辑回归的error:



模型选择和训练、验证实验数据
什么是模型选择?比如最适合你手中数据的多项式的次数是几次?怎么样选择正确的特征来构造学习算法,或者你要正确选择正则化参数中的lambda的值,你应该怎么做?This isModelSelection!!(终于找到了学习的热情,拼拼拼)

面对模型选择问题,如何才能得到一个just fit的模型而不会导致underfit 或者overfit呢?(前面我已经讲了传统思维分数据集为训练和测试集已经不能为我们提供有效的方案)我们引入一类数据集,叫做cross validation set,即交叉验证数据集。将所有数据按<6,2,2>分为training set , crossvalidation set , testing set三类最典型的分配为(60% 20% 20%),如下图所示:



其error计算公式如下,其实三类计算方法大同小异,相同的公式只是换了数据及而已:



进行模型选择的方法其实很简单,对应下图大家来看:

-首先,建立d个model 假设(图中有10个,d表示其id),分别在trainingset 上求使其training error最小的θ向量,那么得到d个θ

-然后,对这d个model假设,带入θ,在crossvalidation set上计算J(cv),即cv seterror最小的一个model 作为 hypothesis,如下图中J(cv)在第4组中最小,便取d=4的假设。

PS: 其实d表示dimension,也就是维度,表示该hypothesis的最大polynomial项是d维的。

PS: 一般地,J(cv)是大于等于J(train)的

PS:为什么这么做?这样我们就为测试集数据留了一条路,因为它没有和假设拟合过,这样我们可以用它来评测模型的泛化能力。





区别诊断偏离bias和偏差(方差)variance

当你运行一个学习到的算法时,出现效果不好,多半是因为以下俩种情况:1、偏离过大2、偏差过大。即欠拟合、过拟合。那么它俩哪个和欠拟合、哪个和过拟合有关呢,或者是俩者都相关?如果我们能判断出其算法的过拟合或者欠拟合的状态,对于我们改进算法很有帮助。

我们来看看下图:



我们给大家区分两个概念:bias vs. variance。如下图所示为error随不同dimension的model变化图,可以想见,随d上升是一个由underfit到overfit的过程,这个过程中,training set的error逐渐下降,而cv
set的error先降后升。(详细解释请猛戳这里http://blog.csdn.net/ywl22/article/details/8606166)



上图显示

bias:J(train)大,J(cv)大,J(train)≈J(cv),bias产生于d小,underfit阶段;

variance:J(train)小,J(cv)大,J(train)<<J(cv),variance产生于d大,overfit阶段;



练习题:



模型选择和训练、验证实验数据
我们知道算法正则化可以避免过拟合,那么正则化和bias、Variance有什么关系呢?下面我们深入研究下bias、Variance是如何相互影响的,以及和算法的正则化之间的相互关系。
首先我们回忆下正则化,
regularization就是为了防止overfit而在cost function中引入的一个分量。看下图吧,regularization项就是cost function
J(θ)中的最后一项,其中λ太大导致underfit,λ太小导致overfit……



图1显示,如果我们给lambda一个较大的值比如10000,那么相当于给参数θ一个较大的惩罚,这时候我们得到大θ将特别小,几乎约等于0,h(θ)
= θ0,这样我们学习得到的模型将欠拟合,即高bias。
图3显示,如果我们给lambda取一个较小的值,比如等于0,(相当于没有正则化项)这时我们如果拟合一个高次多项式,如果没有正则化项或者正则化程度很小的时候,会造成过拟合,高Variance。
图2显示,显然,只有我们取一个合适的Lambda值,我们才能得到一组合理的参数θ,那么我们应该怎么样自动选择出一个最合适的正则化参数Lambda呢,
首先,将λ从0,0.01,一直往上每次乘以2,那么到10.24总共可以试12次λ。
这12个λ会得到12个model的 cost function,每个对应有J(θ)和
Jcv(θ).
和模型选择的方法相同,首先选出每个cost function下令J(θ)最小的θ,然后取出令Jcv(θ)最小的一组定为最终的λ。



练习题:



下图表示的是正则化参数lambda、bias、Variance以及训练集、交叉验证集上损失函数的影响图。



λ太小导致overfit,产生variance,J(train)<<J(cv)
λ太大导致underfit,产生bias,J(train)≈ J(cv)

===============================
Learning Curves
什么时候增加训练数据training set才是有效的?
绘制学习曲线非常重要,也许你想检查你的学习算法运行是否一切正常,或者你想改进算法的表现或效果,那么学习曲线就是一种很好的工具,Ng经常用学习曲线来判断某一个学习算法是否处于偏差 方法的问题或是二者皆有,下面我们来看看如何绘制一条学习曲线。

为了绘制一条学习曲线,通常先绘制出Jtrain 也就是训练数据集的平均误差平方和,

Jcv表示交叉验证集数据的平均误差平方和,我们要将其绘制成一个关于参数m的函数,也就是关于训练集样本总数的函数,所以m一般都是一个常数,但这里我们对m的取值做一些限制,比如取m为1,4,10,20,30,40几组数据然后绘制出训练集误差,其他样本选择性的忽略。从下图我们可以看到,当m很小的时候,训练误差非常小,因为训练集少,我们可以完全拟合这些少量的数据,但随着m的增大,拟合效果开始下降,即Jtrain开始增大。那么对应的交叉验证集误差呢?当训练集很小的时候,训练的模型泛化能力很差,不能很好地适应新样本,所以Jcv会随着m增大而减少,泛化能力增加。



我们分别就High Bias
和 High Variance来看看学习曲线的变化,以及增加training set个数,即m,是否有意义?!
下图显示:Underfit的highbias:增加m无济于事,因为模型本身就拟合的很差。



下图显示:OveryFit的Highvariance:增加m使得Jtrain和Jcv之间gap减少,有助于performance提高。



练习题:



综上:增加训练数据的个数对于过拟合是有用的,对于underfit是徒劳!

===============================
Deciding what to try next
我们已经学了怎么样评价一个机器学习系统的性能,模型选择中的bias、variance的意义、区别等,这些诊断方法如何帮助我们弄清哪些方法有助于改进学习算法的效果,哪些又是徒劳。让我们回到最初的例子,在那里找到答案。(如下图)



以上这些方案哪些可以帮助我们更好的改进算法。根据上节学习曲线图可以很快的给出答案。
最后我们回顾一下以上内容,并且看看它们和神经网络的联系,Ng给大家提供了一些很实用的经验和建议(神经网络建模的结构选择或者连接形式的一些技巧)
在神经网络拟合的时候你可以选择一种,比如说一个相对比较简单的神经网络模型(隐藏单元比较少),因为这样的神经网络,学习参数比较少,但很容易出现欠拟合,不过计算量相对应的也就较小。相反,复杂的神经网络结构复杂、有很多隐藏层,容易出现过拟合。但这种神经网络的优势是学习出的结果,性能会很好,但计算量很大。一般一个复杂的神经网络通过正则化修正过拟合后的结果要明显好于一个简单的神经网络的效果。但是隐藏层的选择通常也是一个困难的问题,经验是选择一个隐藏层比较合理。比如我们可以把数据分割成训练、验证、测试三个部分,然后分别计算不同隐藏层数的神经网络结构在验证集上的表现,从而来确定神经网络层数。



练习题:



综上所述,选择最佳拟合model的问题,是machine learning的常见问题,以上内容可以帮助我们更好的选择一个最佳的模型,更好的应用到机器学习的应用中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐