zl程序教程

您现在的位置是:首页 >  硬件

当前栏目

【ML】第一章 机器学习领域

机器学习领域 ML 第一章
2023-09-14 09:06:10 时间

  🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎

📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃

🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​

📣系列专栏 - 机器学习【ML】 自然语言处理【NLP】  深度学习【DL】

 🖍foreword

✔说明⇢本人讲解主要包括Python、机器学习(ML)、深度学习(DL)、自然语言处理(NLP)等内容。

如果你对这个系列感兴趣的话,可以关注订阅哟👋

什么时候大多数人听到“机器学习”,他们会想象一个机器人:一个可靠的管家或一个致命的终结者,这取决于你问谁。但是机器学习不仅仅是一个未来主义的幻想。它已经在这里了。事实上,它在一些专业应用中已经存在了几十年,例如光学字符识别 (OCR)。但真正成为主流的第一个 ML 应用程序,改善了数亿人的生活,早在 1990 年代就占领了世界:垃圾邮件过滤器。它不完全是一个有自我意识的天网,但它在技术上确实符合机器学习的条件(它实际上学得很好,以至于你很少需要再将电子邮件标记为垃圾邮件了)。紧随其后的是数百个 ML 应用程序,它们现在悄悄地为您经常使用的数百种产品和功能提供支持,从更好的推荐到语音搜索。

机器学习从哪里开始,又在哪里结束?机器学习东西到底意味着什么?如果我下载维基百科的副本,我的电脑真的学到了什么吗?是不是突然变聪明了?在本章中,我们将首先阐明什么是机器学习以及为什么要使用它。

然后,在我们开始探索机器学习大陆之前,我们将查看地图并了解主要区域和最显着的地标:监督与无监督学习、在线与批量学习、基于实例与基于模型学习。然后,我们将查看典型 ML 项目的工作流程,讨论您可能面临的主要挑战,并介绍如何评估和微调机器学习系统。

本章介绍了每个数据科学家都应该牢记的许多基本概念(和行话)。这将是一个高级概述(这是唯一没有太多代码的章节),非常简单,但在继续阅读本书的其余部分之前,您应该确保所有内容都非常清楚。所以喝杯咖啡,让我们开始吧!

什么是机器学习?

机器学习是计算机编程的科学(和艺术),因此它们可以从数据中学习

这是一个稍微更一般的定义:

[机器学习是] 研究领域,它使计算机能够在没有明确编程的情况下进行学习。

阿瑟·塞缪尔,1959

还有一个更面向工程的:

如果计算机程序在T上的性能(由P衡量)随着经验E而提高,则可以说计算机程序从经验E中学习某些任务T和某些性能度量P。

汤姆·米切尔,1997

您的垃圾邮件过滤器是一个机器学习程序,给定垃圾邮件示例(例如,由用户标记)和常规(非垃圾邮件,也称为“火腿”)电子邮件示例,它可以学习标记垃圾邮件。系统用来学习的例子是称为训练集。每个训练样例都是称为训练实例(或样本)。在这种情况下,任务T是为新电子邮件标记垃圾邮件,经验E需要定义训练数据和性能度量P;例如,您可以使用正确分类的电子邮件的比率。这个特定的性能度量称为准确度,它经常用于分类任务。

如果您只是下载维基百科的副本,您的计算机将拥有更多数据,但它并不会突然变得更好。因此,下载维基百科的副本不是机器学习。

为什么要使用机器学习?

考虑如何使用传统编程技术编写垃圾邮件过滤器(图1-1):

  1. 首先,您会考虑垃圾邮件通常的样子。您可能会注意到一些单词或短语(例如“4U”、“信用卡”、“免费”和“惊人”)往往会出现在主题行中。也许您还会注意到发件人姓名、电子邮件正文和电子邮件其他部分中的一些其他模式。

  2. 您将为您注意到的每个模式编写一个检测算法,如果检测到其中的许多模式,您的程序会将电子邮件标记为垃圾邮件。

  3. 您将测试您的程序并重复步骤 1 和 2,直到它足以启动。

图 1-1。传统方法

由于这个问题很困难,你的程序很可能会变成一长串复杂的规则——很难维护。

相比之下,基于机器学习技术的垃圾邮件过滤器通过检测垃圾邮件示例中与火腿示例相比异常频繁的单词模式,自动学习哪些单词和短语是垃圾邮件的良好预测指标( 图1-2)。该程序更短,更易于维护,并且很可能更准确。

如果垃圾邮件发送者注意到他们所有包含“4U”的电子邮件都被阻止了怎么办?他们可能会开始写“For U”。需要更新使用传统编程技术的垃圾邮件过滤器以标记“For U”电子邮件。如果垃圾邮件发送者继续围绕您的垃圾邮件过滤器工作,您将需要永远编写新规则。

相比之下,基于机器学习技术的垃圾邮件过滤器会自动注意到“For U”在用户标记的垃圾邮件中变得异常频繁,并在没有您干预的情况下开始标记它们( 图1-3)。

图 1-2。机器学习方法

图 1-3。自动适应变化

机器学习的另一个亮点是解决对于传统方法而言过于复杂或没有已知算法的问题。例如,考虑语音识别。假设你想从简单的开始编写一个能够区分单词“one”和“two”的程序。您可能会注意到单词“two”以高音(“T”)开头,因此您可以硬编码一个算法来测量高音强度并使用它来区分一个和两个 - 但显然这种技术会无法扩展到数以百万计的不同人在嘈杂的环境和数十种语言中所说的数千个单词。最好的解决方案(至少在今天)是编写一个自行学习的算法,给定每个单词的许多示例记录。

最后,机器学习可以帮助人类学习( 图1-4)。可以检查 ML 算法以查看它们学到了什么(尽管对于某些算法来说这可能很棘手)。例如,一旦对垃圾邮件过滤器进行了足够多的垃圾邮件训练,就可以轻松地对其进行检查,以显示它认为是垃圾邮件最佳预测指标的单词列表和单词组合。有时这会揭示出意想不到的相关性或新趋势,从而更好地理解问题。应用 ML 技术挖掘大量数据有助于发现不立即显现的模式。这称为数据挖掘

 

图 1-4。机器学习可以帮助人类学习

总而言之,机器学习非常适合:

  • 现有解决方案需要大量微调或一长串规则来解决的问题:一种机器学习算法通常可以简化代码并且比传统方法执行得更好。

  • 使用传统方法无法解决的复杂问题:最好的机器学习技术也许可以找到解决方案。

  • 波动环境:机器学习系统可以适应新数据。

  • 深入了解复杂问题和大量数据。

机器学习系统的类型

那里机器学习系统有很多不同类型,因此根据以下标准将它们分类为大类是很有用的:

  • 他们是否接受过人工监督训练(监督、无监督、半监督和强化学习)

  • 他们是否可以即时增量学习(在线学习与批量学习)

  • 它们是通过简单地将新数据点与已知数据点进行比较,还是通过检测训练数据中的模式并构建预测模型来工作,就像科学家所做的那样(基于实例的学习与基于模型的学习)

这些标准不是排他性的;你可以用任何你喜欢的方式组合它们。例如,最先进的垃圾邮件过滤器可以使用使用垃圾邮件和火腿示例训练的深度神经网络模型即时学习;这使它成为一个基于模型的在线监督学习系统。

让我们更仔细地看看这些标准中的每一个。

监督/无监督学习

机器学习系统可以根据它们在训练期间获得的监督数量和类型进行分类。有四大类:监督学习、无监督学习、半监督学习和强化学习。

监督学习

监督学习中,您提供给算法的训练集包括所需的解决方案,称为标签(图1-5)。

图 1-5。垃圾邮件分类的标记训练集(监督学习的一个例子)

一个典型的监督学习任务是分类。垃圾邮件过滤器就是一个很好的例子:它使用许多示例电子邮件及其(垃圾邮件或非垃圾邮件)进行训练,并且它必须学习如何对新电子邮件进行分类。

其他典型的任务是预测一个目标数值,例如汽车的价格,给定一组称为预测器的特征(里程、年龄、品牌等)。这个这类任务称为回归( 图1-6)。1要训练系统,您需要为其提供许多汽车示例,包括它们的预测变量和它们的标签(即它们的价格)。

笔记

机内学习属性是一种数据类型(例如,“里程”),而特征具有多种含义,具体取决于上下文,但通常意味着属性加上其值(例如,“里程 = 15,000”)。许多人交替使用属性特征这两个词。

笔记一些回归算法也可以用于分类,反之亦然。例如,逻辑回归通常用于分类,因为它可以输出与属于给定类别的概率相对应的值(例如,20% 的可能性是垃圾邮件)。

图 1-6。回归问题:预测一个值,给定一个输入特征(通常有多个输入特征,有时还有多个输出值)

这里是一些最重要的监督学习算法(在本书中有介绍):

  • k-最近邻

  • 线性回归

  • 逻辑回归

  • 支持向量机 (SVM)

  • 决策树和随机森林

  • 神经网络

无监督学习

无监督学习中,就像你可能会猜到,训练数据是未标记的( 图1-7 )。系统试图在没有老师的情况下学习。

 

图 1-7。用于无监督学习的未标记训练集

这里是一些最重要的无监督学习算法(其中大部分在第8章和 第9章中介绍):

  • 聚类

    • K-均值

    • 星展扫描

    • 层次聚类分析 (HCA)

  • 异常检测和新奇检测

    • 一类SVM

    • 隔离森林

  • 可视化和降维

    • 主成分分析 (PCA)

    • 内核 PCA

    • 局部线性嵌入 (LLE)

    • t-分布随机邻域嵌入 (t-SNE)

  • 关联规则学习

    • 先验

    • 辉光

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

图 1-8。聚类

可视化算法也是无监督学习算法的好例子:你给它们提供了很多复杂且未标记的数据,它们会输出你的数据的 2D 或 3D 表示,可以很容易地绘制出来( 图1-9)。这些算法试图尽可能多地保留结构(例如,试图保持输入空间中的单独集群不会在可视化中重叠),以便您可以了解数据的组织方式并可能识别出未预料到的模式。

图 1-9。突出语义集群的 t-SNE 可视化示例3

一个相关任务是降维,其目标是在不丢失太多信息的情况下简化数据。一种方法是将几个相关的特征合并为一个。例如,汽车的行驶里程可能与其年龄密切相关,因此降维算法会将它们合并为一个代表汽车磨损的特征。这个称为特征提取

然而另一个重要的无监督任务是异常检测——例如,检测异常的信用卡交易以防止欺诈、捕捉制造缺陷或在将数据集输入另一个学习算法之前自动从数据集中删除异常值。系统在训练期间显示的大多是正常实例,因此它学会了识别它们;然后,当它看到一个新实例时,它可以判断它是否看起来像一个正常的实例,或者它是否可能是一个异常(见图1-10)。一个非常相似的任务新颖性检测:它旨在检测看起来与训练集中所有实例不同的新实例。这需要有一个非常“干净”的训练集,没有您希望算法检测到的任何实例。例如,如果你有数千张狗的图片,其中 1% 的图片代表吉娃娃,那么新奇检测算法不应将吉娃娃的新图片视为新奇。另一方面,异常检测算法可能会认为这些狗非常罕见并且与其他狗如此不同,以至于它们可能会将它们归类为异常(对吉娃娃没有冒犯)。

图 1-10。异常检测

最后,另一个常见的无监督任务是关联规则学习,其目标是挖掘大量数据并发现属性之间有趣的关系。例如,假设您拥有一家超市。在您的销售日志上运行关联规则可能会显示购买烧烤酱和薯片的人也倾向于购买牛排。因此,您可能希望将这些项目彼此靠近放置。

半监督学习

自从贴标签数据通常既耗时又昂贵,您通常会有大量未标记的实例,而标记的实例很少。一些算法可以处理部分标记的数据。这称为半监督学习(图1-11)。

图 1-11。具有两个类(三角形和正方形)的半监督学习:未标记的示例(圆圈)有助于将新实例(十字)分类到三角形类而不是正方形类,即使它更接近标记的正方形

一些照片托管服务,例如 Google Photos,就是很好的例子。将所有家庭照片上传到服务后,它会自动识别同一个人 A 出现在照片 1、5 和 11 中,而另一个人 B 出现在照片 2、5 和 7 中。这是无人监督的部分算法(聚类)。现在系统需要的只是告诉它这些人是谁。只需为每个人添加一个标签4即可为每张照片中的每个人命名,这对于搜索照片很有用。

大多数半监督学习算法是无监督和监督算法的组合。为了例如,深度信念网络(DBN) 基于无监督组件称为受限玻尔兹曼机(RBM),它们相互堆叠。RBM 以无监督的方式顺序训练,然后使用监督学习技术对整个系统进行微调。

强化学习

强化学习一个非常不同的野兽。学习系统,在这种情况下称为代理,可以观察环境,选择并执行动作,并获得回报作为回报(或以负回报的形式进行惩罚,图1-12所示)。然后它必须自己学习什么是最好的策略,称为策略,以便随着时间的推移获得最大的回报。策略定义了代理在给定情况下应选择的操作。

图 1-12。强化学习

例如,许多机器人实施强化学习算法来学习如何走路。DeepMind 的 AlphaGo 程序也是强化学习的一个很好的例子:它在 2017 年 5 月在围棋比赛中击败世界冠军柯洁时登上了头条新闻。它通过分析数以百万计的游戏来了解其获胜策略,然后与自己进行许多游戏。请注意,在与冠军的比赛中,学习是关闭的;AlphaGo 只是在应用它学到的策略。

批量和在线学习

用于分类机器学习系统的另一个标准是系统是否可以从输入数据流中增量学习。

批量学习

批量学习中,系统无法进行增量学习:必须使用所有可用数据对其进行训练。这通常会花费大量时间和计算资源,因此通常离线完成。先对系统进行训练,然后再投入生产运行,无需学习;它只是应用它学到的东西。这是线下学习

如果你想让一个批处理学习系统了解新数据(比如一种新型垃圾邮件),你需要在完整数据集(不仅是新数据,还有旧数据)上从头开始训练系统的新版本),然后停止旧系统并用新系统替换它。

幸运的是,机器学习系统的训练、评估和启动的整个过程都可以相当容易地自动化(如图 1-3所示),因此即使是批量学习系统也可以适应变化。只需根据需要随时更新数据并从头开始训练新版本的系统。

这个解决方案很简单,通常效果很好,但是使用完整的数据集进行训练可能需要很多小时,因此您通常只每 24 小时甚至每周训练一个新系统。如果您的系统需要适应快速变化的数据(例如,预测股票价格),那么您需要一个更具反应性的解决方案。

此外,对全集数据进行训练需要大量计算资源(CPU、内存空间、磁盘空间、磁盘 I/O、网络 I/O 等)。如果您有大量数据,并且您每天从头开始自动训练系统,最终将花费您很多钱。如果数据量很大,甚至可能无法使用批量学习算法。

最后,如果您的系统需要能够自主学习并且它的资源有限(例如,智能手机应用程序或火星上的漫游车),那么携带大量训练数据并占用大量资源来训练数小时一天是一场精彩的表演。

幸运的是,在所有这些情况下,更好的选择是使用能够增量学习的算法。

在线学习

网上学习中,你通过按顺序提供数据实例来逐步训练系统,无论是单独还是小组称为小批量。每个学习步骤都既快速又便宜,因此系统可以在新数据到达时动态学习(见图1-13)。

图 1-13。在在线学习中,模型经过训练并投入生产,然后随着新数据的出现不断学习

在线学习非常适合以连续流形式接收数据(例如股票价格)并需要快速或自主地适应变化的系统。如果您的计算资源有限,这也是一个不错的选择:一旦在线学习系统了解了新的数据实例,它就不再需要它们,因此您可以丢弃它们(除非您希望能够回滚到以前的状态和“重放”数据)。这可以节省大量空间。

在线的学习算法还可以用于在无法放入一台机器的主存储器的巨大数据集上训练系统(这称为核外学习)。该算法加载部分数据,在该数据上运行一个训练步骤,并重复该过程,直到它在所有数据上运行(见图1-14)。

在线学习系统的一个重要参数是它们应该以多快的速度适应不断变化的数据:这称为学习率。如果您设置了高学习率,那么您的系统将快速适应新数据,但它也会很快忘记旧数据(您不希望垃圾邮件过滤器仅标记它显示的最新类型的垃圾邮件) . 反之,如果你设置的学习率低,系统就会有更多的惯性;也就是说,它会学习得更慢,但它对新数据中的噪声或非代表性数据点(异常值)序列的敏感度也会降低。

图 1-14。使用在线学习处理庞大的数据集

在线学习的一大挑战是,如果将不良数据输入系统,系统的性能将逐渐下降。如果它是一个实时系统,您的客户会注意到。例如,不良数据可能来自机器人上的故障传感器,或者来自向搜索引擎发送垃圾邮件以试图在搜索结果中排名靠前的人。为了降低这种风险,您需要密切监视您的系统,并在检测到性能下降时立即关闭学习(并可能恢复到以前的工作状态)。您可能还想监控输入数据并对异常数据做出反应(例如,使用异常检测算法)。

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

对机器学习系统进行分类的另一种方法是根据它们的泛化方式。大多数机器学习任务都是关于制作预测。这意味着,给定大量训练示例,系统需要能够对其从未见过的示例做出良好的预测(泛化到)。对训练数据有一个好的性能度量是好的,但还不够;真正的目标是在新实例上表现良好。

泛化有两种主要方法:基于实例的学习和基于模型的学习。

基于实例的学习

可能最琐碎的学习形式就是用心学习。如果您要以这种方式创建垃圾邮件过滤器,它只会标记所有与用户已标记的电子邮件相同的电子邮件——不是最差的解决方案,但肯定不是最好的解决方案。

您的垃圾邮件过滤器不仅可以标记与已知垃圾邮件相同的电子邮件,还可以通过编程来标记与已知垃圾邮件非常相似的电子邮件。这个需要衡量两封电子邮件之间的相似性。两封电子邮件之间的(非常基本的)相似性度量可能是计算它们共有的单词数量。如果一封电子邮件与已知的垃圾邮件有很多相同的词,系统会将其标记为垃圾邮件。

这称为基于实例的学习:系统熟记示例,然后通过使用相似性度量将它们与学习示例(或它们的子集)进行比较来推广到新案例。例如,在图1-15中,新实例将被分类为三角形,因为大多数最相似的实例都属于该类。

图 1-15。基于实例的学习

基于模型的学习

其他从一组示例中进行概括的方法是建立这些示例的模型,然后使用该模型进行预测。这称为基于模型的学习(图1-16)。

图 1-16。基于模型的学习

例如,假设你想知道金钱是否让人快乐,所以你从OECD 的网站下载 Better Life Index 数据,并从IMF 的网站下载有关人均国内生产总值 (GDP) 的统计数据。然后你加入表格并按人均 GDP 排序。表 1-1显示了您得到的内容的摘录。

表 1-1。钱能让人更快乐吗?
国家人均国内生产总值(美元)生活满意度

匈牙利

12,240

4.9

韩国

27,195

5.8

法国

37,675

6.5

澳大利亚

50,962

7.3

美国

55,805

7.2

让我们绘制这些国家的数据(图1-17)。

图 1-17。你看到这里的趋势了吗?

这里似乎有一种趋势!虽然数据是嘈杂的(即部分随机的),看起来生活满意度随着国家人均 GDP 的增加或多或少呈线性上升。因此,您决定将生活满意度建模为人均 GDP 的线性函数。这个这一步称为模型选择:您选择了一个生活满意度线性模型,只有一个属性,即人均 GDP(公式 1-1)。

公式 1-1。一个简单的线性模型

life_satisfaction=θ0+θ1×GDP_per_capita

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

图 1-18。几种可能的线性模型

在使用模型之前,您需要定义参数值θ 0和θ 1。你怎么知道哪些值会让你的模型表现最好?要回答这个问题,您需要指定一个性能度量。你可以定义一个效用函数(或适应度函数)来衡量你的模型有多,或者你可以定义一个成本函数来衡量它有多糟糕。对于线性回归问题,人们通常使用成本函数来衡量线性模型的预测与训练样本之间的距离;目标是最小化这个距离。

这就是线性回归算法的用武之地:您将训练示例输入它,它会找到使线性模型最适合您的数据的参数。这个称为训练模型。在我们的例子中,算法发现最优参数值为θ 0 = 4.85 和θ 1 = 4.91 × 10 –5。

警告

令人困惑的是,相同的词“模型”可以指一种模型(例如,线性回归),到一个完全指定的模型架构(例如,一个输入和一个输出的线性回归),或者到准备用于预测的最终训练模型(例如,具有一个输入和一个输出的线性回归,使用θ 0 = 4.85 和θ 1 = 4.91 × 10 –5)。模型选择包括选择模型的类型并完全指定其架构。训练模型意味着运行算法以找到最适合训练数据的模型参数(并希望对新数据做出良好的预测)。

现在模型尽可能地拟合训练数据(对于线性模型),如图1-19所示。

图 1-19。最适合训练数据的线性模型

您终于准备好运行模型进行预测。例如,假设您想知道塞浦路斯人的幸福程度,而经合组织的数据没有答案。幸运的是,您可以使用您的模型做出很好的预测:您查看塞浦路斯的人均 GDP,找到 22,587 美元,然后应用您的模型,发现生活满意度可能在 4.85 + 22,587 × 4.91 × 10 -5 = 5.96。

满足你的胃口,示例1-1 显示了加载数据、准备数据、6创建散点图以进行可视化,然后训练线性模型并进行预测的 Python 代码。

示例 1-1。使用 Scikit-Learn 训练和运行线性模型

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import sklearn.linear_model

# Load the data
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")


# Prepare the data
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"]]

# Visualize the data
country_stats.plot(kind='scatter', x="GDP per capita", y='Life satisfaction')
plt.show()

# Select a linear model
model = sklearn.linear_model.LinearRegression()

# Train the model
model.fit(X, y)

# Make a prediction for Cyprus
X_new = [[22587]]  # Cyprus's GDP per capita
print(model.predict(X_new)) # outputs [[ 5.96242338]]

笔记

如果您使用过相反,基于实例的学习算法,您会发现斯洛文尼亚的人均 GDP 最接近塞浦路斯(20,732 美元),并且由于经合组织的数据告诉我们斯洛文尼亚人的生活满意度为 5.7,您会预测生活满意度为5.7 为塞浦路斯。如果您稍微缩小一点,看看接下来最接近的两个国家,您会发现葡萄牙和西班牙的生活满意度分别为 5.1 和 6.5。平均这三个值,您得到 5.77,这非常接近您基于模型的预测。这个简单的算法称为k-最近邻回归(在本例中,k = 3)。

将前面代码中的线性回归模型替换为 k-Nearest Neighbors 回归就像替换这两行代码一样简单:

import sklearn.linear_model
model = sklearn.linear_model.LinearRegression()

与这两个:

import sklearn.neighbors
model = sklearn.neighbors.KNeighborsRegressor(
    n_neighbors=3)

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

总之:

  • 你研究了数据。

  • 您选择了一个模型。

  • 您在训练数据上对其进行了训练(即,学习算法搜索最小化成本函数的模型参数值)。

  • 最后,你应用该模型对新案例进行预测(这称为推理),希望该模型能够很好地泛化。

这就是典型的机器学习项目的样子。在第二章中,您将通过端到端的项目来亲身体验这一点。

到目前为止,我们已经涵盖了很多领域:您现在知道机器学习的真正含义、它为何有用、一些最常见的 ML 系统类别是什么,以及典型的项目工作流程是什么样的。现在让我们看看在学习中会出现什么问题并阻止您做出准确的预测。

机器学习的主要挑战

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

训练数据量不足

为了一个蹒跚学步的孩子要了解苹果是什么,只需要你指向一个苹果并说“苹果”(可能重复这个过程几次)。现在孩子能够识别各种颜色和形状的苹果。天才。

机器学习还没有完全成熟。大多数机器学习算法需要大量数据才能正常工作。即使对于非常简单的问题,您通常也需要数千个示例,而对于图像或语音识别等复杂问题,您可能需要数百万个示例(除非您可以重用现有模型的部分内容)。

数据的不合理有效性

在发表的一篇著名论文中2001 年,Microsoft 研究人员 Michele Banko 和 Eric Brill 表明,非常不同的机器学习算法,包括相当简单的算法,一旦获得足够的数据,在自然语言消歧8的复杂问题上的表现几乎相同(如图1-1所示)-20 )。

图 1-20。数据与算法的重要性9

作为作者说,“这些结果表明,我们可能需要重新考虑在算法开发上花费时间和金钱与在语料库开发上花费时间和金钱之间的权衡。”

Peter Norvig 等人进一步推广了数据比复杂问题的算法更重要的想法。在2009 年发表的一篇题​​为“The Unreasonable Effectiveness of Data”的论文中。 10 然而,需要注意的是,中小型数据集仍然非常普遍,获得额外的训练数据并不总是那么容易或便宜⁠—所以暂时不要放弃算法。

非代表性训练数据

为了很好地泛化,您的训练数据必须能够代表您想要泛化到的新案例。无论您使用基于实例的学习还是基于模型的学习,都是如此。

例如,我们之前用于训练线性模型的一组国家并不完全具有代表性;一些国家失踪了。图 1-21显示了添加缺失国家后数据的样子。

 

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

如果您在此数据上训练线性模型,则得到实线,而旧模型由虚线表示。如您所见,添加一些缺失的国家不仅会显着改变模型,而且清楚地表明,这样一个简单的线性模型可能永远不会很好地工作。看起来非常富裕的国家并不比中等富裕的国家幸福(事实上,它们似乎更不幸福),相反,一些贫穷的国家似乎比许多富裕的国家幸福。

通过使用非代表性训练集,我们训练了一个不太可能做出准确预测的模型,尤其是对于非常贫穷和非常富裕的国家。

使用代表您想要概括的案例的训练集至关重要。这通常比听起来更难:如果样本太小,您将采样噪声(即由于偶然性而导致的不具代表性的数据),但如果采样方法有缺陷,即使是非常大的样本也可能不具代表性。这个称为抽样偏差

抽样偏差的例子

抽样偏差最著名的例子可能发生在 1936 年的美国总统大选期间,兰登与罗斯福对峙:《文学文摘》进行了一次非常大规模的民意调查,向大约 1000 万人发送邮件。它得到了 240 万个答案,并高度自信地预测兰登将获得 57% 的选票。相反,罗斯福以 62% 的选票获胜。缺陷在于文学文摘的抽样方法:

  • 首先,为了获得发送投票的地址,文学文摘使用了电话簿、杂志订阅者名单、俱乐部会员名单等。所有这些名单都倾向于支持更富有的人,他们更有可能投票给共和党(因此是兰登)。

  • 其次,不到 25% 的受访者回答了。这再次引入了抽样偏差,可能会排除不太关心政治的人、不喜欢《文学文摘》的人以及其他关键群体。这是一种特殊类型的抽样偏差,称为无响应偏差

这是另一个例子:假设你想建立一个系统来识别放克音乐视频。构建训练集的一种方法是在 YouTube 上搜索“放克音乐”并使用生成的视频。但这假设 YouTube 的搜索引擎返回一组视频,这些视频代表了 YouTube 上的所有放克音乐视频。实际上,搜索结果可能偏向于流行艺术家(如果你住在巴西,你会得到很多“放克 carioca”视频,听起来一点也不像 James Brown)。另一方面,你怎么能得到一个大的训练集?

劣质数据

显然,如果你的训练数据充满了错误、异常值和噪声(例如,由于测量质量差),这将使系统更难检测到潜在的模式,因此您的系统不太可能表现良好。花时间清理训练数据通常是值得的。事实是,大多数数据科学家花费大量时间来做这件事。以下是您想要清理训练数据的几个示例:

  • 如果某些实例显然是异常值,则简单地丢弃它们或尝试手动修复错误可能会有所帮助。

  • 如果某些实例缺少一些特征(例如,5% 的客户没有指定他们的年龄),您必须决定是否要完全忽略此属性,忽略这些实例,填写缺失值(例如,使用中位数年龄),或者训练一个具有该特征的模型和一个没有该特征的模型。

不相关的特征

作为俗话说:垃圾进,垃圾出。只有当训练数据包含足够的相关特征而不是太多不相关的特征时,您的系统才能进行学习。机器学习项目成功的一个关键部分是提出一组好的特征来训练。这个过程称为特征工程,包括以下步骤:

  • 特征选择(选择在现有特征中训练最有用的特征)

  • 特征提取(结合现有的特征来产生更有用的特征——正如我们之前看到的,降维算法可以提供帮助)

  • 通过收集新数据创建新功能

现在我们已经查看了许多不良数据的示例,让我们看一些不良算法的示例。

过度拟合训练数据

你正在访问一个外国,出租车司机敲诈你。你可能会想说那个国家的所有出租车司机都是小偷。过度概括是我们人类经常做的事情,不幸的是,如果我们不小心,机器可能会落入同样的陷阱。在机器学习中,这被称为过拟合:这意味着模型在训练数据上表现良好,但泛化能力不佳。

图 1-22显示了一个高度过拟合训练数据的多项式生活满意度模型示例。尽管它在训练数据上的表现比简单的线性模型好得多,但你真的相信它的预测吗?

图 1-22。过度拟合训练数据

诸如深度神经网络之类的复杂模型可以检测数据中的细微模式,但如果训练集有噪声,或者如果它太小(这会引入采样噪声),那么模型很可能会检测到噪声本身的模式。显然,这些模式不会推广到新实例。例如,假设您为您的生活满意度模型提供了更多属性,包括国家名称等不具信息性的属性。在这种情况下,一个复杂的模型可能会检测到这样的模式,例如训练数据中所有名称中带有w的国家的生活满意度都大于 7:新西兰(7.3)、挪威(7.4)、瑞典(7.2)、和瑞士(7.5)。你对w有多大的信心- 满意度规则推广到卢旺达或津巴布韦?显然,这种模式在训练数据中出现纯属偶然,但模型无法判断一种模式是真实的还是仅仅是数据中噪声的结果。

警告

当模型相对于训练数据的数量和噪声而言过于复杂时,就会发生过度拟合。以下是可能的解决方案:

  • 通过选择具有较少参数的模型(例如,线性模型而不是高次多项式模型)、减少训练数据中的属性数量或约束模型来简化模型。

  • 收集更多的训练数据。

  • 减少训练数据中的噪声(例如,修复数据错误并去除异常值)。

约束使其更简单并降低过拟合风险的模型称为正则化。例如,我们之前定义的线性模型有两个参数,θ 0和θ 1。这为学习算法提供了两个自由度来使模型适应训练数据:它可以调整直线的高度 ( θ 0 ) 和斜率 ( θ 1 )。如果我们强迫θ1= 0,该算法将只有一个自由度,并且将更难以正确拟合数据:它所能做的就是向上或向下移动线以尽可能接近训练实例,因此它会结束在平均值附近。确实是一个非常简单的模型!如果我们允许算法修改θ1但我们强制它保持较小,那么学习算法将有效地具有介于1到 2 个自由度之间的某个位置。它将产生一个比具有两个自由度的模型更简单但比只有一个自由度的模型更复杂的模型。您希望在完美拟合训练数据和保持模型足够简单以确保它能够很好地泛化之间找到适当的平衡。

图 1-23显示了三个模型。虚线表示在以圆形表示的国家(没有以正方形表示的国家)上训练的原始模型,虚线是我们用所有国家(圆形和正方形)训练的第二个模型,实线是经过训练的模型具有与第一个模型相同的数据,但具有正则化约束。您可以看到正则化迫使模型具有更小的斜率:该模型不适合训练数据(圆圈)以及第一个模型,但它实际上可以更好地泛化到它在训练期间没有看到的新示例(正方形) .

 

图 1-23。正则化降低了过拟合的风险

学习期间应用的正则化量可以由超参数控制。超参数是学习算法(不是模型)的参数。因此,它不受学习算法本身的影响;它必须在训练之前设置并在训练期间保持不变。如果你将正则化超参数设置为一个非常大的值,你将得到一个几乎平坦的模型(一个接近于零的斜率);学习算法几乎肯定不会过度拟合训练数据,但不太可能找到好的解决方案。调整超参数是构建机器学习系统的重要组成部分(您将在下一章中看到详细示例)。

欠拟合训练数据

作为您可能会猜到,拟合与过拟合相反:当您的模型过于简单而无法学习数据的底层结构时,就会发生这种情况。例如,生活满意度的线性模型容易欠拟合;现实只是比模型更复杂,所以它的预测必然是不准确的,即使在训练样本上也是如此。

以下是解决此问题的主要选项:

  • 选择功能更强大,参数更多的模型。

  • 为学习算法提供更好的特征(特征工程)。

  • 减少对模型的约束(例如,减少正则化超参数)。

退后一步

经过现在你对机器学习有了很多了解。但是,我们经历了这么多概念,您可能会感到有些失落,所以让我们退后一步,看看大局:

  • 机器学习是通过从数据中学习使机器在某些任务上做得更好,而不是必须明确地编写规则。

  • 有许多不同类型的 ML 系统:监督与否、批处理或在线、基于实例或基于模型。

  • 在 ML 项目中,您在训练集中收集数据,然后将训练集提供给学习算法。如果算法是基于模型的,它会调整一些参数以使模型适合训练集(即,对训练集本身做出良好的预测),然后希望它也能够对新案例做出良好的预测. 如果该算法是基于实例的,它只是牢记示例并通过使用相似性度量将它们与学习的实例进行比较来推广到新实例。

  • 如果您的训练集太小,或者如果数据不具有代表性、嘈杂或被不相关的特征(垃圾输入、垃圾输出)污染,系统将无法正常运行。最后,您的模型既不能太简单(在这种情况下会欠拟合),也不能太复杂(在这种情况下会过拟合)。

只有最后一个重要的话题要涵盖:一旦你训练了一个模型,你就不想仅仅“希望”它可以推广到新的案例。您希望对其进行评估并在必要时对其进行微调。让我们看看如何做到这一点。

测试和验证

了解模型对新案例的推广效果的唯一方法是在新案例上实际尝试。一种方法是将您的模型投入生产并监控它的性能。这很好用,但如果你的模型非常糟糕,你的用户会抱怨——这不是最好的主意。

一个更好的选择是将您的数据分成两组:训练集测试集。正如这些名称所暗示的,您使用训练集训练模型,并使用测试集对其进行测试。错误率在新案例上被称为泛化误差(或样本外误差),通过在测试集上评估您的模型,您可以估算出这个误差。这个值告诉你你的模型在它以前从未见过的实例上的表现如何。

如果训练误差很低(即你的模型在训练集上犯的错误很少)但泛化误差很高,这意味着你的模型过度拟合了训练数据。

小费

通常使用 80% 的数据进行训练留出20% 用于测试。但是,这取决于数据集的大小:如果它包含 1000 万个实例,那么保留 1% 意味着您的测试集将包含 100,000 个实例,这可能足以很好地估计泛化误差。

超参数调整和模型选择

评估模型很简单:只需使用测试集。但是假设您在两种模型之间犹豫不决(例如,线性模型和多项式模型):您如何在它们之间做出决定?一种选择是训练两者并比较它们使用测试集的泛化程度。

现在假设线性模型的泛化效果更好,但您想应用一些正则化以避免过度拟合。问题是,你如何选择正则化超参数的值?一种选择是为此超参数使用 100 个不同的值来训练 100 个不同的模型。假设你找到了最佳的超参数值,它可以生成具有最低泛化误差的模型——比如说,只有 5% 的误差。您将此模型投入生产,但不幸的是,它的性能不如预期,并产生 15% 的错误。刚才发生了什么?

问题是您在测试集上多次测量了泛化误差,并且您调整了模型和超参数以生成该特定集的最佳模型。这意味着该模型不太可能在新数据上表现良好。

一个这个问题的常见解决方案称为保留验证:您只需保留一部分训练集来评估几个候选模型并选择最佳模型。新的保留集称为验证集(有时称为开发集开发集)。更具体地说,您在缩减的训练集(即完整的训练集减去验证集)上训练具有各种超参数的多个模型,然后选择在验证集上表现最佳的模型。在此保留验证过程之后,您将在整个训练集(包括验证集)上训练最佳模型,这将为您提供最终模型。最后,您在测试集上评估这个最终模型以获得泛化误差的估计。

此解决方案通常效果很好。但是,如果验证集太小,那么模型评估将不精确:您最终可能会错误地选择次优模型。相反,如果验证集太大,那么剩余的训练集会比完整的训练集小很多。为什么这很糟糕?好吧,由于最终模型将在完整的训练集上进行训练,因此比较在小得多的训练集上训练的候选模型并不理想。这就像选择最快的短跑运动员参加马拉松比赛。一解决这个问题的方法是使用许多小的验证集执行重复的交叉验证。在对其余数据进行训练后,每个验证集都会对每个模型进行一次评估。通过对模型的所有评估进行平均,您可以更准确地衡量其性能。但是有一个缺点:训练时间乘以验证集的数量。

数据不匹配

在某些情况下,很容易获得大量用于训练的数据,但这些数据可能无法完全代表将在生产中使用的数据。例如,假设您想创建一个移动应用程序来拍摄鲜花并自动确定它们的种类。您可以轻松地在网络上下载数百万张鲜花图片,但它们并不能完全代表将在移动设备上使用该应用程序实际拍摄的图片。也许您只有 10,000 张具有代表性的照片(即,实际使用应用程序拍摄的照片)。在这种情况下,要记住的最重要的规则是验证集和测试集必须尽可能代表您希望在生产中使用的数据,因此它们应该仅由具有代表性的图片组成:您可以将它们打乱,一半放在验证集中,一半放在测试集中(确保两个集中都没有重复或接近重复)。但是在网络图片上训练你的模型之后,如果你观察到模型在验证集上的表现令人失望,你将不知道这是因为你的模型已经过拟合了训练集,还是仅仅是因为网页图片与手机应用图片不匹配。一 或者这是否只是由于网页图片和移动应用图片之间的不匹配。一 或者这是否只是由于网页图片和移动应用图片之间的不匹配。一解决方案是在另一个集合中保留一些训练图片(来自网络),Andrew Ng 称之为train-dev set。模型训练后(在训练集上,在 train-dev 集上),您可以在 train-dev 集上对其进行评估。如果它表现良好,那么模型就不会过度拟合训练集。如果它在验证集上表现不佳,则问题一定来自数据不匹配。您可以尝试通过预处理 Web 图像以使其看起来更像移动应用程序拍摄的图片来解决此问题,然后重新训练模型。反之,如果模型在 train-dev 集上表现不佳,那么它一定是对训练集过拟合了,所以你应该尝试对模型进行简化或正则化,获取更多的训练数据,并清理训练数据。

没有免费午餐定理

模型是观察的简化版本。简化旨在丢弃不太可能推广到新实例的多余细节。要决定丢弃哪些数据以及保留哪些数据,您必须做出假设。例如,线性模型假设数据基本上是线性的,并且实例与直线之间的距离只是噪声,可以放心地忽略。

1996 年的一篇著名论文中,11 David Wolpert证明如果您对数据完全不做任何假设,那么就没有理由偏爱一个模型而不是其他模型。这被称为无免费午餐(NFL) 定理。对于某些数据集,最佳模型是线性模型,而对于其他数据集,它是神经网络。没有先验的模型可以保证更好地工作(因此定理的名称)。确定哪种模型最好的唯一方法是评估它们。由于这是不可能的,因此实际上您对数据做出一些合理的假设并仅评估几个合理的模型。例如,对于简单的任务,您可以评估具有各种正则化水平的线性模型,对于复杂的问题,您可以评估各种神经网络。

练习

在本章中,我们介绍了机器学习中一些最重要的概念。在接下来的章节中,我们将深入研究并编写更多代码,但在此之前,请确保您知道如何回答以下问题:

  1. 您如何定义机器学习?

  2. 你能说出它突出的四种类型的问题吗?

  3. 什么是有标签的训练集?

  4. 两种最常见的监督任务是什么?

  5. 你能说出四个常见的无监督任务吗?

  6. 你会使用什么类型的机器学习算法来让机器人在各种未知地形中行走?

  7. 您将使用什么类型的算法将您的客户分成多个组?

  8. 您会将垃圾邮件检测问题定义为监督学习问题还是无监督学习问题?

  9. 什么是在线学习系统?

  10. 什么是核心学习?

  11. 哪种类型的学习算法依赖于相似性度量来进行预测?

  12. 模型参数和学习算法的超参数有什么区别?

  13. 基于模型的学习算法搜索什么?他们用来取得成功的最常见策略是什么?他们如何做出预测?

  14. 你能说出机器学习中的四个主要挑战吗?

  15. 如果您的模型在训练数据上表现出色,但对新实例的泛化能力很差,那会发生什么?你能说出三种可能的解决方案吗?

  16. 什么是测试集,为什么要使用它?

  17. 验证集的目的是什么?

  18. train-dev 集是什么,什么时候需要,如何使用?

  19. 如果您使用测试集调整超参数,会出现什么问题?