编者按:本书节选自图书《Python与机器学习实战》,Python本身带有许多机器学习的第三方库,但本书在绝大多数情况下只会用到Numpy这个基础的科学计算库来进行算法代码的实现。这样做的目的是希望读者能够从实现的过程中更好地理解机器学习算法的细节,以及了解Numpy的各种应用。不过作为补充,本书会在适当的时候应用scikit-learn这个成熟的第三方库中的模型。
“机器学习”在最近虽可能不至于到人尽皆知的程度,却也是非常火热的词汇。机器学习是英文单词“Machine Learning”(简称ML)的直译,从字面上便说明了这门技术是让机器进行“学习”的技术。然而我们知道机器终究是死的,所谓的“学习”归根结底亦只是人类“赋予”机器的一系列运算。这个“赋予”的过程可以有很多种实现,而Python正是其中相对容易上手、同时性能又相当不错的一门语言。本文打算先谈谈机器学习相关的一些比较宽泛的知识,再介绍并说明为何要使用Python来作为机器学习的工具。最后,我们会提供一个简短易懂的、具有实际意义的例子来给大家提供一个直观的感受。
具体而言,本章主要涉及的知识点有:
- 机器学习的定义及重要性;
- Python在机器学习领域的优异性;
- 如何在电脑上配置Python机器学习的环境;
- 机器学习一般性的步骤。
机器学习绪论
正如前言所说,由于近期的各种最新成果,使得“机器学习”成为了非常热门的词汇。机器学习在各种领域的优异表现(围棋界的Master是其中最具代表性的存在),使得各行各业的人们都或多或少地对机器学习产生了兴趣与敬畏。然而与此同时,对机器学习有所误解的群体也日益壮大;他们或将机器学习想得过于神秘,或将它想得过于万能。本节拟对机器学习进行一般性的介绍,同时会说明机器学习中一些常见的术语以方便之后章节的叙述。
什么是机器学习
清晨的一句“今天天气真好”、朋友之间的寒暄“你刚刚是去吃饭了吧”、考试过后的感叹“复习了那么久终有收获”……这些日常生活中随处可见的话语,其背后却已蕴含了“学习”的思想—它们都是利用以往的经验、对未知的新情况作出的有效的决策。而把这个决策的过程交给计算机来做,可以说就是“机器学习”的一个最浅白的定义。
我们或许可以先说说机器学习与以往的计算机工作样式有什么不同。传统的计算机如果想要得到某个结果,需要人类赋予它一串实打实的指令,然后计算机就根据这串指令一步步地执行下去。这个过程中的因果关系非常明确,只要人类的理解不出偏差,运行结果是可以准确预测的。但是在机器学习中,这一传统样式被打破了:计算机确实仍然需要人类赋予它一串指令,但这串指令往往不能直接得到结果;相反,它是一串赋予了机器“学习能力”的指令。在此基础上,计算机需要进一步地接受“数据”,并根据之前人类赋予它的“学习能力”,从中“学习”出最终的结果。这个结果往往是无法仅仅通过直接编程得出的。因此这里就导出了稍微深一点的机器学习的定义:它是一种让计算机利用数据而非指令来进行各种工作的方法。在这背后,最关键的就是“统计”的思想,它所推崇的“相关而非因果”的概念是机器学习的理论根基。在此基础上,机器学习可以说是计算机使用输入给它的数据,利用人类赋予它的算法得到某种模型的过程,其最终的目的则是使用该模型,预测未来未知数据的信息。
既然提到了统计,那么一定的数学理论就不可或缺。相关的、比较简短的定义会在第4章给出(PAC框架),这里我们就先只叙述机器学习在统计理论下的、比较深刻的本质:它追求的是合理的假设空间(Hypothesis Space)的选取和模型的泛化(Generalization)能力。该句中出现了一些专用术语,详细的定义会在介绍术语时提及,这里我们提供一个直观的理解:
- 所谓的假设空间,就是我们的模型在数学上的“适用场合”。
- 所谓的泛化能力,就是我们的模型在未知数据上的表现。
注意:上述本质上严格来说,应该是PAC Learning的本质;在其余的理论框架下,机器学习是可以具有不同的内核的。
从上面的讨论可以看出,机器学习和人类思考的过程有或多或少的类似。事实上,我们在第6、第7章讲的神经网络(Neural Network,NN)和卷积神经网络(Convolutional Neural Network,CNN)背后确实有着相应的神经科学的理论背景。然而与此同时需要知道的是,机器学习并非是一个“会学习的机器人”和“具有学习能力的人造人”之类的,这一点从上面诸多讨论也可以明晰(惭愧的是,笔者在第一次听到“机器学习”四个字时,脑海中浮现的正是一个“聪明的机器人”的图像,甚至还幻想过它和人类一起生活的场景)。相反的,它是被人类利用的、用于发掘数据背后信息的工具。
当然,现在也不乏“危险的人工智能”的说法,霍金大概是其中的“标杆”,这位伟大的英国理论物理学家甚至警告说“人工智能的发展可能意味着人类的灭亡”。孰好孰坏果然还是见仁见智,但可以肯定的是:本书所介绍的内容绝不至于导致世界的毁灭,大家大可轻松愉快地进行接下来的阅读!
机器学习常用术语
机器学习领域有着许多非常基本的术语,这些术语在外人听来可能相当高深莫测。它们事实上也可能拥有非常复杂的数学背景,但需要知道:它们往往也拥有着相对浅显平凡的直观理解(上一小节的假设空间和泛化能力就是两个例子)。本小节会对这些常用的基本术语进行说明与解释,它们背后的数学理论会有所阐述,但不会涉及过于本质的东西。
正如前文反复强调的,数据在机器学习中发挥着不可或缺的作用;而用于描述数据的术语有好几个,需要被牢牢记住的如下。
- “数据集”(Data Set),就是数据的集合的意思。其中,每一条单独的数据被称为“样本”(Sample)。若没有进行特殊说明,本书都会假设数据集中样本之间在各种意义下相互独立。事实上,除了某些特殊的模型(如隐马尔可夫模型和条件随机场),该假设在大多数场景下都是相当合理的。
- 对于每个样本,它通常具有一些“属性”(Attribute)或者说“特征”(Feature),特征所具体取的值就被称为“特征值”(Feature Value)。
- 特征和样本所张成的空间被称为“特征空间”(Feature Space)和“样本空间”(Sample Space),可以把它们简单地理解为特征和样本“可能存在的空间”。
- 相对应的,我们有“标签空间”(Label Space),它描述了模型的输出“可能存在的空间”;当模型是分类器时,我们通常会称之为“类别空间”。
其中、数据集又可以分为以下三类:
- 训练集(Training Set);顾名思义,它是总的数据集中用来训练我们模型的部分。虽说将所有数据集都拿来当作训练集也无不可,不过为了提高及合理评估模型的泛化能力,我们通常只会取数据集中的一部分来当训练集。
- 测试集(Test Set);顾名思义,它是用来测试、评估模型泛化能力的部分。测试集不会用在模型的训练部分,换句话说,测试集相对于模型而言是“未知”的,所以拿它来评估模型的泛化能力是相当合理的。
- 交叉验证集(Cross-Vali