斯坦福公开课——机器学习课程(五)

引言

本次主要从机器学习系统上讲解,如何能更好的设计一个机器学习系统,以及如何优化你的系统。


过多的优化选择

还是以房价预测为例,如果你已经有了一个训练好的模型,可是你发现,效果并不如意,这个时候你该怎么办?

  • 砸烂电脑
  • 砸烂电脑
  • 砸烂电脑

除此之外,反正我是想不到什么好办法的XD。

正经来说,可以有如下选择:

  • 多弄一点训练样本
  • 试着增加或减少特征
  • 改变正则化率
  • 改变学习率
  • balabala······

太多了,那你会选什么?一般人都会凭直觉,随便选一个。但是实际上,有一种简单的方法,帮你排除掉没什么卵用的改进方案。

不要999,不要889,只要你继续看~


机器学习诊断法(Machine learning diagnostic)

更好地判断过拟合和欠拟合

是一个很老套的方法,也许你已经听过了,就是把你的数据集分为训练集和测试集,一般为7:3的比例。

在训练的时候只拿训练集用来训练,训练结束用测试集来验证模型的拟合程度。

模型选择问题

在模型评价这个问题上,只使用训练集和测试集两个部分,并不能很公平的做到多个模型之间的评价。所以我们将数据分为训练集、交叉验证集(验证集)、测试集三个部分。一种典型的分法为6:2:2

这样的做法意义在于,当你有多个模型的时候,你可以用验证集来评价模型之间的好坏,因为你用验证集挑选了一个好模型,所以不能用验证集来评价这个模型的泛化能力,所以要用测试集来验证。

到底是欠拟合还是过拟合

对于一个多项式来说,可以看看这个图:


横轴是多项式的项数,纵轴是误差。项数特别小的时候,对于非线性的拟合就不好,就会欠拟合,也就是偏差过大。当项数太大的时候,拟合程度就会过好,就是过拟合。

对于正则化率来说,看看下图:


当正则化率很小的时候,模型能够尽可能的拟合数据,所以训练误差显得很小,但是对于未知的数据,就会拟合的不好,就会出现过拟合。而对于过大的正则化率,模型拟合数据本身就不好,更别说新的数据,所以就是欠拟合。


学习曲线

高偏差

在高偏差的时候,也就是欠拟合的时候,你会发现训练集的数据量和误差之间有这样的关系:


当训练集数量很小的时候,不论怎么样的模型都能很好的拟合,所以训练误差小,然而并不符合真实的数据,所以验证误差很大。当训练数据越来越多,两者之间的差值就会越来越小,但是高偏差也就是欠拟合的时候,误差值都会偏大。而最后两个误差会越来越接近。

高方差

在高方差的时候,也就是过拟合的时候,你会发现训练误差的情况和之前差不多,但是验证误差会一直保持在一个较高的水平。


而且训练误差和测试误差会有一段比较大的差距,但是随着数据集的增加,两者之间的距离会减小,所以在高方差的情况下,增加数据集确实会有助于减小误差。


对的时间做对的事

其实就是总结一下,到底什么情况,用什么方法会有效果。

  • 多搞一点数据集 —> 高方差
  • 减少特征 —> 高方差
  • 增加特征 —> 高偏差
  • 增加合成特征 —> 高偏差
  • 增加λ —> 高偏差
  • 降低λ —> 高方差

科学 构建机器学习系统

如何科学有效的构建一个机器学习系统,是有一定的步骤可循的,所以不要像无头苍蝇一样,乱试。

  • 首先最多花一两天的时间,快速构建一个简单的系统,即使不是那么好用。然后用交叉验证来验证系统。
  • 然后可以画学习曲线,通过学习曲线来检查模型的问题。
  • 误差分析:亲自检查一下结果出错的样例,拿分类里面专业的话来说,就是假正例和假负例。这样做或许会对你改进模型有帮助。
  • 数值分析:用验证集的误差来评估不同方法之间的优劣。

偏斜类(Skewed Classes)

当你有了上面的工具,你就可以比较好的评估自己的各种模型了,但是这里还有一个比较微妙的问题,会微妙的影响你的模型,那就是偏斜类。

偏斜类其实就是说,当你在做分类的时候,某一类的样本数量会远大于别的样本的数量,导致的问题。

举个栗子,拿肿瘤患者分类来看,在样本中,没有患肿瘤的样本比患肿瘤的样本要大得多,就以0.5%为患有肿瘤的样本比例。训练好后拿测试集来看,只有1%的误差,貌似很好,但想象一下如下情景:我们拿一段代码,将所有的样本都预测成没有患肿瘤的,那么最后的误差仅仅只有0.5%。

这样仅仅只是将结果全部预测成大样本的结果,就可以达到比机器学习更低的误差,就是一种迷思。

所以当你在得到一个模型,它的正确率是99.2%,然后你改进了一下模型,正确率上升到了99.5%,那么这个上升,到底是真的改进了模型,还是仅仅只是让模型变成了一个总是预测大样本结果的机器呢?

所以你有一个偏斜类的时候,正确率并不是很好的能评估模型的好坏。

准确率(Precision)和召回率(Recall)

拿二分类来讲,一个样本,从实际情况来讲,分为0和1两种情况,从预测结果来讲也分为0和1两种结果,两两配对,每个样本就有了四种不同的可能,如下图:

  • 当真实值是1,预测值也是1的时候,称为真正例,对应左上角。
  • 当真实值是0,预测值也是0的时候,称为真负例,对应右下角。
  • 当真实值是1,预测值也是0的时候,称为假正例,对应左下角。
  • 当真实值是0,预测值也是1的时候,称为假负例,对应右上角。

所以这里的准确率就是:真正例/(真正例+假正例)

区分于上面的正确率,正确率是:预测正确数量/总数量,用上面的写也就是(真正例+真负例)/(真正例+真负例+假正例+假负例)

对于准确率来说,意义就是我们预测的患癌患者中,有多少是真的患癌症了;或者换个说法,我们预测的这个患者患癌的准确率到底有多少。

召回率就是:真正例/(真正例+假负例)

召回率的意义在于,真正患有癌症的患者,有多少人是我们能确诊的。

再回头来看上面那个总是预测不患癌正的模型,他的召回率就是0。

所以对于偏斜类来说,拥有高的准确率和召回率才是好的模型。


平衡准确率和召回率

在准确率和召回率之间,会有一种奇妙的平衡,一边高,一边就会偏低。所以在两者之间找一个平衡或者取舍,就有些许技巧可言。

还是预测癌症为例。以前我们预测是当h函数输出大于0.5的时候结果为1

如果我们想在很确信这个人得了癌症的情况下才告知他。那么将0.5->0.7,这样你预测为1的准确率就会上升,但是召回率就会有所降低。

如果我们想尽可能的不漏掉任何一个患癌症的人,那么将0.5->0.3,这样你预测为1的召回率就会上升,但是准确率就会有所降低。

那么在这样的问题中,h函数的输出值就成了一个临界值。那么这个临界值就会影响模型的准确率和召回率。

F Score

当我们评价一个模型的时候,我们总希望能有一个数值来评价。但是通过上面的观察,会发现在这样的问题上,我们有了两个数值。这里有三个模型:


你很难评价,到底是模型1好还是模型2好,然后当你坐下来想这个问题的时候,你的效率就被拉低了。

我们很容易想到,用准确率和召回率的平均值,但是通过上面的例子可以发现,模型3的平均值最大:


但是模型3却不是一个好模型,太极端。所以平均值并不好使。

这里就用到了F Score

通过F Score我们可以看出模型一会比较好使:


大数据集的迷思

关于大数据集,以前有一些人就做了一个实验:实验中,问题是一个句子里面缺一个单词,然后从一些看起来很相似的单词里面挑出最适合的(听起来是不是很耳熟XD);他们选了很多个算法模型,对比不同数据量时,算法的性能。然后得出了下面这个图。


可以看得出来,不同的算法之间虽然有优劣之分,但是都会随着数据量的增加,正确率有所上升。

那么反过来想,到底什么时候大数据量会对模型有帮助。有一个很有用的测试就是,你把你的模型里的特征拿给一个人类专家,如果人类专家可以根据你模型里面的特征得到一个比较准的预测,那么这个模型特征就是足够的。

如果模型特征不够充足,那么数据量的增加对模型是没有帮助的。在充足的特征下,会得到一个较为复杂的模型,就会得到一个低偏差结果,根据上面讨论的,在低偏差的情况下,增大数据量可以防止过拟合。

所以在你拥有一个足够复杂的模型时,大数据量常常能帮你取得好的结果。


后记

直到这里,第六周的内容结束了,课程也过半了,还需加油呀。