第一部分:分类
本书前两部分主要探讨监督学习(supervisedieaming)。在监督学习的过程中,我们只需要给定输入样本集,机器就可以从中推演出指定目标变量的可能结果。监督学习相对比较简单,机器只需从输入数据中预测合适的模型,并从中计算出目标变量的结果。
监督学习一般使用两种类型的目标变量:标称型和数值型。标称型目标变量的结果只在有限目标集中取值,如真与假、动物分类集合{爬行类、鱼类、哺乳类、两栖类、植物、真菌};数值型目标变量则可以从无限的数值集合中取值,如0.100、42.001、000.743等。数值型目标变量主要用于回归分析,将在本书的第二部分研究,第一部分主要介绍分类。
本书的前七章主要研究分类算法,第2 章讲述最简单的分类算法:k-近邻算法,它使用距离矩阵进行分类;第3 章引入了决策树,它比较直观,容易理解,但是相对难于实现;第4 章将讨论如何使用概率论建立分类器;第5 章将讨论Logistic 回归,如何使用最优参数正确地分类原始数据,在搜索最优参数的过程中,将使用几个经常用到的优化算法;第6 章介绍了非常流行的支持向量机;第一部分最后的第7 章将介绍元算法— AdaBoost, 它由若干个分类器构成,此外还总结了第一部分探讨的分类算法在实际使用中可能面对的非均衡分类问题,一旦训练样本某个分类的数据多于其他分类的数据,就会产生非均衡分类问题。
第一章:机器学习基础
本章内容
机器学习的简单概述
机器学习的主要任务
学习机器学习的原因
Python语言的优势
机器学习能让我们自数据集中受到启发,换句话说,我们会利用计算机来彰显数据背后的真实含义,这才是机器学习的真实含义。它既不是只会徒然模仿的机器人,也不是具有人类感情的仿生人。
上面提到的所有场景,都有机器学习软件的存在。现在很多公司便用机器学习软件改善商业决策、提高生产率、检测疾病、预测天气,等等
1.1 何谓机器学习
除却一些无关紧要的情况,人们很难直接从原始数据本身获得所需信息。例如,对于垃圾邮件的检测,侦测一个单词是否存在并没有太大的作用,然而当某几个特定单词同时出现时,再辅以考察邮件长度及其他因素,人们就可以更准确地判定该邮件是否为垃圾邮件。简单地说,机器学习就是把无序的数据转换成有用的信息。
机器学习横跨计算机科学、工程技术和统计学等多个学科,需要多学科的专业知识。稍后你就能了解到,它也可以作为实际工具应用于从政治到地质学的多个领域,解决其中的很多问题。甚至可以这么说,机器学习对于任何需要解释并操作数据的领域都有所裨益
最终我们决定使用某个机器学习算法进行分类,首先需要做的是算法训练,即学习如何分类。通常我们为算法输人大量已分类数据作为算法的训练集。训练集是用于训练机器学习算法的数据样本集
表1-1是包含六个训练样本的训练集,每个训练样本有4种特征、一个目标变量,如图1-2所示。目标变量是机器学习算法的预测结果,在分类算法中目标变量的类型通常是标称型的,而在回归算法中通常是连续型的。训练样本集必须确定知道目标变量的值,以便机器学习算法可以发现特征和目标变量之间的关系。
我们通常将分类问题中的目标变量称为类别,并假定分类问题只存在有限个数的类别。
为了测试机器学习算法的效果,通常使用两套独立的样本集:训练数据和测试数据。当机器学习程序开始运行时,使用训练样本集作为算法的输人,训练完成之后输人测试样本。输人测试样本时并不提供测试样本的目标变量,由程序决定样本属于哪个类别。比较测试样本预测的目标变量值与实际样本类别之间的差别,就可以得出算法的实际精确度。本书的后续章节将会引人更好地使用测试样本和训练样本信息的方法,这里就不再详述。
1.3 机器学习的主要任务
上节的例子介绍了机器学习如何解决分类问题,它的主要任务是将实例黎据划分到合适的分类中。机器学习的另一项任务是回归,它主要用于预测数值型数据。大多数人可能都见过回归的例子—数据拟合曲线:通过给定数据点的最优拟合曲线。分类和回归属于监督学习,之所以称之为监督学习,是因为这类算法必须知道预测什么,即目标变量的分类信息。
与监督学习相对应的是无监督学习,此时数据没有类别信息,也不会给定目标值。在无监督学习中,将数据集合分成由类似的对象组成的多个类的过程被称为聚类;将寻找描述数据统计值的过程称之为密度估计。此外,无监督学习还可以减少数据特征的维度,以便我们可以使用二维或三维图形更加直观地展示数据信息。表1-2列出了机器学习的主要任务,以及解决相应问题的算法。
1.4 如何选择合适的算法
从表1-2中所列的算法中选择实际可用的算法,必须考虑下面两个问题:一、使用机器学习算法的目的,想要算法完成何种任务,比如是预测明天下雨的概率还是对投票者按照兴趣分组;首先考虑使用机器学习算法的目的。如果想要预测目标变量的值,则可以选择监督学习算法,否则可以选择无监督学习算法。确定选择监督学习算法之后,需要进一步确定目标变量类型,如果目标变量是离散型,如是/否、1/2/3、ABC或者红/黄/黑等,则可以选择分类器算法;如果目标变量是连续型的数值,如0.0~ 100.00、-999~999或者+00~-00等,则需要选择回归算法。
如果不想预测目标变量的值,则可以选择无监督学习算法。进一步分析是否需要将数据划分为离散的组。如果这是唯一的需求,则使用聚类算法;如果还需要估计数据与每个分组的相似程度,则需要使用密度估计算法。在大多数情况下,上面给出的选择方法都能帮助读者选择恰当的机器学习算法,但这也并非一成不变。第9章我们就会使用分类算法来处理回归问题,显然这将与上面监督学习中处理回归问题的原则不同。
其次需要考虑的是数据问题。我们应该充分了解数据,对实际数据了解得越充分,越容易创建符合实际需求的应用程序。主要应该了解数据的以下特性:特征值是离散型变量还是连续型变量,特征值中是否存在缺失的值,何种原因造成缺失值,数据中是否存在异常值,某个特征发生的频率如何(是否罕见得如同海底捞针),等等。充分了解上面提到的这些数据特性可以缩短选择机器学习算法的时间。
我们只能在一定程度上缩小算法的选择范围,一般并不存在最好的算法或者可以给出最好结果的算法,同时还要尝试不同算法的执行效果。对于所选的每种算法,都可以使用其他的机器学习技术来改进其性能。在处理输入数据之后,两个算法的相对性能也可能会发生变化。后续章节我们将进一步讨论此类问题,一般说来发现最好算法的关键环节是反复试错的迭代过程。机器学习算法虽然各不相同,但是使用算法创建应用程序的步骤却基本类似,下一节将介绍如何使用机器学习算法的通用步骤。
1.5 开发机器学习应用程序的步骤
本书学习和使用机器学习算法开发应用程序,通常遵循以下的步骤。
(1 )收集数据。我们可以使用很多方法收集样本数据,如:制作网络爬虫从网站上抽取数据、从RSS反馈或者API中得到信息、设备发送过来的实测数据(风速、血糖等)。提取数据的方法非常多,为了节省时间与精力,可以使用公开可用的数据源。
(2 )准备输入数据。得到数据之后,还必须确保数据格式符合要求,本书采用的格式是Python语言的list 。使用这种标准数据格式可以融合算法和数据源,方便匹配操作。本书使用Python语言构造算法应用,不熟悉的读者可以学习附录八。
此外还需要为机器学习算法准备特定的数据格式,如某些算法要求特征值使用特定的格式,一些算法要求目标变量和特征值是字符串类型,而另一些算法则可能要求是整数类型。后续章节我们还要讨论这个问题,但是与收集数据的格式相比,处理特殊算法要求的格式相对简单得多。
(3)分析输入数据。此步骤主要是人工分析以前得到的数据。为了确保前两步有效,最简单的方法是用文本编辑器打开数据文件,査看得到的数据是否为空值。此外,还可以进一步浏览数据,分析是否可以识别出模式;数据中是否存在明显的异常值,如某些数据点与数据集中的其他值存在明显的差异。通过一维、二维或三维图形展示数据也是不错的方法,然而大多数时候我们得到数据的特征值都不会低于三个,无法一次图形化展示所有特征。本书的后续章节将会介绍提炼数据的方法,使得多维数据可以压缩到二维或三维,方便我们图形化展示数据。这一步的主要作用是确保数据集中没有垃圾数据。如果是在产品化系统中使用机器学习算法并且算法可以处理系统产生的数据格式,或者我们信任数据来源,可以直接跳过第3步。此步骤需要人工干预,如果在自动化系统中还需要人工干预,显然就降低了系统的价值。
(4)训练算法。机器学习算法从这一步才真正开始学习。根据算法的不同,第4步和第5步是机器学习算法的核心。我们将前两步得到的格式化数据输入到算法,从中抽取知识或信息。这里得到的知识需要存储为计算机可以处理的格式,方便后续步骤使用。如果使用无监督学习算法,由于不存在目标变量值,故而也不需要训练算法,所有与算法相关的内容都集中在第5步。
(5)测试算法。这一步将实际使用第4步机器学习得到的知识信息。为了评估算法,必须测试算法工作的效果。对于监督学习,必须已知用于评估算法的目标变量值;对于无监督学习,也必须用其他的评测手段来检验算法的成功率。无论哪种情形,如果不满意算法的输出结果,则可以回到第4步,改正并加以测试。问题常常会跟数据的收集和准备有关,这时你就必须跳回第1步重新开始。
( 6 )使用算法。将机器学习算法转换为应用程序,执行实际任务,以检验上述步骤是否可在实际环境中正常工作。此时如果碰到新的数据问题,同样需要重复执行上述的步骤。下节我们将讨论实现机器学习算法的编程语言Python,之所以选择Python是因为它具有其他编程语言不具备的优势,如易于理解、丰富的函数库(尤其是矩阵操作)、活跃的开发者社区等
1.6 Python语言的优势
基于以下三个原因,我们选择Python作为实现机器学习算法的编程语言:(1)Python语法清晰;(2 )易于操作纯文本文件;(3)使用广泛,存在大量的开发文档。
1.6.1 可执行伪代码
Python具有清晰的语法结构,大家也把它称作可执行伪代码 。默认安装的Python开发环境已经附带了很多高级数据类型,如列表、元组、字典、集合、队列等,无需进一步编程就可以使用这些数据类型的操作。使用这些数据类型使得实现抽象的数学概念非常简单。此外,读者还可以使用自己熟悉的编程风格,如面向对象编程、面向过程编程、或者函数式编程。不熟悉Python的读者可以参阅附录A,该附录详细介绍了Python语言、Python使用的数据类型以及安装指南。
Python通言处理和操作文本文件非常简单,非常易于处理非数值型数据。Python语言提供了丰富的正则表达式函数以及很多访问他WEB页面的函数库,使得从HTML中提取数据变得非常简单直观。
1.6.2 Python比较流行
Python语言使用广泛,代码范例也很多,便于读者快速学习和掌握。此外,在开发实际应用程序时,也可以利用丰富的模块库缩短开发周期。
在科学和金融领域,Python语言得到了广泛应用。scipy和numpy等许多科学函数库都实现了向量和矩阵操作,这些函数库增加了代码的可读性,学过线性代数的人都可以看懂代码的实际功能。另外,科学函数库scipy和numpy使用底层语言(C 和Fortran ) 编写,提高了相关应用程序的计算性能。本书将大量使用Python的numpy。
Python的科学工具可以与绘图工具Matplotlib协同工作。Matplotlib可以绘制2D、30图形,也可以处理科学研究中经常使用到的图形,所以本书也将大量使用Matplotlib。
Python开发环境还提供了交互式shell环境,允许用户开发程序时查看和检测程序内容。
Python开发环境将来还会集成pylib模块,它将scipy和numpy和Matplotlib化合并为一个开发环境。在本书写作时,Pylab还没有并人Pyth0n环境,但是不远的将来我们肯定可以在Python开发环境找到它。