斯坦福机器学习 第六周

(1) 评价一个学习算法

如何少走弯路?

以预测房价为例:

假如在预测房价的例子中,你已经完成了正则化线性回归,也就是最小化代价函数$J$的值。

假如在你得到你的学习参数以后,如果你要将你的假设函数放到一组新的房屋样本上进行测试,假如说你发现在预测房价时产生了巨大的误差,现在的问题是要想改进这个算法接下来该怎么办?

实际上你可以想出很多方法来改进这个算法的性能。

通常情况下我们会使用这几种方法:

  • 通过使用更多的训练样本

    但有时候更多的训练样本并不能解决问题。

  • 尝试选用更少的特征集

    你可以从众多的特征集中挑选一小部分来防止过拟合

  • 尝试选用更多的特征集

    也许目前的特征集对你来说并不是很有帮助,你希望获取更多游泳的特征数据。

  • 尝试再增加多项式特征的方法$(x_1^2,x_2^2,x_1x_2,…)$

  • 通过增大正则化参数$\lambda$

  • 通过减小正则化参数$\lambda$

机器学习诊断法引入

接下来首先介绍怎样评估机器学习算法的性能,然后具体讨论这些方法,它们也被称为”机器学习诊断法(Machine learning diagnostic)“。

Diagnostic: A test that you can run to gain insight what is/isn’t working with a learning algorithm, and gain guidance as to how best to improve its performance.

诊断法:这是一种测试法,你通过执行这种测试能够深入了解某种算法到底是否有用,并且也可以告诉你如何改进算法的效果。

诊断法是一种很有用的方法,可以更有效率地利用好你的时间,但同时也会花费一些时间来实现。

评估假设函数

当我们确定学习算法的参数的时候,我们考虑的是选择参量来使训练误差最小化。有人认为,得到一个非常小的训练误差一定是一件好事,但我们已经知道,仅仅是因为这个假设具有很小的训练误差并不能说明它就一定是一个好的假设函数,而且我们也学习了过拟合假设函数的例子。所以这推广到新的训练集上是不适用的。

那么,你该如何判断一个假设函数是过拟合的呢?对于这个简单的例子,我们可以对假设函数$h(x)$进行画图,然后观察图形趋势:

但对于特征变量不止一个的这种一般情况:

想要通过画出假设函数来进行观察,就会变得很难甚至是不可能实现的。

因此我们需要另一种方法来评估我们的假设函数。

评估假设函数的方法

如下给出了一种评估假设函数的标准方法:

假设我们有这样一组数据组:

虽然这里只有十组数据,但通常情况下我们都有成百上千组训练样本。

为了确保我们可以评估我们的假设函数,我们要做的是将这些数据进行三七分:

第一部分(70%)将成为我们的训练集(Training Set)

第二部分(30%)将成为我们的测试集(Test Set)

将所有数据按照7:3的比例划分,是一种常见的划分比例

现在我们有了一部分训练数据集:
$$
(x^{(1)}, y^{(1)}) \
(x^{(2)}, y^{(2)}) \
…… \
(x^{(m)}, y^{(m)})
$$

这里的$m$依然表示训练样本的总数。

剩下的部分数据将被用作测试数据:
$$
(x_{test}^{(1)}, y_{test}^{(1)}) \
(x_{test}^{(2)}, y_{test}^{(2)}) \
…… \
(x_{test}^{(m)}, y_{test}^{(m)})
$$

这里的$m_{test}$表示测试样本的总数。

注意:按照7:3的比例取数据时应该是随机选取的。

评估步骤详解

线性回归中

在线性回归中的训练/测试流程:

  1. 需要对训练集进行学习,得到参数$θ$。

    具体来讲就是最小化训练误差$J(θ)$。这里的是使用那70%的数据训练得出的结果。

  2. 计算出测试误差

    使用$J_{test}(θ)$来表示测试误差,我们要做的是取出之前从训练集中学习得到的参数$θ$带入到$J_{test}(θ)$来计算我们的测试误差。可以写成如下形式:

$$
J_{test}(\theta) = \frac{1}{2m_{test}}\sum_{i=1}^{m_{test}}(h_{\theta}(x_{test}^{(i)}) - y_{test}^{(i)})^2
$$

​ 这实际上是测试集平方误差的平均值。

分类问题中

训练和测试逻辑回归与之前所说的非常类似:

  1. 首先我们要从训练数据中(前70%)学习得到参数θθ
  2. 然后用下面的式子计算测试数据的误差值:

在分类问题中的测试误差$J_{test}(θ)$其实也被称作误分类率(也被称为0/1错分率)。表示你预测到的正确或错误样本的情况。

比如说可以这样定义一次预测的误差:

  • 当$h_\theta \ge 0.5$时,$y=0$
  • 当$h_\theta \le 0.5$时,$y=1$

这两种情况下我们的假设都对样本进行另外误判,否则其他情况下假设值都能正确的对样本$y$进行分类。
$$
err(h_\theta^{(x)}, y) \left{
\begin{aligned}
&= 1~if~h_\theta(x) \ge 0.5, y=0~or~if~h_\theta(x) \le 0.5, y=1\
&=0~otherwise
\end{aligned}
\right.
$$
然后就能应用错分率误差来定义测试误差,也就是:

$$
Test~error = \frac{1}{m_{test}}\sum_{i=1}^{m_{test}}err(h_\theta(x_{test}^{(i)}),y_{test}^{(i)}))
$$