阅读宋立恒《AI制胜:机器学习极简入门》第1章:机器学习概述
Posted howard2005
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了阅读宋立恒《AI制胜:机器学习极简入门》第1章:机器学习概述相关的知识,希望对你有一定的参考价值。
机器学习研究的是计算机怎样模拟人类的学习行为,以获取新的知识或技能,并重新组织已有的知识结构使之不断改善自身。机器学习就是计算机从数据中学习规律和模式,以应用在新数据上做预测的任务。伴随着机器学习的火热,人工智能在机器学习的推动下,快速发展,迅速席卷全球,为很多行业带来可信的深刻洞察以及充满希望的前景。
一、什么是机器学习
前几天我把自己最喜欢的电影《谍中谍6》又看了一遍,这部电影实在是太精彩了,可以称为“最好看的谍战片”,《碟中谍》系列电影的前5部系列在豆瓣上评分都是8分以上。每当我在豆瓣上打开这部电影,豆瓣都会推荐我可能喜欢的其他电影。这些推荐的电影还真符合我的“口味”,比如推荐的电影《生死时速》、《飓风营救》也是我喜欢看的。那么豆瓣是如何知道用户的喜好,这些推荐背后的秘密是什么呢?
像豆瓣、淘宝、QQ音乐这些推荐系统,背后的秘密武器正是机器学习。下面我们用最通俗易懂的大白话来聊聊,到底什么是机器学习?
机器学习有点像人类的思考过程,假设我们去买苹果,苹果是一种营养成分高的水果,国外谚语“每天一个苹果,医生远离我”。我们想挑又脆又甜的苹果,怎么挑呢?记得妈妈说过,苹果的表面要光滑,没有虫眼,没有干枯。所以我们有了一个简单的判断标准:只挑表面要光滑的。
如果用计算机程序来帮我们挑选苹果,则可写下这样的规则:
if (表面光滑)
then
苹果是甜的
else
苹果不甜
我们会用这些规则来挑选苹果。如果在我们的苹果实验中有了新的发现,比如在我们买回的苹果中有些是不好吃的,经过品尝各种不同类型的苹果,我们发现如果带着蒂的话那一定要选蒂比较绿的,枯黄的话就说明苹果已经不新鲜了。
所以我们修改了规则:
if(表面光滑 and 蒂比较绿):
苹果是甜的
else:
苹果不甜
我们会发现这个普通的计算机算法有个缺点,那就是:我们得搞清楚影响苹果甜度的所有因素的错综复杂的细节,比如又发现了自然熟透了的苹果都是黄里透红,苹果越重说明含水量越充足,等等。如果问题越来越复杂,我们就要针对所有的苹果类型建立规则,手动地制定挑选规则就变得非常困难。
那如何解决克服这个缺点呢?机器学习算法可以解决这个问题。机器学习算法是由前面的普通算法演化而来的。通过自动地从提供的数据中学习,它会让我们的程序变得更“聪明”。
我们从市场上的苹果里随机地抽取一定的样品(在机器学习里叫作训练数据),制作成下面的一张表格,上面记着每个苹果的物理属性,比如颜色、大小、产地等。(这些苹果的属性称之为特征)。还记录下这个苹果甜不甜(这叫作标签)。
我们将这个训练数据提供给一个机器学习算法,然后它就会学习出一个关于苹果的特征和它是否甜之间关系的模型。下次我们再去市场买苹果,面对新的苹果(测试数据),然后将新的苹果输入这个训练好的模型,模型会直接输出这个苹果是甜的,还是不甜的。有了这个模型,我们现在可以满怀自信地去买苹果了,根本不用考虑那些挑选苹果的细节。只需要将苹果的物理属性输入这个模型,就直接可以知道苹果是不是甜的。
更重要的是,我们可以让这个模型随着时间越变越好(增强学习),当这个模型读进更多的训练数据,它就会更加准确,并且在做了错误的预测之后进行自我修正。这还不是最棒的地方,最棒的地方在于,我们可以用同样的机器学习算法去训练不同的模型,比如我们可以使用同样的机器算法来预测橘子、西瓜的模型。这是常规计算机传统程序办不到的,这就是机器学习的专属优势。
总结一下,机器学习是用机器学习算法来建立模型,当有新的数据过来时,可以通过模型来进行预测。机器学习最基本的做法,是使用算法来解析数据、从中学习,然后对真实世界中的事件做出决策和预测。与传统的为解决特定任务、硬编码的软件程序不同,机器学习是用大量的数据来“训练”,通过各种算法从数据中学习如何完成任务。
二、机器学习的流程
(一)数据收集
中国古代的“神农尝百草”的故事其实就是机器学习的思想,机器学习不是基于推理的“演绎法”,而是基于观测的“归纳法”。因为它用的是归纳法,所以数据是基础。其实人们很早就意识到了数据的重要性,比如在贴吧里,会看到铺天盖地的“求数据”。AI需要见过各种类型和各种状态的实物图片才行,这就需要大量的基础数据。
初始的人工智能软件就像初生的小婴儿一样,是一张白纸什么都不会,大家要教他认识周围的事物,告诉他鼻子是鼻子,鼻子是用来呼吸的;告诉他嘴巴是嘴巴,嘴巴是用来说话和吃东西的。AI也一样,我们需要向机器提供鼻子、嘴巴的图片,并将图片中的鼻子和嘴巴指出来,然后机器通过学习图片中鼻子和嘴巴的特征,并做好标注,机器就能够认知了。
大家应该都使用过上下班考勤的指纹打卡机,我们使用打卡机的时候,会先输入员工的指纹,再设置此指纹对应的员工的名字或者编号,待机器确认后,往后的日子只要输入指纹机器就都可以识别了。这便是最简单的人工智能原理:先输入信息,然后机器识别信息,再做输出。
机器学习的本质,一切都是量化的,而不是“抽象、模糊”的。原生的图片、文字等形式都是机器无法直接辨识的,都要先转化为数字、向量、矩阵。收集数据,再通过这些数据来训练人工智能模型。业界有一句非常著名的话:“数据决定了机器学习的上界,而模型和算法只是逼近这个上界。”由此可见,数据对于整个机器学习项目至关重要,有了优质数据的支持,人工智能才能更好地发展。
(二)数据预处理
在工程实践中,我们得到的数据会存在缺失值、重复值等,在使用之前需要进行数据预处理。数据预处理没有标准的流程,通常针对不同的任务和数据集属性的不同而不同。数据预处理的主要常用流程为:去除唯一属性、处理缺失值、特征编码、特征缩放。
去除唯一属性是因为唯一属性通常是一些id属性,这些属性并不能刻画样本自身的分布规律,所以简单地删除这些属性即可。
对于缺失值处理的方法,除了不处理直接使用含有缺失值的特征以及缺失值补全,也可以删除含有缺失值的特征(该方法在包含缺失值的属性含有大量缺失值并且仅仅包含极少量有效值时才是有效的)。
特征编码是指特征必须是数值型才能统计计算,所以要对特征进行编码。比如性别特征[‘male’, ‘female’]等,模型不能直接识别的数据,处理的目的是将不能够定量处理的变量量化。
为什么还要进行特征缩放?这是因为有些特征(属性)的值是有区间界限的,如年龄、体重。而有些特征的值是可以无限制增加的,所以特征与特征之间数值的差距会对模型产生不良影响(数量级的差异将导致量级较大的属性占据主导地位,依赖于样本距离的算法对于数据的数量级非常敏感)。如果没有对数据进行预处理的话有可能带来偏差,难以较好地反应特征之间的重要程度。通过归一化和标准化的手段将样本的属性缩放到某个指定的范围,消除样本不同属性具有不同量级时的影响。
(三)特征工程
特征工程也被称为特征提取,为了提取知识和做出预测,机器学习使用数学模型来拟合数据,这些模型将特征作为输入。特征就是原始数据某个方面的数值表示,在机器学习流程中,特征是数据和模型之间的纽带。
特征工程是通过对原始数据的处理和加工,将原始数据属性通过处理转换为数据特征的过程。某种程度而言,好的数据以及特征往往是一个性能优秀模型的基础,它是机器学习流程中一个极其关键的环节,因为正确的特征可以减轻构建模型的难度,从而使机器学习流程输出更高质量的结果。机器学习从业者有一个共识,那就是建立机器学习流程的绝大部分时间都耗费在特征提取和数据预处理上。
(四)模型构建和训练
当我们处理好数据之后,就可以选择合适的机器学习模型进行数据的训练了。可供选择的机器学习模型有很多,每个模型都有自己的适用场景,那么如何选择合适的模型呢?
首先我们要对处理好的数据进行分析判断,是考虑使用监督学习的模型,还是考虑使用无监督学习的模型。其次分析问题的类型是属于分类问题还是回归问题,当我们确定好问题的类型之后再去选择具体的模型。
在模型的实际选择时,通常会考虑尝试不同的模型对数据进行训练,然后比较输出的结果,选择最佳的那个。此外,我们还会考虑到数据集的大小。若是数据集样本较少,训练的时间较短,通常考虑朴素贝叶斯等一些轻量级的算法,否则的话就要考虑一些重量级的算法。
选好模型后是训练模型,训练模型意味着找到最合适的权重/参数,以便最大限度地分类(在分类问题中)或者预测与实际值之间的误差最小(在回归问题中)。
在验证数据上测试你的模型,使用计算和用于训练数据的相同参数来验证验证数据。一旦你尝试了不同的模型、不同的特征和不同的精度参数,并满足自己的机器学习模型的质量要求,你的学习模型就可以用于实际数据了。
三、机器学习该如何学
(一)AI时代首选Python
为何人工智能(AI)首选Python?读完这篇文章你就知道了。Python虽然是脚本语言,但是因为容易学,迅速成为了科学家的工具(MATLAB也能搞科学计算,但是软件要钱,而且很贵),从而积累了大量的工具库、架构。人工智能涉及大量的数据计算,用Python是非常自然,且简单高效。
Python有非常多优秀的深度学习库可用,现在大部分深度学习框架都支持Python,不用Python用谁?人生苦短,就用Python吧。Python现在的确已经很火了,这已经是一个不需要争论的问题了。Facebook公司开源了PyTorch之后,Python作为AI时代头牌语言的位置基本确立了。
你只要有一门编程语言基础,如C或VB,三天之内就能掌握了Python的使用技能。哪怕你是第一次接触编程语言,看看Python在线入门课程,花一周时间也会学得差不多了。因为Python比其他编程语言更加简单、易学,其面向对象特性甚至比Java、C#、.NET更加彻底。
Python是一种解释型语言,这意味着Python可以节省大量的项目开发时间,因为开发者完全不需要任何类型的编译和连接。在Python中,开发者可以用交互方式来使用解释器,无须耗费大量的时间和精力,这才是程序员最想要的。毕竟,时间就是金钱。
当你掌握Python基本语法之后,需要再花一点时间去学习处理数据与操作数据的方法,熟悉一下Pandas、NumPy和Matplotlib这些工具包的使用方法。Pandas工具包可以处理数据帧,数据帧类似于Excel文件当中的信息表,有横行和纵列。这种数据就是所谓的结构化数据。NumPy工具包可以基于数据进行数值运算,机器学习可以把能想象到的一切事物转化为数字,再建立出这些数字中的模型。Matplotlib工具包可以制图,实现数据可视化。对读者来说,理解表格中的一堆数据可能很难,相信大家会更喜欢那种有线条贯穿始终的图表,实现数据可视化是交流成果的重要环节。
非常重要的机器学习工具包scikit-learn已经成为机器学习领域当中最知名的Python模块了。scikit-learn简称sklearn,支持包括分类、回归、降维和聚类等机器学习算法,还包含了特征提取、数据处理和模型评估三大模块。sklearn涵盖了几乎所有主流机器学习算法的实现,它具有BSD许可证授权(BSD只要求你对软件原作者的工作进行必要的认可和尊重就行了,所以这是适合商业应用的),可以将项目应用于商业开发。
sklearn官网网址http://scikit-learn.org/stable/index.html,里面讲解了基于sklearn对所有算法的实现和简单应用。在工程应用中,用Python手写代码来从头实现一个算法的可能性非常低,这样不仅耗时耗力,还不一定能够写出结构清晰、稳定性强的模型。更多情况下,是分析采集到的数据,根据数据特征选择适合的算法,在工具包中调用算法,调整算法的参数,获取需要的信息,从而实现算法效率和效果之间的平衡。而sklearn正是这样一个可以帮助我们高效实现算法应用的工具包。
(二)PyCharm可视化编辑器和Anaconda大礼包
“工欲善其事,必先利其器”,我更喜欢安装一些功能强大的Python软件来辅助我编写程序。就像在学习Java时,正常情况选择安装JDK,然后配置环境变量,用记事本编写程序,再到终端编译运行即可,而我一般选择安装JDK+Eclipse。将Python和Java进行类比的话,在Python中使用PyCharm或Anaconda好比是在Java中使用Eclipse。以下分别介绍PyCharm和Anaconda。
1、PyCharm可视化编辑器
PyCharm作为一款针对Python的编辑器,配置简单、功能强大、使用起来省时省心,对初学者友好。PyCharm官网提供免费的社区版与付费的专业版,个人学习Python使用免费的社区版已足够用了。安装过程照着提示一步步操作即可。
……
总之,PyCharm是JetBrains打造的一款Python IDE(集成开发环境)。它具备调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单元测试、版本控制等功能。可以帮助程序员节约时间,提高生产效率。
2、Anaconda大礼包
Anaconda是一个基于Python的数据处理和科学计算平台,相当于一个“全家桶”。它已经内置了许多非常有用的第三方库。安装好Anaconda,就相当于把Python和一些如NumPy、Pandas、Scrip、Matplotlib等常用的库自动安装到位,使得安装比常规Python安装要容易。如果选择安装Python的话,那么还需要pip install逐个安装各种库,安装起来比较痛苦。
可以选择“Anaconda Prompt”,打开一个命令行窗口,你可以输入“conda list”命令,可以查看目前已经安装的各种工具包库函数。如果需要额外安装一些其他的工具包,则可以使用“pip install”命令。如果在安装过程中报错,可以先尝试下载安装包,然后再进行安装。
还有一个好用的工具是Jupyter Notebook,Jupyter Notebook相当于在浏览器中完成编程任务,不仅可以写代码,做笔记,而且还可以得到每一步的执行结果。它是一个在浏览器中使用的交互式的笔记本,可以将代码、文字完美地结合起来。
(三)掌握算法原理与掌握机器学习软件库同等重要
很多人会认为工具包已经很成熟了,是不是只要将相应的数据输入工具、框架中,用几行代码指定模型的类型和参数,就能自动计算出结果。既然如此,何必再去学习其中的原理,一步步推导呢?
我的意见是机器学习的原理和数学推导一定要学!此处举个直观的例子:工具就像是武器,学会使用某种工具,只是学会了这种武器最基本的招式和套路。而理论学习即策略学习,决定了在未来真实对战中,遇到对手攻击时,你选取哪些招式套路,如何组合起来去迎敌。
这里有两点建议:
- 熟悉算法原理比实现算法重要:机器学习的本质是数学和统计学的结合,搞懂这些才是王道。我们知道一个模型可能有好多参数,不同参数的设置带来的模型效果可能截然不同,我们只有弄懂了理论原理,才能更好地指导我们选择合适的参数。如果你只是实现了算法,却没有让算法发挥最大的效果,那又有什么意义呢? 学习的过程是有些枯燥,本书强调机器学习极简入门,把枯燥的算法用通俗的白话演绎出来,同时又渗透高等数学知识,保持你对数据科学的兴趣和动力。
- 熟悉掌握一个机器学习软件库:成熟的软件库一般包含了绝大多数的机器学习算法,并且在实现上使用了许多的数值计算优化技巧。为了实现自己的需求,我们不必从头实现算法,即使你实现了,你的计算效率也一定没有软件库实现的高,所以我们要熟练使用一个软件库。
(四)机器学习与深度学习的区别
机器学习是人工智能的一个重要的子集,深度学习又是机器学习的一个重要的子集,如下图所示。机器学习与深度学习都是需要大量数据来“喂”的,同时深度学习还需要更高的运算能力支撑,如GPU
。
深度学习(Deep Learning,简称DL)属于机器学习的子类。它的灵感来源于人类大脑的工作方式,是用于建立、模拟人脑进行分析学习的神经网络,也是模仿人脑的机制来解释数据的一种机器学习技术。它的基本特点是试图模仿大脑的神经元之间传递、处理信息的模式。最显著的应用是计算机视觉和自然语言处理(NLP)领域。显然,“深度学习”与机器学习中的“神经网络”是强相关的,我们可以将“深度学习”称之为“改良版的神经网络”算法,可理解为包含多个隐藏层的神经网络结构。为了提高深层神经网络的训练效果,人们对神经元的连接方法以及激活函数等方面做出了调整。其目的在于建立、模拟人脑进行分析学习的神经网络,模仿人脑的机制来解释数据,如文本、图像、声音。
神经网络的计算量非常大,事实上在很长时间里由于基础设施技术的限制进展并不大。而GPU的出现让人们看到了曙光,也造就了深度学习的蓬勃发展,“深度学习”才一下子火热起来。
用机器学习的技术,开发算法来感知图像,例如识别图像是不是一个停止标志牌,但是它太容易受环境条件的干扰。如果遇到阴雨天,标志牌变得不是那么清晰可见,算法就难以成功了,但是随着时间的推移,学习算法的发展改变了一切。
人工神经网络(Artificial Neural Network)是早期机器学习中的一个重要的算法,历经数十年风风雨雨。神经网络的原理是受我们大脑的生理结构—互相交叉相连的神经元启发。例如:我们可以把一幅图像切分成图像块,输入到神经网络的第一层。在第一层的每一个神经元都把数据传递到第二层。第二层的神经元也是完成类似的工作,把数据传递到第三层,以此类推,直到最后一层,然后生成结果。每一个神经元都为它的输入分配权重,这个权重的正确与否与其执行的任务直接相关。最终的输出由这些权重加总来决定。
我们仍以识别停止(Stop)标志牌为例,用神经元进行“检查”,神经网络的任务就是给出结论,它到底是不是一个停止标志牌。神经网络会根据所有权重,给出一个经过深思熟虑的猜测。因为它还是很容易出错的。它最需要的就是几千、上万甚至几百万张图像来训练,直到神经元的输入的权值都被调制得十分精确,无论是否有雾,晴天还是雨天,每次都能得到正确的结果。只有这个时候,我们才可以说神经网络成功地自学习到一个停止标志。
深度学习(Deep Learning)加入了“深度”(Deep)。这里的“深度”就是说神经网络中众多的层。层数非常多,神经元也非常多,然后给系统输入海量的数据来训练。现在,经过深度学习训练的图像识别,在一些场景中甚至可以比人做得更好:从识别猫,到识别血液中癌症的早期成分,到识别核磁共振成像中的肿瘤。Google的AlphaGo先是学会了如何下围棋,然后与自己下棋进行训练。它训练自己神经网络的方法,就是不断地与自己下棋,反复地下,永不停歇。
机器学习和深度学习都是AI的具体技术实现,但两者区别明显。机器学习更是一种通用型的技术,包括决策树、贝叶斯、支持向量机等算法,也包括神经网络算法。而深度学习深耕神经网络,是深度神经网络算法技术,包括深度卷积网络、深度循环网络等。
机器学习能够适应各种数据量,特别是数据量较小的场景。如果数据量迅速增加,那么深度学习的效果将更加突出,这是因为深度学习算法需要大量的数据才能完美理解。另外,深度学习算法需要高端GPU在大量数据的合理时间内进行训练。这些GPU非常昂贵,但是如果没有它们训练深层网络来实现高性能,这在实践上就不可行。高性能的GPU才能够实现快速计算,在建模上才能花更少时间来分析所有的图像。相对而言,传统的机器学习算法只需要一个CPU就可以训练得很好,而不需要最好的硬件。
四、机器学分类
根据训练数据是否有标注,机器学习问题大致划分为监督学习(Supervised Learning)和无监督学习(UnsupervisedLearning)两大类。
(一)监督学习
在社会中,我们在很小的时候就被大人教授这是鸟啊,那是猪啊,这个是西瓜,那个南瓜,这个可以吃,那个不能吃啊之类的,我们眼里见到的这些景物和食物就是机器学习中的输入,大人们告诉我们的结果就是输出,久而久之,当我们见得多了,大人们说得多了,我们脑中就会形成一个抽象的模型,下次在没有大人提醒的时候看见别墅或者洋楼,我们也能辨别出来这是房子,不能吃,房子本身不能飞等信息。上学的时候,老师教认字、数学公式、英语单词等等,我们在下次碰到的时候,也能区分开并识别它们。这就是监督学习,它在我们生活中无处不在。每个输入样本都有标注,这些标注就像老师的标准答案一样“监督”着学习的过程。
监督学习又大致分成两类:分类(Classification)和回归(Regression):
-
分类问题:标注是离散值,比如用户“点击”和“不点击”。如果标注只有两个值,则称为二分类,如果标注有多个值,则称为多分类。
-
回归问题:标注是连续值,比如如果问题是预测北京市房屋的价格,价格作为标注就是一个连续值,属于回归问题。
假如你想预测一下现在的房价,这是一个数据集,横轴是房子的大小,纵轴是房价。例如你有一套100平方米的房子,你想知道能卖多少钱,那么机器学习算法怎么帮助你呢?它会根据数据集拟合出一个函数,让函数尽可能匹配到所有的数据。当你输入房子的大小,它就会返回给你一个目前市场上比较合理的价格。这是一个监督学习的例子,是一种回归(Regression)问题,意指要预测一个连续值的输出。例如上面的房价,给定房价的数据集,对于里面的每套房子大小数据,算法都知道其对应的正确房价。
再看一个监督学习的例子,这是一个胸部肿瘤的数据集,横轴表示肿瘤的大小,纵轴表示肿瘤是否为良性的。假如有人非常不幸,胸部长了肿瘤,对应的机器学习算法就是,根据肿瘤的尺寸,估算出一个概率,即肿瘤为良性肿瘤的概率或者恶性肿瘤的概率。当然这是一个分类(Classification)问题。分类就是要预测一个离散值的输出,这里是0/1,也就是良性/恶性。
总结一下,在有监督的学习中,我们得到一个训练数据集,监督学习的训练集要求包括输入输出,也可以说是特征和目标,训练集中的目标是由人标注的。数据集中的每个样本有相应的“正确答案”,即认为输入和输出之间有一个关系。我们从给定的训练数据集中学习出一个函数(模型参数),当新的数据到来时,可以根据这个函数预测结果。根据这些样本做出预测分成两类:回归问题和分类问题。回归问题举例,例如:预测房价,根据样本集拟合出一条连续曲线。分类问题举例,例如:根据肿瘤特征判断良性还是恶性,得到的是结果是“良性”或者“恶性”。
(三)无监督学习
我们事先没有任何训练数据样本,需要直接对数据进行建模。比如去参观一个画展,我们对艺术一无所知,但是欣赏完很多幅作品之后,我们面对一幅新的作品之后,至少可以知道这幅作品是什么流派的吧,比如更抽象一些还是更写实一点,虽然不能很清楚地了解这幅画的含义,但是至少我们可以把它分为哪一类。
在无监督学习中,我们没有属性或者标注这个概念了。也就是所有的数据都是一样的,没有什么区别。所以在无监督学习中,我们只有一个数据集,没人告诉我们应该怎么做,我们也不知道每个数据点是什么意思。它只告诉你,这里是一个数据集,你能在其中找到某种结构或者规律吗?
基于给出的数据集,无监督学习算法可以给出不同的聚类,这就是所谓的聚类算法。举个例子,给定一组不同的个体,对于每一个不同的个体,检测它们是否拥有某个特定的基因,然后我们运行一个聚类算法,把不同的个体归入不同的类,这就是无监督学习。因为没有提前告诉我们的算法,这种基因类型具体属于哪一类的人,我们只是告诉算法这里有一堆数据,我也不知道这些数据是什么,但是你要帮我自动找到这些数据中的类型。
无监督学习使我们能够解决那些事先不知道结果的问题。训练样本没有标注,无监督学习解决的典型问题是聚类(Clustering)问题。虽然我们并不知道变量的影响,但是我们可以从数据中提取结构。我们可以根据数据中变量之间的关系对数据进行聚类,从而得出这种结构。比如对一个网站的用户进行聚类,看看这个网站用户的大致构成,分析一下每类用户群的特点是什么。
总结一下,无监督学习就是:输入数据没有被标记,也没有确定的结果。样本数据类别未知,需要根据样本间的相似性对样本集进行分类(即聚类,Clustering),试图使类内差距最小化,类间差距最大化
。在实际应用中,不少情况下无法预先知道样本的标签,也就是说没有训练样本对应的类别,因而只能从原先没有标注的样本集开始学习分类。
(三)强化学习
这里先解释一下强化学习这个名字。为什么叫强化学习呢?因为这个过程是不断重复、不断强化认知,英文ReinforcementLearning中的Reinforcement更准确的中文翻译就是“强化”。
这里最关键的因素是三个:智能体(Agent)
、状态(State)
和奖励(Reward)
。对于Agent来说,自身具备的选择决策的能力,叫作策略。这个策略意思就是,观测到了环境现在处于什么状态,而选择做出什么动作来。现在智能体处于一个很暗的环境之中,它并不知道这个环境里面到底是什么,我们希望它能够通过和环境打交道来适应这个环境,学会做什么动作才是最好的。这个智能体不是做一次决策就完成了学习的过程。实际上,它要做的是一个序列的决策。我们怎么评判智能体策略的好坏呢?评判的形式就是,它能拿到的奖励会有多大。每一步都可能有奖励,所以评判的形式是把总的奖励加起来看看它有多大。
为了更好地认识强化学习,我们通过一个现实世界中与其类似的场景进行理解。如下图所示,使用强化学习来训练狗的一般过程。
在这种情况下,强化学习的目标是训练狗(Agent代理)在一个环境(Environment)中完成一项任务,这里的“环境”包括狗所处的物理环境和训练者。首先,驯兽师发出一条命令或指示,狗会观察(Observation),然后狗会做出反应。如果动作接近期望的行为,训练者可能会提供奖励(Reward),如食物或玩具,否则,将不提供任何奖励或提供负面奖励。在训练开始的时候,狗可能会做出更多的随机动作(Action),比如当命令是“坐下”时,它会翻身,因为它试图将特定的观察与动作和奖励联系起来。观察和动作之间的这种关联或映射称为策略(Policy)。
从狗的角度来看,最理想的情况是它能对每一个提示做出正确的反应,这样它就能得到尽可能多的奖励。因此,强化学习训练的全部意义在于“调整”狗的策略,使它学习期望的行为,从而获得最大的回报。训练完成后,狗应该能够观察主人并采取适当的行动,例如,当命令它“坐下”时,它应该使用它“发展”出的内部策略来“坐下”。
强化学习同样没有标签(Label),但是拥有回报函数(即奖励)来判断你是否更加接近目标。例如让学生搜寻某个正确答案,学生靠近正确答案,就进行奖励—比如给一个棒棒糖,如果更加偏离答案,就被扣一分,久而久之,学生会越来越靠近正确答案。
五、过拟合和欠拟合
无论在机器学习还是深度学习建模当中都可能会遇到两种最常见结果,一种叫过拟合(Over-fitting);另一种叫欠拟合(Under-fitting)。
(一)过拟合
1、为什么发生过拟合
所谓过拟合(Over-fitting)其实就是所建的机器学习模型或者是深度学习模型在训练样本中表现得过于优越,导致在验证数据集以及测试数据集中表现不佳。过拟合就是学到了很多没必要的特征,比如长得像猫的狗,或者长得像狗的猫,其实这只是特例,但神经网络为了更好地降低损失(Loss),就只能被迫学习这些特征用来区分猫和狗。但是学习得太过了。举个例子:一个男人穿着蓝色的衣服,神经网络可能把是否穿蓝色衣服作为区分男人女人的特征,这就是过拟合。遇到了新样本,这些错误的特征就没有什么用了。所以过拟合就是表现为训练的时候效果很好(因为神经网络已经学到了很多有用没用的特征),但是在测试样本上的效果就很差(有的特征完全没用)。一般来说,如果训练数据集过小,特别是比模型参数数量更小时,过拟合更容易发生。
2、降低“过拟合”的方法
(1)增加训练数据
举个例子,投硬币问题,如果你碰巧投了10次都是正面,那么你根据这个数据学习,是无法揭示真实规律的,根据统计学的大数定律(通俗地说,这个定理就是,在试验不变的条件下,重复试验多次,随机事件的频率近似于它的概率),当样本多了,这个真实规律是必然出现的。使用更多的训练数据是解决过拟合的最有效手段,因为更多的数据能让模型学习到更多的有效特征,减小噪声的影响。当然,直接增加实验数据一般是困难的,但是可以通过一定的规则来扩充训练数据。比如,在图像分类的问题上,可以通过图像的平移、旋转、缩放等方法来扩充数据;更进一步,可以使用生成式对抗网络(GAN)来合成大量的新数据。
(2)降低模型复杂度
在数据较少时,模型过于复杂是产生过拟合的主要因素,适当降低模型复杂度可以避免模型拟合过多的采样噪声。例如,在神经网络模型中减少网络层数、神经元个数等;在决策树模型中降低树的深度、进行剪枝等。
(3)正则化的方法
给模型的参数加上一定的正则约束。比如将权值的大小加入到损失函数中(损失函数用来评价模型的预测值和真实值不一样的程度。通常情况下,损失函数越好,模型的性能越好)。
(二)欠拟合
1、为什么发生欠拟合
所谓欠拟合(Under-fitting)是什么意思呢?相对过拟合,欠拟合还是比较容易理解,可能训练样本被提取的特征比较少,导致训练出来的模型不能很好地匹配,甚至样本本身都无法高效地识别。训练的模型在训练集上表现很差,在验证集上表现也很差,其本质的原因是训练的模型太简单,最通用的特征模型都没有学习到。
2、降低“欠拟合”的方法
(1)添加新特征
当特征不足或者现有特征与样本特征标签的相关性不强时,模型容易出现欠拟合。
(2)增加模型复杂度
简单的模型学习能力较差,通过增加模型的复杂度可以使模型拥有更强的拟合能力。例如在线性模型中添加高次项,在网络模型中增加网络层数或神经元个数。
六、衡量机器学习模型的指标
对于模型性能的好坏,我们并不知道这个模型很可能就是一个差的模型(对测试集不能很好地预测或分类)。那么如何知道这个模型是好是坏呢?我们必须有个评判的标准。为了进一步了解模型的能力,我们需要用某个指标来衡量,这就是性能度量的意义。有了一个指标,我们就可以对比不同模型了,从而知道哪个模型相对好,哪个模型相对差,并通过这个指标来进一步调参以逐步优化我们的模型。
(一)正确率、精确率和召回率
假设你有一台自动分类装置,可以自动检测、分类目标。为论述方便,我们就假设它是用来预测某种疾病的机器。这台机器需要用某种疾病的数据作为输入,输出只可能为两条信息之一:有病或者没有病。虽然机器的输出只有两种,但是其内部对疾病的概率估计是一个实数,比如说p。机器上还有一个旋钮用来控制灵敏度阈值a。因此预报过程是这样子:首先用数据计算出p,然后比较p和a的大小,p>a就输出有得病(检测结果为阳性),p<a就输出没有得病(检测结果为阴性)。
如何评价这台机器的疾病预测性能呢?这里就要注意了,并不是每一次都能准确预报的机器就是好机器,因为它可以次次都预报有疾病(把a调得很低),自然不会漏掉,但是在绝大多数时候它都只是让大家虚惊一场,称为虚警;相反,从不产生虚警的机器也不一定就是好机器,因为它可以天天都预报没有得病(把a调得很高)——在绝大多数时间里这种预测显然是正确的,但也必然漏掉真正的病症,称为漏报。一台预测能力强的机器,应该同时具有低虚警和低漏报。精确率高意味着虚警少,能保证机器检测为阳性时,事件真正发生的概率高,但不能保证机器检测为阴性时,事件不发生。相反,召回率高意味着漏报少,能保证机器检测为阴性时,事件不发生的概率高,但不能保证机器检测结果为阳性时,事件就一定发生。
先介绍几个常见的模型评价术语,现在假设我们的分类目标只有两类,正例(Positive)和负例(Negative)分别是:
- True Positives(TP):被正确地划分为正例的个数,即实际为正例且被分类器划分为正例的实例数(样本数)。
- False Positives(FP):被错误地划分为正例的个数,即实际为负例但被分类器划分为正例的实例数。
- False Negatives(FN):被错误地划分为负例的个数,即实际为正例但被分类器划分为负例的实例数。
- True Negatives(TN):被正确地划分为负例的个数,即实际为负例且被分类器划分为负例的实例数。
用大白话说,真正例TP是指模型将正类别样本正确地预测为正类别,同样真负例TN是指模型将负类别样本正确地预测为负类别;假正例FP是指模型将负类别样本错误地预测为正类别,而假负例FN是指模型将正类别样本错误地预测为负类别。这四个术语的混淆矩阵,如下图所示。
正确率是我们最常见的评价指标,正确率(Accuracy)=(TP+TN)/(P+N),这个很容易理解,就是被分对的样本数除以所有的样本数。通常来说,正确率越高,分类器越好。
错误率则与正确率相反,描述被分类器错分的比例,错误率(Error Rate)=(FP+FN)/(P+N)。对某一个实例来说,分对与分错是互斥事件。
灵敏度(Sensitive)=TP/P,表示的是所有正例中被分对的比例,它衡量了分类器对正例的识别能力。
特效度(Specificity)=TN/N,表示的是所有负例中被分对的比例,它衡量了分类器对负例的识别能力。
精确率也叫精度(Precision),是针对我们预测结果而言的,表示被分为正例的示例中实际为正例的比例,那么预测为正就有两种可能了,一种就是把正类预测为正类(TP),另一种就是把负类预测为正类(FP),精度Precision=TP/(TP+FP)。
召回率(Recall)是覆盖面的度量,度量有多个正例被分为正例。召回率也是针对我们原来的样本而言的,它表示的是样本中的正例有多少被预测正确了。那也有两种可能,一种是把原来的正类预测成正类(TP),另一种就是把原来的正类预测为负类(FN),召回率Recall=TP/(TP+FN)=TP/P=灵敏度Sensitive,可以看到召回率与灵敏度是一样的。
举一个例子,假设儿童有5万例,识别成儿童的有4万例,识别成Other(其他)的有1万例;Other有10万例,识别成Other的有8万例,识别成儿童的有2万例。由于我们现在分析的是儿童的准确率和召回率,所以儿童是正类,Other是负类。下面分析一下儿童的准确率和召回率:
- 检索到儿童,是儿童的数据并识别为儿童(即正类识别为正类),TP=4万。
- 把Other识别成儿童(即负类识别为正类),FP=2万。
- 未检索到儿童,是儿童却识别为Other(即正类识别为负类),FN=1万。
- 把Other识别为Other(负类识别为负类,TN=8万)。
精确率可以解释为,在所有判别为儿童的数据中是儿童的比例,精确度=TP/(TP+FP)=66.67%;召回率可解释为,在所有儿童相关的数据中,判别为儿童的比例,召回率=TP/(TP+FN)=80%。
一般来说,我们不可能同时提高所有上面介绍的指标,比如人们希望精确率和召回率都高,最好都是100%,这样代表识别出来的样本确实都是正类别,且所有正类别都被识别出来了,但是现实中这两个指标往往是此消彼长的关系。提高精确率通常会降低召回率值,即使不从数学上去证明一下,从感觉上也能理解,因为这两个指标的目标刚好相反,一个要求尽可能精确,那么要抛弃掉难以决定的、把握不大的样本;而另一个指标要求尽可能识别出所有的正类别,那么就可能带入把握不大的样本。可以想象一下识别垃圾邮件,精确与识别全是难以两全的。
根据实际应用场景,比如医院检测疾病的仪器是宁愿多虚警也要少漏报,因为没病的病人如果错误地检测出有病(虚警),可以通过后续更加仔细地检查进一步排除。比如网贷违约率,相对好用户,我们更关心坏用户,不能错放过任何一个坏用户。因为如果我们过多地将坏用户当成好用户,这样后续可能发生的违约金额会远超过好用户偿还的借贷利息金额,结果得不偿失。召回率越高,代表实际坏用户被预测出来的概率越高,它的含义类似“宁可错杀一千,绝不放过一个”。再比如地震预测,没有谁能准确预测地震的发生,但我们能容忍一定程度的误报,虽然谎报了几次地震,但真的地震来临时,我们没有错过,这样才是我们想要的。
(二)F1 score和ROC曲线
由于存在精确率和召回率两个指标,对于多个模型来说,这两个指标差不多的情况下难以判断哪个更好,于是出现了F1值。假如两个模型识别样本的精确率与召回率分别是:0.6 0.6与0.5 0.7,那么哪个更好呢?于是数学家又定义了一个指标去计算,名叫:Fscore,常见的是F1 score。
1、F1 score
F1 score是精确值和召回率的调和均值,它的公式如下图所示。
对于上面的两个例子,F1 score分别是:
- precision=0.6 recall=0.6时,F1 score=0.60。
- precision=0.5 recall=0.7时,F1 score=0.58。
显然precision=0.6 recall=0.6的模型效果相对稍微好一点。
2、ROC曲线
ROC曲线起源于第二次世界大战时期雷达兵对雷达的信号判断。当时每一个雷达兵的任务就是去解析雷达的信号,但是当时的雷达技术还没有那么先进,存在很多噪声(比如一只大鸟飞过),所以每当有信号出现在雷达屏幕上,雷达兵就需要对其进行破译。有的雷达兵比较谨慎,凡是有信号过来,他都会倾向于解析成是敌军轰炸机,有的雷达兵又比较神经大条,会倾向于解析成是飞鸟。这个时候,雷达兵的上司就很头大了,他急需一套评估指标来帮助他汇总每一个雷达兵的预测信息,以及来评估这台雷达的可靠性。于是,最早的ROC曲线分析方法就诞生了,用来作为评估雷达可靠性的指标,在那之后,ROC曲线就被广泛运用于医学以及机器学习领域。
ROC的全称是Receiver Operating Characteristic Curve,中文名字叫“受试者工作特征曲线”,顾名思义,其主要的分析方法就是画这条特征曲线,图样示例如下图所示。可以看到该曲线的横坐标为假阳性率(False Positive Rate,FPR),负例分错的概率=FP/(FP+TN),俗称假警报率。纵坐标为真阳性率(True Positive Rate,TPR),正例分对的概率=TP/(TP+FN),其实就是查全率(召回率Recall),预测对的正例数占真正的正例数的比率。
如果是随机分类(比如投掷硬币),没有进行任何学习器,FPR=TPR,即正例分对和负例分错概率相同,预测出来的正例负例和正例负例本身的分布是一致的,所以是一条45°的直线。因此,ROC曲线越向上远离这条45°直线,说明用了这个学习器在很小的代价(负例分错为正例,横轴)下达到了相对较大的查全率(TPR)。
举一个简单的例子方便大家的理解,还是刚才雷达的例子。假设现在有10个雷达信号警报,其中8个是真的轰炸机(P是真实正样本的个数)来了,2个是老鹰(N是真实负样本的个数)飞过,经过某分析员解析雷达的信号,判断出9个信号是轰炸机,剩下1个是老鹰,其中被判定为轰炸机的信号中,有1个其实是老鹰的信号(FP=1,FP是N个负样本中被分类器预测为正样本的个数),而剩下8个确实是轰炸机信号(TP=8,TP是P个正样本中被分类器预测为正样本的个数)。因此可以计算出FPR为0.5,TPR为1,而(0.5,1)就对应ROC曲线上一点。对于敏锐的雷达系统来说,我们肯定希望它能把所有的敌方轰炸机来袭都感知到并预测出来,即TPR越高越好,但我们又不希望把飞过的老鹰也当成轰炸机来预警,即FRP越低越好。这两个坐标值其实蕴含了相互制约的一个概念。
当绘制完成曲线后,就会对模型有一个定性的分析。ROC曲线的应用场景有很多,根据上述的定义,其最直观的应用就是能反映模型在选取不同阈值的时候其敏感性(Sensitivity,FPR)和其精确性(Specificity,TPR)的趋势走向。ROC曲线还有一个巨大的优势就是,当正负样本的分布发生变化时,其形状能够基本保持不变。
以上是关于阅读宋立恒《AI制胜:机器学习极简入门》第1章:机器学习概述的主要内容,如果未能解决你的问题,请参考以下文章