机器学习入门(一)

什么是机器学习

机器学习使计算机从数据中自己学习,
机器学习是计算机编程的科学(和艺术),使计算机能够从数据中学习。下面是一个宽泛的定义:

机器学习是一个研究领域,它使计算机无需显式编程就能学习。 ——阿瑟·塞缪尔

用专业点的话来讲是:

如果计算机程序在处理任务T上的性能P随着经验E的提高而提高,那么表明它就可以从经验E中学习一些关于任务T和性能度量P的经验。——汤姆•米切尔

例如,您的垃圾邮件过滤器是一个机器学习程序,它可以学习标记用户给定的垃圾邮件的特征和普通电子邮件的特征。
系统用于学习的示例称为训练集。每个训练示例称为一个训练实例。
在这种情况下,任务T是为新邮件标记垃圾邮件,经验E是训练数据,需要定义性能度量P。
P可以使用正确分类的电子邮件的比例。这种特殊的性能度量称为精确度,通常用于分类任务。

为什么要使用机器学习

就垃圾邮件分类这个例子来说
如果是非机器学习(参见图1):

  1. 先了解垃圾邮件通常是什么样子的。有某些特征在这个垃圾邮件中经常出现。例如发件人姓名、电子邮件主体等中的一些其他特征。
  2. 要为纪录下的各种特征编写一个检测算法,如果检测到许个特诊,程序将把电子邮件标记为垃圾邮件。
  3. 测试程序,重复步骤1和步骤2,直到它的性能P足够高为止。

因为这个问题不简单,所以程序会有大量的复合规则,导致其变得难以维护。

图1
在这里插入图片描述
但是如果是机器学习(参见图2):
基于机器学习技术的垃圾邮件过滤器通过检测垃圾邮件示例中与普通邮件示例的单词对比,自动学习哪些单词和短语是垃圾邮件的特征。
与非机器学习相比,程序要短得多,易于维护,而且很可能更准确。

图2
在这里插入图片描述

再假设一个情况,如果垃圾邮件的发送者发现自己的邮件被辨识为垃圾邮件,那么他会对内容进行修改,这时候,为了继续实现辨别垃圾邮件,非机器学习的垃圾邮件过滤器需要对这个邮件进行一次更新,只要垃圾邮件作者一直更改,那么这个过滤器就必须要不断的更新。
然而,机器学习不用,机器学习编写的垃圾邮件过滤器会自动进行垃圾邮件特征的更新,甚至不需要你指出这是垃圾就自动将其过滤(参见图 3)。

图3
机器自动学习辨别垃圾邮件

机器学习的另一个亮点是解决传统方法无法解决的复杂问题或没有已知算法的问题。例如,语音识别:我们从简单的开始,编写一个能够区分单词“1”和“2”的程序。我们可能会注意到单词“two”以一个高音(“T”)开始,所以可以编写一个算法来测量高音的声音强度,并使用它来区分1和2。但是很明显,这项技术无法扩展到成千上万不同的人在嘈杂的环境中用几十种语言说的成千上万个单词。在现在我们最好的解决方案是编写一个可以自己学习的算法,给出各种单词的各种示例记录,然后让机器自己学习,达到能识别的程度。

机器学习可以帮助人类学习:
人们可以检查ML算法,看看它们学到了什么(尽管对于某些算法,这可能比较棘手)。例如,一旦垃圾邮件过滤器对足够多的垃圾邮件进行了培训,就可以检查它,显示它认为是垃圾邮件的单词列表和单词组合。有时这会揭示未知的核心关系或新趋势,可以使我们更好地理解问题。

应用机器学习技术挖掘大量数据可以帮助发现那些没有立即显现的模式,这是数据挖掘。

总而言之,机器学习的好处在于:

  • 现有解决方案需要大量手工调整或长规则列表,使用一种机器学习算法通常可以简化代码并执行得更好。
  • 使用传统方法根本没有好的解决方案的复杂问题,通过机器学习技术可以找到解决方案。
  • 在数据波动环境下,机器学习系统可以适应新的数据了解复杂问题和大量数据。

机器学习的类型

机器学习系统有很多不同的类型,根据以下几点标准将它们分类:

  • 他们是否接受了人工监督(或者监督、非监督、半监督和强化学习)的培训。
  • 他们是否能够动态渐进学习(在线学习,批量学习(离线学习))
  • 它们的工作方式是简单地将新数据点与已知数据点进行比较,还是检测培训数据中的模式并构建预测模型(基于实例的学习与基于模型的学习)

这些标准并不排斥,可以任意组合它们。例如,最先进的垃圾邮件过滤器使用深度神经网络,动态学习机器学习系统的类型,使用垃圾邮件和普通邮件的例子训练工作模型,通过组合这些使其成为一个在线的、基于模型的、有监督的学习系统。

监督/无监督学习

机器学习系统可以根据他们在训练中得到的监督的数量和类型来分类。
有四大类:监督学习、非监督学习、半监督学习和强化学习。

监督学习

在监督学习中,您提供给算法的训练数据包括所需的解决方案,称为标签(参见图5)

图5
图1-5
用于监督学习的标记训练集(例如,垃圾邮件分类)典型的监督学习任务是分类。垃圾邮件过滤器就是一个很好的例子:它使用许多示例邮件(包含有垃圾邮件或普通邮件)及其类进行训练,并且必须学习如何对新邮件进行分类,另一个典型的任务是预测一个目标数值,例如汽车的价格,给定一组称为预测器的特征值(里程、年龄、品牌等)。这类任务称为回归(参见图6)。要训练系统,您需要给它提供许多汽车的例子,包括它们的特征值和标签(价格)。

图6
在这里插入图片描述
注意,一些回归算法也可以用于分类,反之亦然。例如,逻辑回归通常用于分类,因为它可以输出一个值,这个值是某个给定类的概率。
以下是一些重要的监督学习算法:

  • 邻近算法(k-Nearest Neighbors)
  • 线性回归
  • 逻辑回归
  • 支持向量机
  • 决策树和随机森林
  • 神经网络
无监督学习

在无监督学习中,训练数据没有标记(参见图7)。这个系统试图在没有管理者的情况下学习。

图7
在这里插入图片描述
下面是一些重要的无监督学习算法:。

  • 聚类
    —k-Means
    —层级聚类分析(Hierarchical Cluster Analysis)
    —期望最大化
  • 可视化和降维(第八章)
    —主成分分析(PCA)
    —Kernel PCA
    —局部线性嵌入(LLE)
    (是一种非线性降维算法,它能够使降维后的数据较好地保持原有流形结构)
    —t-distributed Stochastic Neighbor Embedding (t-SNE)
  • 关联规则学习
    —Apriori(通过候选集生成和情节的向下封闭检测两个阶段来挖掘频繁项集)
    —Eclat(有不足,通过计算两个项集的tidset交集得到支持度,当数据量过大时,计算时间增加,效率低,并且消耗大量内存)

例如,假设您有关于博客访问者的大量数据。您想要运行一个集群算法来获得相似访问者的组(参见图8)。在任何情况下,您都不需要告诉算法访问者属于哪个组:它会在没有你的帮助下找到这些连接。例如,它可能会注意到40%的访问者是男性,他们喜欢漫画书,通常在晚上阅读您的博客,而20%是年轻的科幻爱好者,他们在周末访问,等等。如果使用分层聚类算法,它还可以将每个组细分为更小的组。这可能会帮助你为每一组定位你的帖子。

图8在这里插入图片描述
可视化算法也是无监督学习算法的例子:你向它们提供大量复杂的、未标记的数据,它们输出数据的2D或3D表示,这些数据可以很容易地绘制出来(参见图9)。这些算法试图尽可能地保留结构(例如,尝试在输入空间中保持独立的集群,以免在可视化中重叠),这样你就可以理解数据是如何组织的,并识别出未被识别
的模式。

图9
在这里插入图片描述
还有一个是降维,其目标是在不丢失太多信息的情况下简化数据。一种方法是将几个相关的lable特性合并到一个中。例如,一辆汽车的里程可能与它的年龄非常相关,因此降维算法将它们合并成一个代表汽车磨损的特征。这叫做特征提取。

另一个非监督任务是异常检测——例如,检测不寻常的信用卡交易以防止欺诈,捕捉制造缺陷,或在将数据集中的异常值提供给另一个学习算法之前自动删除异常值。系统使用普通实例进行训练,当它看到一个新实例时,它可以判断它看起来是否是一个普通实例,或者它是否是一个不正常的实例(参见图10)。

图10
在这里插入图片描述
最后,一个常见的无监督任务是关联规则学习,其目标是挖掘大量数据并发现属性之间的关系。例如,假设您拥有一家超市,在你的销售记录上运行一个关联规则,可能会发现购买烧烤酱和薯片的人也倾向于购买牛排。因此,你可能会把烧烤酱薯片和牛排放在一起。

半监督学习

一些算法可以处理部分标记的训练数据,通常是大量的无标记数据和少量的标记数据。这称为半监督学习(参见图11)。

有一个照片托管服务,比如谷歌Photos,就是半监督学习很好的例子。当你把你所有的家庭照片上传到这个服务中,它会自动识别出同一个人A出现在照片1、5和11中,而另一个人B出现在照片2、5和7中。这是算法的无监督部分(集群)。现在系统只需要你告诉它这些人是谁。每个人只有一个标签,它可以命名每张照片中的每个人,搜索照片时会有用。
在这里插入图片描述
大多数半监督学习算法是无监督和监督算法的组合。例如,深度信念网络(DBNs)就是基于堆叠在一起的无人监督的组件——限制玻尔兹曼机(RBMs)。RBMs以无监督的方式进行顺序训练,然后使用监督学习技术对整个系统进行微调。

强化学习

强化学习是一个非常不同的概念。又称再励学习、评价学习或增强学习,是机器学习的范式和方法论之一,用于描述和解决智能体(agent)在与环境的交互过程中通过学习策略以达成回报最大化或实现特定目标的问题,该学习系统在这段称为代理,它可以观察环境、选择和执行操作,并获得回报(或以负回报形式的惩罚,如图12所示)。然后,它必须自己学习什么是最好的处理方式,称为策略,以获得最大的回报。策略定义了代理在原位时应该选择什么操作。

图12
在这里插入图片描述
例如,许多机器人实施强化学习算法来学习如何走路。DeepMind的AlphaGo程序也是强化学习的一个很好的例子:2016年3月,它在围棋比赛中击败世界冠军李世石,成为头条新闻。它通过分析数以百万计的游戏,然后和自己玩很多游戏,从而学会了获胜策略。在与冠军的比赛中,学习被关闭了,AlphaGo只是在运用它所学到的策略。

在线学习和批量学习(离线学习)

用于对机器学习系统进行分类的另一个标准是,系统是否能够从输入的数据流增量地学习。

批量学习

在批量学习中,系统不能渐进地学习:它必须使用所有可用的数据进行训练。这通常会花费大量的时间和计算资源,所以通常是离线完成的。首先对系统进行培训,然后投入生产运行,不再学习;它只是应用它所学到的东西。这就是所谓的离线学习。
如果你想要一批学习系统了解新数据(比如一种新的垃圾邮件),你需要火车从头开始一个新版本的系统完整的数据集(不仅仅是新的数据,还有旧的数据),然后停止旧体系,代之以新的。不过还不错的是,在整个培训、评估和启动机器学习系统的过程中可以相当容易地自动化(如图3所示),因此即使是批量学习系统也能够适应变化。只需根据需要随时更新数据并重新开始培训新版本的系统。这个解决方案很简单,而且一般处理得很好,但是使用完整的数据集进行培训可能会花费一段时间,通常需要每24小时甚至每周培训一个新系统。如果你的系统需要适应快速变化的数据,那么则需要一个更具反应性的解决方法。
此外,对全套数据的培训需要大量的计算资源(CPU、内存空间、磁盘空间、磁盘I/O、网络I/O等)。如果有大量的数据,就需要每天从零开始自动化你的系统,这会花费很多钱。
如果数据量很大,甚至不可能使用批处理学习算法。最后,如果您的系统需要能够自主学习,但是它的资源有限,那么携带大量的训练数据,每天花费大量资源进行数小时的训练,将会是一个大难题。所以,在所有这些情况下,更好的选择是使用能够动态学习的算法。

在线学习

在在线学习中,您可以通过依次向系统提供数据实例来增量地培训系统,这些数据实例可以是单独提供的,也可以是由称为mini-batches的小组提供的。每一个学习步骤都是快速和廉价的,因此系统可以在新数据到达时动态地学习(参见图13)。

图13:在线学习
在这里插入图片描述
在线学习对于以连续流(例如股票价格)接收数据并需要快速或自主地适应变化的系统非常有用,如果您的计算资源有限这也是一个不错的选择:一旦在线学习系统了解了新的数据实例,它就不再需要它们了,所以可以丢弃它们(除非您希望能够回滚到以前的状态并重新导入数据),这可以节省大量的空间。
在线学习算法还可以用于在无法装入一台机器主内存的巨大数据集上训练系统(这称为核外学习)。该算法加载部分数据,在该数据上运行一个训练步骤,并重复该过程,直到它可以在所有数据上运行(参见图14)

图14
在这里插入图片描述
在线学习系统的一个重要参数是它们应该以多快的速度适应不断变化的数据:这称为学习率。如果您设置了较高的学习率,那么您的系统将很快适应新的数据,但是它也会很快忘记旧的数据(您不希望垃圾邮件过滤器只标记它显示的最新类型的垃圾邮件)。反之,如果你设置一个较低的学习率,系统会有更多的惯性;也就是说,它将学习得更慢,它对新数据中的特征或非代表性数据点的序列也不那么敏感。
在线学习的一大挑战是,如果不良数据被输入系统,系统的性能将逐渐下降。如果我们讨论的是实时系统,您的客户会注意到这样的情况。例如,错误的数据可能来自于机器的传感器故障,或者某人向搜索引擎发送垃圾邮件,试图在搜索中得到靠前排名。为了减少这种风险,您需要密切监视系统,如果发现性能下降,则需要立即关闭学习(并可能要恢复到以前的工作状态)。可能您还想监视输入数据并对异常数据作出反应(例如,使用异常检测算法)。

基于实例和基于模型的学习

对机器学习系统进行分类的另一种方法是通过它们的泛化方式。大多数机器学习任务都是关于预测的。这意味着,给定一些训练示例,系统需要能够将其推广到以前从未见过的示例。对培训数据有良好的绩效考核是好的,但存在不足;真正的目标是在新实例上运行良好。
概括有两种主要方法:基于实例的学习和基于模型的学习

基于实例的学习

也许最琐碎的学习方式就是死记硬背。如果您要以这种方式创建垃圾邮件过滤器,它只会标记所有与用户已经标记的邮件相同的邮件—这不是最糟糕的解决方案,但肯定不是最好的。
除了标记与已知垃圾邮件相同的电子邮件,您的垃圾邮件过滤器还可以编程标记与已知垃圾邮件非常相似的电子邮件。这需要衡量两封电子邮件之间的相似性。一个基本的衡量两封电子邮件之间相似度的方法是计算它们共有的字数。如果一封电子邮件中许多单词与已知的垃圾邮件一样,系统就会将其标记为垃圾邮件
这被称为基于实例的学习:系统牢记示例,然后使用相似性度量将其推广到新的案例(图15)。

图15
在这里插入图片描述

基于模型的学习

从一组示例中进行概括的另一种方法是构建这些考试组的模型,然后使用该模型进行预测。这称为基于模型的学习(图16)。

图16:基于模型的学习
在这里插入图片描述
例如,假设你想知道钱是否能让人快乐,所以你从经合组织(OECD)网站下载了“幸福生活指数”(Better Life Index)数据,并从IMF网站下载了人均GDP数据。然后加入表格,按每个表头的GDP排序。表1-1显示了您得到的内容的摘录。
在这里插入图片描述
画出几个随机国家的数据(图17)

图17,你看到趋势了吗
在这里插入图片描述
这里似乎确实有一种趋势!虽然数据是有噪声的(部分是随机的),看起来生活满意度或多或少随着该国人均GDP的增长呈线性增长。所以你决定将生活满意度(y)建模为人均GDP(x)的线性函数。这一步叫做模型选择:你选择了一个生活满意度的线性模型。这个模型只有一个属性,即人均GDP(方程1-1)。
方程1 - 1:简单线性模型

life_satisfaction = θ0+ θ1× GDP_per_capita

这个模型有两个模型参数,θ0和θ1,通过调整这些参数,您可以使您的模型表示任何线性函数,如图18所示。

图18
在这里插入图片描述
在使用模型之前,需要定义参数值θ0和θ1。您如何知道哪些值将使您的模型执行得最好?要得到这个答案,您需要指定一个性能度量。您可以定义一个效用函数(或者适应度函数)来度量模型的好坏,也可以定义一个成本函数来度量模型的好坏。对于线性回归问题,人们通常使用一个成本函数来度量线性模型的预测与训练示例之间的距离;目标是使这个距离最小化。这就是线性回归算法的用武之地:你给它输入你的训练例子,它会找到使线性模型最适合你的数据的参数。这叫做训练模型。在我们的例子中,算法发现最优参数值为θ0= 4.85和θ1= 4.91 x 10-5
现在,该模型与训练数据尽量符合(对于线性模型),如图19所示

图19
在这里插入图片描述
您终于可以运行模型进行预测了。例如,假设你想知道塞浦路斯人有多幸福,而经合组织的数据没有答案。但是,你可以使用你的模型做出一个很好的预测:查找塞浦路斯的人均GDP,找到22,587美元,然后应用模型,发现生活满意度可能在4.85 + 22,587 x 4.91 x 10-5 = 5.96左右。为了激发您的兴趣,示例1-1显示了Python代码,该代码加载数据,对数据进行预处理,创建用于可视化的散点图,然后训练线性模型并做出预测。

import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import sklearn
# 读取数据
oecd_bli = pd.read_csv("oecd_bli_2015.csv", thousands=',')
gdp_per_capita = pd.read_csv("gdp_per_capita.csv",thousands=',',delimiter='\t',
 encoding='latin1', na_values="n/a")
# 准备数据
country_stats = prepare_country_stats(oecd_bli, gdp_per_capita)
X = np.c_[country_stats["GDP per capita"]]
y = np.c_[country_stats["Life satisfaction"]]
# 将数据可视化
country_stats.plot(kind='scatter', x="GDP per capita", y='Life satisfaction')
plt.show()
# 选择线性模型
lin_reg_model = sklearn.linear_model.LinearRegression()
# 训练模型
lin_reg_model.fit(X, y)
# 为塞浦路斯做预测
X_new = [[22587]] # 塞浦路斯的GDP
print(lin_reg_model.predict(X_new)) # 输出塞浦路斯的幸福度[5.96242338]

如果一切顺利,您的模型将做出良好的预测。如果没有,您可能需要使用更多的属性(就业率、健康、空气污染等),获得更多或更好的质量培训数据,或者选择更强大的模型(例如,多项式回归模型)
总而言之:

  • 你研究了数据
  • 你选择了一个模型
  • 你训练了训练数据(学习算法搜索模型参数值,使代价函数最小化)。
  • 应用该模型对新的案例进行预测(这称为推理),希望该模型能够进行很好的预测。

这就是典型的机器学习项目的例子。在第2章中,我们将通过end-to-end项目亲身体验到这一点。
到目前为止,我们已经讨论了很多领域:您现在已经了解了机器学习的真正含义、为什么它有用、机器学习的一些最常见的类别是什么,以及典型的项目工作流是什么样子的。现在看看在学习过程中什么地方会出错,导致你做不出准确的预测。

机器学习的主要挑战

简而言之,由于您的主要任务是选择一个学习算法并在一些数据上对其进行训练,因此可能出错的有两件事“糟糕的算法”和“糟糕的数据”。让我们从坏数据的例子开始。

数据出错

培训数据不足

对于一个蹒跚学步的孩子来说,要想知道苹果是什么,你只需要指着一个苹果说“apple”(可能重复这个过程几次)。现在这个孩子能够辨认出各种颜色和形状的苹果。
机器学习还没有完全实现这个;大多数机器学习算法需要大量的数据才能正常工作。即使是非常简单的问题,通常也需要成千上万的例子,而对于复杂的问题,如图像或语音识别,则可能需要成千上万的例子(除非您可以重用现有模型的某些部分)

数据的不合理有效性

在2001年出版的一篇著名的论文,微软研究员使用不同的机器学习算法,包括相当简单的算法,在获得足够的数据后,在一个复杂的自然语言消歧问题上表现得几乎一样好(如图20所示)。

图20
在这里插入图片描述
正如作者所言:“这些结果表明,我们可能需要重新考虑在算法开发和数据库开发上花费时间和金钱的权衡。”
数据比算法对于复杂的重要问题是由Peter Norvig进一步推广在一篇题为《数据的不合理有效性》的文章中提出的,应该注意,尽管小型和中型数据集仍然非常普遍,但它并不总是那么容易并且廉价得到的额外的训练数据,所以不要放弃算法。

非代表性的训练数据

为了很好地概括,重要的是您的训练数据要能够代表您想要概括的新案例。无论是使用基于实例的学习还是基于模型的学习,这都是必须的。
例如,我们之前用于训练线性模型的国家并不完全具有代表性;有几个国家没有显示上去。图21显示了添加缺失国家的数据。

图21
在这里插入图片描述
如果你用这些数据训练一个线性模型,你会得到一个实线,旧模型用虚线表示。正如您所看到的,添加几个缺失的国家不仅显著地改变了模型,而且很明显,这样一个简单的线性模型可能永远不会运行好。非常富裕的国家并不比中等富裕的国家幸福(事实上他们似乎并不幸福),相反,一些贫穷的国家可能比许多富裕的国家幸福。
通过使用非代表性的训练集,我们训练了一个不太可能做出准确预测的模型,尤其是对于非常贫穷和非常富裕的国家。
至关重要的是,要使用一个训练集来代表您想要一般化的案例,通常比它听起来要困难:如果样本太小,就会产生采样噪声(非代表性数据的结果)但如果抽样方法存在缺陷,即使是非常大的样本也可能不具有代表性。这就是抽样偏差。

低质量数据

显然,如果您的训练数据充满了错误、异常值和噪声(例如,由于低质量测量),那么系统将更难检测底层模式,因此您的系统不太可能执行得很好。所以花时间清理培训数据通常是非常值得的。事实上,大多数数据科学家在这方面花费了大量的时间。例如:

  • 如果某些实例明显是异常值,则可以丢弃它们或手动修复错误。
  • 如果一些实例缺少一些特性(例如,5%的客户没有指定他们的年龄),您必须决定是否要忽略这个属性,忽略这些实例,然后填充缺少的值(比如年龄中位数),或者训练一个有特征的模型和一个没有特征的模型,等等。

无关的特性

俗话说:无用输入,则无用输出。只有当训练数据包含足够的相关特性而不是太多不相关的特性时,系统才能够学习。机器学习项目成功的一个关键部分是提供一组良好的特性来进行培训。这个过程称为特征工程,包括:

  • 特性选择:在现有特性中选择最有用的特性进行训练。
  • 特征提取:结合现有的特征生成更有用的特征(比如在前面提到的,降维算法可以提供这项功能)。
  • 通过收集新数据来创建新特性

算法出错

过度拟合训练数据

假设你在国外旅游,出租车司机把你骗了。你可能会说那个国家所有的出租车司机都是小偷。过度概括是我们人类经常做的事情,不幸的是,如果我们不小心,机器也会落入同样的陷阱。在机器学习中,这被称为过拟合:它意味着模型在训练数据上表现良好,但不能进行适合地概括。图22显示了一个高度多项式的生活满意度模型的例子,该模型与训练数据非常匹配。它对训练数据的处理比简单的线性模型要好得多,但是你真的会相信它的预测吗?
图22
在这里插入图片描述
像深度神经网络这样的复杂模型可以检测到数据中的细微模式,但是如果训练集是有噪声的,或者它太小(引入了采样噪声),那么模型很可能检测到噪声本身的模式。显然,这些模式不能推广到新实例。例如,假设你为自己的幸福度模型添加了更多的属性,包括一些没有提供信息的属性,比如国家名称。在这种情况下,一个复杂的模型可能会发现这样的模式,即所有在训练数据中名字有w的国家的生活满意度都大于7:新西兰(New Zealand)(7.3)、挪威(Norway)(7.4)、瑞典(Sweden)(7.2)和瑞士(Switzerland)(7.5)。你对W-satisfaction规则适用于卢旺达(Rwanda)或津巴布韦(Zimbabwe)有信心吗?显然,这种模式在训练数据中完全是偶然发生的,但是模型无法判断模式是真实的还是数据中的噪声造成的。
当模型相对于训练数据的数量和噪声过于复杂时,就会发生过拟合。解决办法是:

  • 通过选择参数较少的模型来简化模型(例如,一个线性模型而不是一个高次多项式模型),通过减少训练数据中的属性数量或使用约束模型
  • 收集更多的训练数据
  • 减少训练数据中的噪声(例如,修正数据错误,去除异常值)

为了简化模型并降低过度拟合的风险而对模型进行约束称为正则化。例如,我们前面定义的线性模型有两个参数θ0和θ1。这给了学习算法两个自由度使模型适应训练数据:它可以调整直线的高度(θ0)和斜率(θ1)。如果我们令θ1 = 0,该算法就只有一个自由度并且它会更难正确拟合数据:它唯一能做的是上下移动线尽可能训练实例,所以它最终的可能在平均值附近。一个非常简单的模型!如果我们允许算法修改θ1,并且我们令它尽量的小,那么学习算法就会在1到2个自由度之间有一个有效值。它产生了一个比有两个自由度时更简单的模型,但比只有一个自由度时更复杂。在完美地拟合数据和保持模型足够简单之间找到平衡以确保它能够很好地泛化。
图23显示了三个模型:蓝色点线代表的原始模型,红色虚线是与所有国家训练的模型,蓝色实线是线性模型训练用的数据与第一个模型数据相同,但进行了正则化约束。可以看到,正则化迫使模型具有更小的斜率,这就与模型所训练的训练数据更不相配,但实际上它更好地适用到新的数据。
在这里插入图片描述
学习过程中应用的正则化量可以由一个超参数控制。超参数是学习算法的参数(不是模型的参数)。因此,它不受学习算法本身的影响;它必须在训练前设置,并在训练期间保持不变。如果将正则化超参数设置为非常大的值,您将得到一个几乎平坦的模型(斜率接近于零);这样学习算法肯定不会对训练数据进行过度拟合,但找到一个好的解决方案的可能性小。调优超参数是构建机器学习系统的一个重要部分。

对培训数据的拟合不足

欠拟合与过度拟合是相反的:当模型过于简单,无法了解数据的底层结构时,就会发生欠拟合。例如,生活满意度的线性模型容易欠拟合;现实比模型更复杂,所以它的预测是不准确的,在训练集上。解决这个问题的主要方法是:

  • 选择具有更多参数的更强大的模型
  • 为学习算法提供更好的特征(特征工程)
  • 减少模型的约束(比如,减小正则化超参数)

总结

对文中概念进行一个概括:

  • 机器学习是通过从数据中学习来让机器更好地完成某些任务,而不是必须显式地编写规则。
  • ML系统有许多不同的类型:监督的或无监督的、批处理的或在线的、基于实例的或基于模型的,等等
  • 在ML项目中,您在一个训练集中收集数据,然后将训练集提供给一个学习算法。如果算法是基于模型的,它会调整一些参数使模型适合于训练集(即,对训练集本身做出良好的预测),并且它也能对新的数据做出良好的预测。如果该算法是基于实例的,那么它只需要记住示例并使用相似性度量将其推广到新的实例。
  • 如果您的训练集太小,或者数据不具有代表性、具有噪声,或者被不相关的特性(无用输入、无用输出)污染,那么系统就不会执行的很好。最后,您的模型既不需要太简单(欠拟合),也不需要太复杂(过拟合)。

最后一个重要的主题是:一旦您训练了一个模型,您就不会仅仅“希望”它可以推广到新的情况。您希望对其进行评估,并在必要时对其进行微调。让我们来看看。

测试和验证

要想知道模型在新情况下的推广效果如何,唯一的方法就是在新情况下进行实际的试验。一种方法是把你的模型投入生产,看看它的性能如何。这样做很好,但是如果你的模型非常糟糕,你的用户就会抱怨——这不是最好的主意。
一个更好的选择是把你的数据分为两组:训练集和测试集,这些名字暗示,使用训练集训练你的模型,使用测试集对其进行测试。在新实例上得到的错误率称为泛化误差(或外样本误差),通过测试集评估模型,得到一个估计的误差。这个值告诉您模型在以前从未见过的实例上执行得有多好。
若训练误差较低意味着你的模型在训练集中很少出错,拟合的很好,但是泛化误差很高,这意味着你的模型对训练数据的拟合过度。
因此,评估一个模型非常简单:只需使用一个测试集。现在假设你正在两个模型(比如线性模型和多项式模型)之间进行选择:如何决定?一种选择是对两者进行培训,并比较它们如何使用测试集进行泛化。
现在假设线性模型可以更好地一般化,应用一些正则化来避免过度拟合。问题是:如何选择正则化超参数的值?一种选择是使用这个超参数的100个不同值来训练100个不同的模型。假设您找到了生成泛化误差最低的模型的最佳超参数的值,比如只有5%的误差。
因此,您将该模型投入使用,但是,它的性能没有预期的好,甚至产生15%的错误。这是为什么?
问题是你在测试集上多次测量泛化误差,然后你调整模型和超参数来产生那个集合的最佳模型。这意味着这个模型不太可能在新数据上表现得那么好。
共同解决这个问题是第二个抵抗组称为验证集。你使用训练集训练多个模型与各种超参数,选择在验证集中表现最好的模型和超参数,当你对你的模型满意时你就会对测试集运行一个最终测试得到泛化误差的估计值。
为了避免在验证集中“浪费”太多的训练数据,一种常见的技术是使用交叉验证:将训练集分割为互补的子集,每个模型针对这些子集的不同组合进行训练,并针对其余部分进行验证。一旦选择了模型类型和超参数,就可以在整个训练集上使用这些超参数训练最终的模型,并在测试集上测量广义误差。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值