机器学习的一些建议

点击量:424

在全部学完课程里的机器学习算法之后,我们总结下Andrew Ng对于这门学科的一些建议,其实主要是线性回归和逻辑回归的一些debug技巧。本文覆盖Coursera Machine Learning Week 6的内容。

评估假设函数(Evaluating a hypothesis)
比如我们找到了合适的模型,经过训练得到了最终的假设函数,那我们该如何评估这个假设函数以判断他是否过拟合了或者欠拟合呢?很简单,我们把数据集分为两部分:训练集(training data set)测试集(test data set),这两者的比例大概是70%和30%。使用训练集学习得到参数\(\Theta\),使用测试集计算误差\(J_{test}(\Theta)\)。具体地,

  • 对于线性回归,我们计算:\(J_{test}(\Theta)= \frac{1}{2m_{test}}\sum_{i=1}^{m_{test}}(h_{\Theta}(x_{test}^{(i)})- y_{test}^{(i)})^{2}\)
  • 对于分类问题,我们先计算错误的分类误差(Misclassification error):$$err(h_{\Theta}(x),y) = \left\{\begin{matrix}
    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)
    假设给定了多个不同多项式次数的模型,我们该选择哪个最为最佳的模型呢?方法跟上一部分介绍的类似,只不过我们把数据集分成了三块:

  • 训练集(Training Data Set)60%:训练模型,得到参数\(\Theta\)
  • 交叉验证集(Cross Validation Data Set)20%:计算误差,选择拥有最小误差的模型
  • 测试集(Test Data Set)20%:测试交叉验证得到的模型的泛化能力


  • Bias(方差) Vs. Variance(偏差)
    一般地,在线性回归中如果遇到拟合不好的情况基本都是过拟合(overfitting)或者欠拟合(underfitting)。过拟合又被称为:high variance problem(高偏差);欠拟合又被称为high bias problem(高方差)。我们用一个简单的二维函数图像来解释他们之间的关系:

    那么我们如何诊断出一个问题是欠拟合还是过拟合呢?首先,我们绘制出训练集的误差\(J_{train}(\Theta)\)以及交叉验证集的误差\(J_{cv}(\Theta)\)和多项式次数的关系,如下图所示:

    观察上图可以发现,在黑色竖线左边的就是欠拟合,而右边的则是过拟合。具体地,

  • 高方差/欠拟合(high bias/underfitting):\(J_{train}(\Theta)\)和\(J_{cv}(\Theta)\)都比较大,并且\(J_{train}(\Theta) \approx J_{cv}(\Theta)\)。
  • 高偏差/过拟合(high variance/overfitting): \(J_{train}(\Theta)\)很小,但是\(J_{cv}(\Theta)\)远大于\(J_{train}(\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\)非常大时,为了\(J(\theta)\)最小,那么\(\theta\)的值必然约等于0,那么假设函数就变成:\(h_{\theta}(x) = \theta_{0}\),那么就会变成图一最左边所示的欠拟合问题;
  • 同理,当\(\lambda\)很小,趋近于0时,那么假设函数就会变成高次多项式,于是就会变成图一最右边所示的过拟合问题;
  • 也就是说,我们可以通过调节\(\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)为预测正确的正例占所有预测为正例的比例,公式如下:
    $$
    precision = \frac{true \ positives}{no. \ of \ predicted \ positives} = \frac{true \ positives}{true \ positives + false \ positives}
    $$
  • 召回率(recall)为预测正确的正例占实际正例的比例,公式如下:
    $$
    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,自动驾驶等都用到了深度学习技术,所以男神推出这门课的时机太恰当了,必须学!

    机器学习的一些建议》上有1条评论

    发表评论

    电子邮件地址不会被公开。 必填项已用*标注