机器学习-Ng-week6-机器学习的一些建议

一、机器学习的建议

(1)决定下一步做什么

假设我们的预测房价的线性回归模型在预测未知数据的时候出现了较大的误差,我们下一步可以怎么做呢?下面是几种方法:
1.获取更多的训练实例--通常是有效地,但是代价太大
2.减少特征的数量
3.获得更多的特征
4.增加多项式特征
5.减少正则化的程度机器学习-Ng-week6-机器学习的一些建议
6.增加正则化的程度机器学习-Ng-week6-机器学习的一些建议
这些方法并非胡乱的使用,而是运用一些机器学习诊断法(通过一种测试法,你通过执行这种测试,能够深入的了解某种算法到底是否有用。除此外,它还可以告诉李想要改进这种算法需要做怎么样有意义的尝试)来帮助我们知道上面哪些方法对我们的算法是有效的。

(2)评估一个假设

我们在选择模型的参数的时候,是希望代价尽可能的小,但是并不是误差特别小就一定是最好的,因为存在过拟合的问题,即使在训练集上有很小的训练误差,并不能说明这个是一个好的模型!那么我们如何判断函数的过拟合呢,第一种方法就是绘制图形的,我们对假设函数机器学习-Ng-week6-机器学习的一些建议进行画图,然后观察图的趋势,如下图,就是过拟合了!
机器学习-Ng-week6-机器学习的一些建议
但是对于一般的特征变量不可能只有一个,那很难绘制出假设函数的图像来进行观察。
第二种方法:我们会将数据集分成训练集和测试集,通常会将70%的数据作为训练集,30%的数据作为测试集。但是需要注意的是我们的数据必须足够的分布均匀,也就是要“洗牌”,之后再分成训练集和测试集!如下图:
机器学习-Ng-week6-机器学习的一些建议
我们将在训练集上训练出来的模型用到测试集上,我们有下面两种方法计算误差:
1.对于线性回归模型,我们利用测试集计算代价函数J:机器学习-Ng-week6-机器学习的一些建议
2.对于逻辑回归模型,我们可以利用测试集计算代价函数机器学习-Ng-week6-机器学习的一些建议,还可以使用误分类率(misclassification error)来测量:机器学习-Ng-week6-机器学习的一些建议机器学习-Ng-week6-机器学习的一些建议(对计算结果求平均值)

(3)模型选择和交叉验证集

我们使用60%的数据作为训练集,使用20%作为交叉验证集,使用20%作为测试集!!
如何选择模型呢?
1.使用训练集训练出10个模型,用到的训练误差=test error=机器学习-Ng-week6-机器学习的一些建议
2.用10个模型分别对交叉验证集计算得到交叉验证误差=cross validation error=机器学习-Ng-week6-机器学习的一些建议
3.选取代价函数值最小的模型
4.用步骤3选择出来的模型对测试集计算得出推广误差=test error=机器学习-Ng-week6-机器学习的一些建议

(4)诊断偏差和方差

当你运行一个学习算法时,如果这个算法的表现不理想,那么多半是下面两种情况:要么是偏差较大,要么是方差较大。换句话说就是要么是欠拟合,要么是过拟合。
机器学习-Ng-week6-机器学习的一些建议
我们通常会通过将训练集和交叉验证集的代价函数误差与多项式的次数绘制在同一张图像上你会发现:
1.对于训练集,当d较小时,模型拟合程度较低,误差较大;随着d的增长,拟合程度变高,误差变小。
2.对于交叉验证集,当d较小时,模型拟合程度较低,误差较大;但随着d的增长,误差呈现先减小后增大的趋势,转折点是我们的模型开始过拟合训练数据集的时候。
机器学习-Ng-week6-机器学习的一些建议
当交叉验证集误差较大的时候,我们如何判断是方差还是偏差?
1.训练集误差和交叉验证集误差近似的时候:偏差、欠拟合
2.交叉验证集误差远大于训练集误差时:方差、过拟合

机器学习-Ng-week6-机器学习的一些建议

(5)正则化和偏差、方差

当出现过拟合的时候,我们会使用正则化方法,但是对于参数机器学习-Ng-week6-机器学习的一些建议对正则化的程度有很大的影响。如下图
机器学习-Ng-week6-机器学习的一些建议
我们选择一系列的想要测试的机器学习-Ng-week6-机器学习的一些建议,它通常是0-10之间呈现2倍关系的值(eg:0,0.01,0.02,0.04,0.08,0.15,0.32,0.64,1.28,2.56,5.12,10共十个)。我们同样将数据分成训练集、交叉验证集、测试集!!!
机器学习-Ng-week6-机器学习的一些建议
如何选择机器学习-Ng-week6-机器学习的一些建议?方法如下:
1.使用训练集训练出12个不同程度正则化的模型
2.用12个模型分别对交叉验证集计算出交叉验证误差
3.选择得出交叉验证误差最小的模型
4.运用步骤3中选出模型对测试集计算得出推广误差,我们也可以同时将训练集和交叉验证集模型的代价函数误差与机器学习-Ng-week6-机器学习的一些建议的值绘制在一张图标上:
机器学习-Ng-week6-机器学习的一些建议
1.当机器学习-Ng-week6-机器学习的一些建议较小时,训练集误差较小(过拟合)而交叉验证集误差较大
2.随着机器学习-Ng-week6-机器学习的一些建议增大,训练集误差不断增加(欠拟合),而交叉验证集误差则是先减小后增加!

(6)学习曲线--是对学习算法的一个很好的合理检验(sanity check),是将训练集误差和交叉验证集误差作为训练集实例数量(m)的函数绘制的图像

利用学习曲线来判断某一个学习算法到底处于偏差还是方差问题。本质就是:当我们训练较少行的数据的时候,训练的模型将能够非常完美的适应较少的训练数据(训练误差小),但是训练出来的模型却不能很好的适应交叉验证集数据和测试集数据(交叉验证集误差大)。
机器学习-Ng-week6-机器学习的一些建议
那么我们如何使用学习曲线识别高偏差/欠拟合:
下图可以看出,如果我们只用一条直线适应下面的数据,可以看出来,无论训练集多大,误差都不会减小!!也就是说在高偏差/过拟合的情况下,增加数据到训练集不一定有帮助。
机器学习-Ng-week6-机器学习的一些建议
那么我们如何利用学习曲线识别高方差/过拟合?
下图可知:假设我们使用一个非常高次的多项式模型,并且正则化非常小,可以看出,当交叉验证集误差远小于训练集误差时,给训练集增加更多数据可以提高模型的效果。也就是说:在高方差/过拟合的情况下,增加更多数据到训练集可能可以提高算法的效果。(虽然当m增加的时候,机器学习-Ng-week6-机器学习的一些建议减小,机器学习-Ng-week6-机器学习的一些建议增大,但是两者的差距还是很大啊!!!----->当是高方差的时候,机器学习-Ng-week6-机器学习的一些建议机器学习-Ng-week6-机器学习的一些建议要大的多
机器学习-Ng-week6-机器学习的一些建议

(7)决定下一步做什么

下面介绍什么情况下使用什么解决方法:
1.获得更多的训练实例:解决高方差
2.减少特征的数量:解决高方差
3.获取更多的特征:解决高偏差
4.增加多项式特征:解决高偏差
5.减少正则化程度机器学习-Ng-week6-机器学习的一些建议:解决高偏差
6.增加正则化程度机器学习-Ng-week6-机器学习的一些建议:解决高方差
机器学习-Ng-week6-机器学习的一些建议
1.对于小的神经网络,参数较少,很容易导致欠拟合(高偏差),但计算代价较小,简单;
2.对于大的神经网络,参数较多,很容易导致过拟合(高方差),计算代价比较大,但是可以通过正则化来调整数据。
那么如何选择神经网络隐藏层的层数呢?通常从1层开始增加,为了更好地做出选择,可以把数据分成训练集、交叉验证集和测试集,针对不同层数的隐藏层的神经网络训练神经网络模型,如何选择交叉验证集最小的神经网络模型!!!

二、机器学习系统的设计

(1)首先要做什么-垃圾邮件分类器算法

如何构建它的特征向量X呢?我们可以选择100个最长出现在垃圾邮件中的词所构成的列表,根据这些词是否有在邮件中出现来获取我们的特征向量(出现为1,不出现为0),尺寸为100*1。
为了构建这个分类器算法,我们可以做很多事例如:
 1.收集更多的数据,让我们有更多的垃圾邮件和非垃圾邮件的样本;
2.基于邮件的路由信息开发一系列赋值的特征;
2.基于邮件的正文信息开发一系列复杂特征,包括考虑截词处理
4. 为探测刻意的拼写错误(把 watch 写成 w4tch)开发复杂的算法 

(2)误差分析-error analysis

当我们面对一个问题的时候,我们不管设计出来的系统怎么样,先让它跑一遍,最后通过交叉验证集来检验数据。一旦做完,你可以画出学习曲线,通过画出学习曲线,以及检验误差,来找出你的算法是否有高偏差和高方差的问题,或者别的问题。在分析后,再决定采用什么样的方法来解决问题。除了学习曲线,误差分析也是很重要的!你可以通过误差分析找出垃圾邮件分类的交叉验证集的那些案例被误判,这样可以启发你构造新的特征变量。

当你构建学习算法的时候有如下的步骤:
1.从一个简单的能快速实现的算法开始,实现该算法并用交叉验证集数据测试这个算法;
2.绘制学习曲线,决定是增加更多的数据,或者添加更多的特征,还是其他选择;
3.进行误差分析:人工检查交叉验证集中我们算法中产生预测误差的实例,看看这些实例是否有某种系统化的趋势。

(3)类偏斜的误差度量

偏斜类(skewed classes):我们训练集中有很多同一类的实例,只有很少或者没有其他类的实例。假设我们需要预测癌症是否是恶性的,在我们训练集中,只有0.5%的实例是恶性肿瘤。假设我们编写一个非学习而来的算法,在所有情况下都预测肿瘤为良性的,那么误差只有0.5%,然而我们通过训练得到的神经网络算法确有1%的误差。这时,误差的大小是不能视为评判算法效果的依据的。
所以我们提出了查准率(precision)和查全率(recall),分成下面四种情况:
1.正确肯定(true positive,TP):预测为真,实际为真
2.正确否定(true negative,TF):预测为假,实际为假
3.错误肯定(false positive,FP):预测为真,实际为假
4.错误否定(false negative,FN):预测为假,实际为真
查准率=TP/(TP+FP)=true positive/predicted positive,在所有我们预测有恶性肿瘤的病人中,实际上有恶性肿瘤的病人的百分比,越高越好。
召回率=查全率=TP/(TP+FN)=true positive/actual positive,在实际的有恶性肿瘤的病人中,成功预测为恶性肿瘤的病人的百分比,越高越好。
在上面我们预测病人肿瘤为良性的算法,查全率就是为0,因为TP=0

(4)查全率和查准率之间的权衡

沿用之前的预测肿瘤的例子,假使,我们算法输出的结果在0-1之间,我们使用阙值0.5来预测真和假。
机器学习-Ng-week6-机器学习的一些建议

如果我们希望只在非常确信的情况下,预测为真(肿瘤为恶性),即我们希望具有更高的查准率,我们可以使用比0.5更大的阙值,如0.7,0.9。这样做我们会减少错误预测病人为恶性肿瘤的情况,同时却会增加未能成功预测肿瘤为恶性的情况。如果希望提高查全率,尽可能得让所有有可能是恶性肿瘤的病人都得到进一步地检查、诊断,我们可以使用比0.5更小的阙值,如0.3。
我们可以将不同阙值情况下,查全率和查准率的关系绘制成图表,曲线的形状根据数据的不同而不同:
机器学习-Ng-week6-机器学习的一些建议

我们希望有一个帮助我们选择这个阙值的方法:计算机器学习-Ng-week6-机器学习的一些建议机器学习-Ng-week6-机器学习的一些建议,我们选择使得机器学习-Ng-week6-机器学习的一些建议最高的阙值。(P:precision,R:recall,当P=0 or R=0的时候,机器学习-Ng-week6-机器学习的一些建议;当P=1 or R=1的时候,机器学习-Ng-week6-机器学习的一些建议

(5)机器学习的数据

假设特征值有足够的信息用来预测y值,假设我们使用了一种需要大量参数的学习算法,比如有很多特征的逻辑回归或线性回归,或者带有很多隐藏层单元的神经网络,这些都是非常强大的学习算法,包含很多的参数,这些参数可以很好地拟合数据,算是低偏差的算法,训练误差很低了!假设我们使用了非常非常大的训练集,在这种情况下,尽管我们希望有更多的参数,但是如果训练集比参数的数量还大,甚至是更多的,那么这些算法就不太可能会过度拟合,也就是训练误差有希望接近测试误差!
机器学习-Ng-week6-机器学习的一些建议