《Hands-On Machine Learning》学习笔记-1.4 机器学习面临的挑战

机器学习概述

机器学习的主要挑战

简单来说,机器学习的主要任务就是挑选一个算法,并在数据集上训练它。因此,就有两个方面主要的问题:坏数据和坏算法。

训练数据数量不够

要教一个幼儿学习什么是苹果,你只需要指着一个苹果说“这是苹果”,多重复几次,小孩子就能认出各种各样苹果了,但是机器学习不是这样的,大多数机器学习算法要想正常工作,都需要大量的数据。即使对于非常简单的问题,往往也需要上千组数据,对于一些复杂的问题,比如图像或语音识别,可能需要上百万组数。

The Unreasonable Effectiveness of Data(不知道咋翻译)

在2001年的一篇著名的文章中,微软的两位研究人员指出,如果有足够多的数据,不同的机器学习算法,包括很简单的算法,在自然语言消歧问题上都能有较好的表现。

正如作者所说“这个结果提示我们要重新思考该把钱和时间花在算法的研发还是语料库(数据集)的开发上”

对于复杂问题,数据比算法更重要这一想法最早是由Peter Norvig 于2009年 在一篇名为 The Unreasonable Effectiveness of Data 的文章中提出的。但是需要注意的是,小型和中型的数据集仍然非常普遍,获取大量数据仍然不是一件非常便宜或者简单的事情,因此,不要抛弃算法

训练数据不具有代表性

要想算法泛化的好,就要求训练数据能够代表想要泛化的新实例,无论你采用基于实例的算法还是基于模型的算法。

比如,我们之前所使用的用来训练线性模型的国家数据集就不具有很好的代表性,一些国家的数据是缺失的。将缺失国家的数据添加进去之后,数据的表现如图1.21所示

《Hands-On Machine Learning》学习笔记-1.4 机器学习面临的挑战_第1张图片

图1-21 更具代表性的训练样本

如果使用现在的数据集训练线性模型,将会得到实线所表示的模型,而原来的模型是虚线所表示的。可见,将缺失的数据加上不仅改变了模型的参数,更重要的是这说明原来的模型可能无法做出正确的预测。

使用对于要归纳的情形具有代表性的数据十分重要,但是说起来容易做起来难,如果样例集过小,可能会有样本噪声,即使样本量足够,如果采样方法不当,同样可能存在样本不具有代表性的问题,这被称为“抽样偏差”。

低质量数据

显而易见,如果训练集中的数据满是错误、异常和噪声,那么想要发现数据中隐含的模型是很困难的,因此系统往往也不可能很好的工作。因此,清洗数据往往是一件很有意义的工作,真相就是,大部分的数据科学家都在这件事情上花费了很大的时间和精力。例如:

  • 如果一些实例明显是异常,那么剔除它或者人工修改数据异常都是很有用的
  • 如果一些实例中缺少一些特征,那就要决定是忽略这些缺失的属性、忽略这个样本、将缺失的数据补齐还是训练两个模型,一个包含这些特征,另一个不包含,如此种种。

不相关的特征

训练数据只有包含了足够多的的相关特征,而不是不相关特征,系统才能不断的“学习”。机器学习项目成功的关键就是要在足够好的特征上进行训练。这个过程被称为特征工程,包括:

  • 特征选择:在多种特征中荀泽最有用的特征进行训练
  • 特征抽取:将已存在的特征组合成一个更有用的特征
  • 通过收集新数据来创造新的特征

接下来介绍“坏算法”的例子。

过拟合训练数据

假设你在一个完全陌生的国家乘坐出租车,司机抢劫了你,你就会觉得这个国家的所有的司机都是贼。以偏概全是人类通常会犯的错误,不幸的是,如果我们不足够小心,机器学习也会陷入同样的陷阱,这被称作“过拟合”,通常是指模型在训练集上表现的很好,但是泛化效果却欠佳。

图1-22就是高阶多项式拟合的幸福指数模型,由图可见,虽然它在训练集上拟合的很好,但是你真的相信这个模型的预测么?
《Hands-On Machine Learning》学习笔记-1.4 机器学习面临的挑战_第2张图片图1-22 过拟合训练数据

复杂模型,如深度神经网络等,可以检测到数据中的微妙的模型,但是如果数据中噪声较多,或者数据集过小,模型就很可能检测到噪声中的模型,显然这样的模型不可能泛化的很好。比如在上边的生活幸福指数的例子中,如果在模型中假设幸福指数与国家的名字有关,那么复杂模型就可能会发现名字中含有w的国家的幸福指数都超过7,那这个模型对卢旺达和津巴布韦怎么解释?显然,“名字中含有w的国家的媳妇指数都超过7”这件事情在纯属偶然,但是模型却无法判断哪些特征是真的,哪些是噪声。

警告:当模型相对训练数据的数量和噪声而言过于复杂时,就会发生过拟合。通常的解决途径是:

  • 简化模型,选择一个特征少一点的模型
  • 收集更多的训练数据
  • 减少训练数据中的噪声

简化模型,降低过拟合的风险称为”正则化“。例如,我们之前定义的线性模型有两个参数, θ 1 \theta_1 θ1 θ 2 \theta_2 θ2,这就是说算法有2个自由度去调整参数以适应训练数据:它既能调整 θ 1 \theta_1 θ1,也能调整 θ 2 \theta_2 θ2。如果我们设定 θ 1 = 0 \theta_1=0 θ1=0,算法就只有1个自由度,也就是只能调整 θ 2 \theta_2 θ2,这样的话算法想要适应训练数据就很难,因为它只能上下移动直线,最终也就只能停留在平均值附近。如果我们允许算法调整 θ 1 \theta_1 θ1,但是将其限制在一定范围内,那么算法就获得了1到2之间的自由度。这样的话,算法比2自由度的算法要简单,比1自由度的算法要复杂。我们需要在拟合训练数据和保持模型的简单以使其更好的泛化之间谋求一种平衡。

图1-23展示了3个模型:点虚线代表原始模型,即使用缺失了一部分国家数据的训练集训练的模型,线段虚线代表了使用全部国家数据训练得到的模型,实线所代表的模型使用与第一个模型相同的数据,但是进行了正则化限制。可以看到正则化后的模型斜率更小,对训练数据的拟合也不是最好,但是对于新数据的泛化却是不错的。
《Hands-On Machine Learning》学习笔记-1.4 机器学习面临的挑战_第3张图片
图1-23 正则化减小过拟合的风险

正则化的数量通过一个超参来控制。超参是机器学习算法的一个参数,不受算法本身影响,必须在训练之前设定而且在训练过程中不能变。微调超参是构建机器学习系统的重要部分。

欠拟合

如果模型过于简单,无法体现数据背后的结构关系,就会出现欠拟合的情况。解决欠拟合的主要方法有:

  • 选择一个参数更多的,更有效的模型
  • 为算法提供更好的特征
  • 减小对模型的限制(比如降低正则化超参)

回顾

回顾一下已经介绍的概念:

  • 机器学习是一种通过从数据中学习的方法使得机器在处理某些特定任务的时候表现的更好,区别与传统的硬编码的方式。
  • 机器学习系统有许多种:有监督/无监督、批量/在线、基于模型的和/基于实例的等等
  • 在机器学习项目中,首先要从训练集中获取数据,然后将其提供给学习算法。如果算法是基于模型的,它通过调整参数的方式使得模型与训练数据拟合,并寄希望于能够预测新的情况。如果算法是基于实例的,则它会记住所有的样例,并通过简单的方式去泛化至新的实例。
  • 如果训练数据过小,或者数据不具有代表性,有噪声或者被一些不相关的特征污染了,那么机器学习系统就会表现的不好。最后,模型既不能太简单(欠拟合),也不能太复杂(过拟合)

如果你已经训练完一个模型了,那么你不可能仅仅“祈祷”它表现的好,而是需要去评估它,必要的时候对其参数进行调整。

测试和验证

验证一个模型是否好用的唯一方式就是将其投入到实际的使用场景中使用真实的数据去测试它。

往往会将数据分为训练集和测试集。顾名思义,在训练集上训练模型,在测试集上测试模型。在新数据上的错误率被称为泛化误差。通过在测试集上运行模型来对泛化误差进行估计。该值能够告诉模型在它从来没见过的数据上的表现如何。

如果训练错误很小,但是泛化错误很好,就说明过拟合了。

通常使用80%的数据作为训练集,20%的数据作为测试集

如果不知道在两个模型(比如线性模型和多项式模型)之间如何取舍,通常会训练完这两个模型之后在测试集上进行验证。那假设线性模型泛化的更好,但是你希望通过正则化来避免过拟合,那么如何选择正则化超参呢?通常的做法是选择100个超参,然后使用这些超参分别训练100个模型。假设找到了一个最好的超参,训练误差为5%,但是其泛化误差却达到15%,那么问题出在哪?

问题就在于在同一测试集上对泛化误差进行了多次度量,通过调整模型和超参使其在**“此测试集”**上表现的最好,那么这也就意味着该模型和参数对于新数据的泛化结果很有可能会不好。

这个问题就跟过拟合相似了。就是在同一测试集上进行多次验证,最终的结果就是选择的模型和参数肯定是对这个固定的测试集表现的很好。

通常的解决方案是验证集***。在训练集上使用不同的超参训练不同的模型,然后选择在验证集上表现最好的超参,最后在测试集上仅进行一次*测试并得到泛化误差。

为了避免验证集浪费训练数据,通常的做法是使用“交叉验证”:训练集的数据被分为互补子集,每个模型都在不同的子集上训练,在剩下的子集上进行验证。一旦选定了一个模型和超参,最终的模型将会使用该超参在整个训练集上进行训练,并使用测试集来对泛化误差进行度量。

模型就是对观察的简化,简化就意味着需要忽略一些看起来似乎对泛化无用的细节。但是忽略哪些,保留哪些?此时你就需要先做出一个假定。比如使用线性模型其实就意味着你首先假定数据就是遵循线性规则的,实例和线之间的距离就是可以被忽略的噪声

如果不做假定,就没法说这个模型比那个好。对一些数据集,最好的模型是线性模型,而对于另外一些数据集,可能神经网络更好一些。要想知道哪个模型更好,只有一个个的去验证。但是,这往往又是不可能的。实际上,人们往往会先对数据做一些预设,然后仅对一部分模型进行验证。例如,对于一些简单的任务,可能只需要验证不同正则化水平的线性模型,但是对于复杂的任务,可能需要验证不同的神经网络

练习

本章介绍了机器学习的一些重要的概念。下一章将会探索更深入的细节并开始编写代码。在那之前,我们需要先复习一下:

  • 如何定义机器学习
    • 机器学习就是
  • 指出4个机器学习适用的问题
  • 什么是有标签的训练集
    • 训练数据都带有真实值
  • 最常见的2种有监督任务是什么
    • 分类和回归
  • 说出4种常见的无监督学习
    • 聚类,数据可视化,数据降维
  • 如果让机器人在不同的位置的地形下行走,你会选择什么机器学习算法?
    • 强化学习
  • 把顾客分成不同的组,应该选用什么算法?
    • 聚类?
  • 垃圾邮件分类器是有监督学习问题还是无监督学习问题?
    • 有监督学习
  • 什么是在线学习?
    • 部署上线后,算法能够根据新数据不断更新,进步
  • 什么是“out-of-core”学习?
    • 当数据量太大而无法一次加载至机器内存时,将数据分成一个个的子集,利用在线学习的方式进行训练
  • 什么样的机器学习算法依靠比较相似性来进行预测/
    • 基于实例的机器学习(instance-based)
  • 模型参数和超参的区别
    • 模型参数在训练的过程中改变,而超参在训练的过程中保持不变
  • 基于模型的算法寻找的是什么?通常的步骤是?如何做预测?
    • search for underlying patterns of the data
    • 步骤:
      • study the data
    • 如何做预测:将new instance带入模型
  • 机器学习面临的主要挑战?
    • 数据不具有代表性
    • 数据噪声大
    • 过拟合
    • 欠拟合
  • 如果模型在训练集上表现出色,但是却在泛化新实例的时候表现糟糕,为什么?能说出三种可能的解决方法么
    • 数据过拟合了
    • 方法:
      • 选一个简单一点的模型
      • 将多个特征融合为一个特征
  • 测试集是什么?怎么用?
    • 测试集是用来验证模型在未知数据上的表现的
    • 模型训练完了之后,使用测试集计算模型的预测偏差
  • 验证集的目的是啥?
    • 验证不同的超参和模型
  • 使用测试集微调超参会怎样?
    • 这样选出来的超参在测试集上表现很好,但是往往泛化至新实例却表现不好。
  • 什么是交叉验证?为啥要用交叉验证?
    • 交叉验证就是将训练集分成数个互补子集,在不同的子集上训练模型和超参,使用剩下的子集验证超参。
    • 使用交叉验证能够避免训练数据的浪费,能够避免在测试集上验证超参时,导致的模型对测试集的过拟合

你可能感兴趣的:(Hands-On,Machine,Learning学习笔记)