点击量:908
在全部学完课程里的机器学习算法之后,我们总结下Andrew Ng对于这门学科的一些建议,其实主要是线性回归和逻辑回归的一些debug技巧。本文覆盖Coursera Machine Learning Week 6的内容。
评估假设函数(Evaluating a hypothesis)
比如我们找到了合适的模型,经过训练得到了最终的假设函数,那我们该如何评估这个假设函数以判断他是否过拟合了或者欠拟合呢?很简单,我们把数据集分为两部分:训练集(training data set)和测试集(test data set),这两者的比例大概是70%和30%。使用训练集学习得到参数\(\Theta\),使用测试集计算误差\(J_{test}(\Theta)\)。具体地,
1 & if \ h_{\Theta}(x)\geq 0.5 \ and \ y = 0 \ or \ h_{\Theta}(x)< 0.5 \ and \ y = 1 \\ 0 & otherwise \end{matrix}\right.$$然后计算错误率:$$Test Error = \frac{1}{m_{test}} \sum_{i=1}^{m_{test}}err(h_{\Theta}(x_{test}^{(i)}), y_{test}^{(i)}) $$
有了两组数据之后我们就知道所得到的模型是否是过拟合了,比如模型在训练集上表现的很好,但是在测试集上的误差非常大,那么就说明这个模型过拟合了,泛化能力太差。
模型选择(Model Selection)
假设给定了多个不同多项式次数的模型,我们该选择哪个最为最佳的模型呢?方法跟上一部分介绍的类似,只不过我们把数据集分成了三块:
Bias(方差) Vs. Variance(偏差)
一般地,在线性回归中如果遇到拟合不好的情况基本都是过拟合(overfitting)或者欠拟合(underfitting)。过拟合又被称为:high variance problem(高偏差);欠拟合又被称为high bias problem(高方差)。我们用一个简单的二维函数图像来解释他们之间的关系:
那么我们如何诊断出一个问题是欠拟合还是过拟合呢?首先,我们绘制出训练集的误差\(J_{train}(\Theta)\)以及交叉验证集的误差\(J_{cv}(\Theta)\)和多项式次数的关系,如下图所示:
观察上图可以发现,在黑色竖线左边的就是欠拟合,而右边的则是过拟合。具体地,
正则化和方差/偏差(Regularization&Bias/Variance)
了解了高方差/高偏差的概念之后,我们来介绍下正则化和方差/偏差的关系。对于线性回归而言,假如我们选择如下模型:
$$h_{\theta}(x) = \theta_{0}+\theta_{1}x+\theta_{2}x^{2}+\theta_{3}x^{3}+\theta_{4}x^{4}$$
它的代价函数为:
$$J(\theta) = \frac{1}{2m}\sum_{i=1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})^{2} + \frac{\lambda}{2m}\sum_{j=1}^{m}\theta_{j}^{2}
$$
也就是说,我们可以通过调节\(\lambda\)的值来解决方差和偏差问题。简单地,我们可以对不同的模型不断尝试不同的\(\lambda\)值(比如:\(\lambda \in \left \{ 0,0.01,0.02,0.04,0.08,0.16,0.32,0.64,1.28,2.56,5.12,10.24 \right \}
\)),然后绘制出训练集的误差\(J_{train}(\Theta)\)以及交叉验证集的误差\(J_{cv}(\Theta)\)和\(\lambda\)的关系,然后我们选择使得交叉验证集的误差\(J_{cv}(\Theta)\)最小的\(\lambda\)即可。
学习曲线(learning curve)
所谓的学习曲线指的是训练集的误差\(J_{train}(\Theta)\)以及交叉验证集的误差\(J_{cv}(\Theta)\)与样本数据量\(m\)之间的关系。一般地,

它有个特点:\(J_{train}(\Theta)\)和\(J_{cv}(\Theta)\)在数据量到达一定程度之后两者几乎相同,但是比目标误差(desired performance)还是大好多,这种情况下,增加再多的数据也无济于事。

\(J_{train}(\Theta)\)和\(J_{cv}(\Theta)\)都比较小,但是他们之间还是有一定的差距,这样话增加训练样本量很有可能提高系统的性能。
如何解决欠拟合/过拟合问题?
[table]
解决过拟合问题(fix high variance),解决欠拟合问题(fix high bias)
训练更多的数据 , 增加多项式特征
减少特征数量, 增加特征数量
增加\(\lambda\)的值, 减少\(\lambda\)的值
[/table]
注意,本文提及到的\(J_{train}(\Theta)\)和\(J_{cv}(\Theta)\)都不需要正则化,也就是说这两个函数里的\(\lambda=0\)。
如何处理偏斜类数据(Handling Skewed Data )
所谓的偏斜类指的是在训练分类器的样本数据中,正反类样本数据量的比值是非常极端的,特别大或者特别小。比如在预测癌症肿瘤的案例里,样本中得癌症的数量肯定远小于没得癌症的数量。此时如果我们还使用准确率来预测一个人是否有癌症,那么得到的准确率可能会很高,比如95%?但这个值并不能帮助我们判断这个算法的性能是否足够好,因为样本里的大部分都是没有癌症的,即使我随便写一行代码:把所有的预测结果都输出为\(y=0\)准确率也会很高,所以我们需要新的评价手段来对付这种偏斜类的预测效果。
查准率(precision)和召回率(recall)
在定义这两个概念之前我们先看一个表格:
这个表格中的True/False表示预测的是否正确,而Positive/Negative表示的是预测结果是正例/反例。
于是,我们定义:
$$
precision = \frac{true \ positives}{no. \ of \ predicted \ positives} = \frac{true \ positives}{true \ positives + false \ positives}
$$
$$
recall = \frac{true \ positives}{no. \ of \ actual \ positives} = \frac{true \ positives}{true \ positives + false \ negatives }
$$
其实,这两个公式之所以能解决上面的问题,是因为我们没有把偏斜类算进去!
F1 Score
有时候precision和recall是不能两者兼得的,precision大了,recall就会变小;precision小了,recall就会变大。这里我们引入一个新公式把两者结合起来:
$$F_{1} \ Score = 2\frac{PR}{P+R}$$
课程结语:
其实这个课程早就上完了,只不过直到今天才把这个系列的文章写完,坚持认真做完一件事情真不太容易,但完成了之后还是很有成就感的。我为什么要花这么多时间把这门课程的学习心得写下来呢?当时理解了不就好了吗?一是随着时间的流逝学过的东西可能会忘掉;二是写文章的时候会强制自己再理清一遍思路,会加深对知识的理解啊。认真学完这门课程算也是勉强入门了吧,但是前面还有很长的路要走啊。最近听闻男神Andrew Ng在Coursera上又开了一门新课Deep Learning,不得不说machine learning学到现在也就是各种数据的拟合,感觉并木有传说的辣么智能。然而deep learning则在这几年大放异彩,AlphaGo,自动驾驶等都用到了深度学习技术,所以男神推出这门课的时机太恰当了,必须学!
感受学习的力量!