首发于数据说
带你读机器学习经典(三): Python机器学习(Chapter 1&2)

带你读机器学习经典(三): Python机器学习(Chapter 1&2)

很抱歉又挖了一个大坑,上一本读书笔记(ISL)还没更完。不过有鉴于ISL是用R举例,对于使用Python的朋友来说可能不大方便,所以特此同时介绍一本专注于Python机器学习的书。我会尽量保证能同时更新两本书:)

0. 前言 - 我为什么要写这一系列文章?

自从五月回答了【如何看待「机器学习不需要数学,很多算法封装好了,调个包就行」这种说法?】以后,我收到了很多朋友的评论和私信,希望我能谈谈新手如何快速入门机器学习。

为了给大家一个比较客观公正的建议,我特地去买了几本广受好评的机器学习入门书籍:

  1. An Introduction to Statistical Learning with Applications in R - Gareth J. et al.
  2. Python Machine Learning - Sebastian Raschka <-这次介绍的书
  3. Programming Collective Intelligence (集体编程智慧) - Toby Segaran
  4. 机器学习 - 周志华
  5. 统计学习方法 - 李航

阅读了这些书籍以后,想和大家分享一下我的主观评价。在每本书的总评后,我会对每一本书分章节进行一个梳理,并提供一些自己的感悟,希望能对大家的入门带来一些帮助。

这一系列的文章形式为阅读笔记,需要结合教材一起阅读。我对知识点的顺序进行了一些调整,将相关的内容合并到了一起。有疑问的小伙伴可以评论或者私信我

作为系列文章的第一篇,我会先带着大家梳理Python机器学习的前两章。

1. 综合评价 - Python Machine Learning

严格意义上来说,Python Machine Learning的作者Sebastian Raschka并不是一位科班出身的计算机科学家,或者统计学家。他现在正在读计算生物的博士,但这丝毫不妨碍他在Github成为一个非常出名的极客,也并不影响整本书的实用性。这本书出版于2015年,并多次再版,今年国内也推出了翻译版。在亚马逊中国上我们可以找到影印版和翻译版,大家可以根据自己的英文水平和具体情况来选择。由此不难看出这本书的畅销,以及广受读者好评(我真的没有拿到推广费,塞巴斯蒂安看到文章请向我汇款5毛)。

根据网友@知之为知之 和 @test的提醒,这本书的中文译本错误较多,请谨慎考虑购买。

客观的说,这本书的内容比较浅,偏向于实践,只在第二章的感知机涉及到一些微积分、第三章的逻辑回归中涉及到少量的概率相关推导,以及第五章维度压缩和核函数中涉及到少量的线性代数。如果我们把Elements of Statistical的阅读难度定义为5星,Introduction to Statistical Learning定义为3星,那么本书的难度大概只能算1.5星,和很多人机器智慧启蒙书《集体编程智慧》相仿。如果你阅读《集体编程智慧》没有任何问题,那么阅读这本书应该游刃有余

本书的优点

  1. 去掉了大量的数学推导的部分,仅保留了机器学习的核心应用。阅读本书可以快速对如何使用Python机器学习框架Sklearn有一个基本的了解,可以很快上手开始工作。
  2. 每章都辅以配套的Python实例,而且代码库一直在积极维护当中,读者可以在掌握理论后迅速在配套的数据上进行实践。多说一句,作者本人非常平易近人,非常喜欢和读者交流和解惑。
  3. 本书很强调工程性,里面甚至讲了如何将机器学习模型嵌入到Python Flask的网络程序中(第十一章),这在大量的经典教科书中是从未出现过的。同理,对于如何可视化分析数据也有介绍,这是宝贵的工程经验,理论性教科书一般不会涉及。
  4. 本书涉及的内容很广泛,虽然只有400多页,但内容涉及了数据预处理(Data Preprocessing), 维度压缩和核函数(Dimension Reduction & Kernel),评估方法如交叉验证,集成学习,情感分析,聚类,甚至还包括了神经网络和Theano。
  5. 介绍了一些比较新颖的方法,如流形学习(Manifold Learning), 这估计是因为写作时间较近,所以作者介绍了一些近年来逐渐走红的算法。
  6. 在很多不起眼的地方有神来一笔,分享了很多实际使用中的小技巧,有些技巧甚至都不太得到主流机器学习界的认可,属于作者的个人感悟。
  7. 作者作为一个资深Python用户,用他的代码介绍了很多Python ML的好习惯和传统,值得阅读代码。另一个有这个优点的是吴恩达教授的代码风格,也很简洁清晰。

本书的缺点

  1. 考虑到本书的工程性,章节没有任何配套习题,对于学生读者来说不是非常友好。
  2. 同第一点,本书大量的使用了Sklearn的API,因此可能仅能帮助大家学会很好的使用机器学习包,对于深入理解算法帮助有限。不同的机器学习框架虽有相似性,但可能对使用其他机器学习框架帮助不大。
  3. 书中收录了太多的源代码,我个人觉得用伪代码足够了,源码放在Github上来参考就可以。
  4. 作为优点的“覆盖性广”,同时导致了一个重大缺陷就是深度不够,大部分内容都是点到为止。如果说和同为以广度取胜的周志华教授的《机器学习》相比,这本书的深度也远远不及。
  5. 因为没有涉及数学部分,导致部分重要理论的引出显得非常随意。我理解作者是为了照顾读者的阅读感,但对于数学部分的保留显得该书得到某些结论非常不严谨。个人感觉可以至少加上从何处引入该公式,让有能力的读者可以在课后继续阅读。
  6. 和统计学习先对比,本书更强调一个结果是否有效,统计学习的严谨性可能会使某些统计/数学背景读者觉得这本书的方法有些随意了。不过根本上来说,这本身就是机器学习和统计学习的不同。
  7. 和ESL和ISL不同,本书没有开源因此通过正规渠道获得是收费的,翻译版售价在60人民币,影印版在120人民币左右。另外一点值得吐槽的是,作为一本机器学习参考书,它的印刷竟然是黑白的,这导致了阅读体验不佳。

总结&推荐人群

综合评价下来该书是一本不错的书,但只建议想使用Python的工程师们来阅读对于在读学生朋友来说我还是建议先打好基础,可以阅读ISL。当然,愿意使用Python来练手的话,这本书介绍了很多工程中的小技巧,如如何使用并行计算和Pipeline。全书背景要求比较低,阅读起来速度很快,大部分内容都可以一闪而过。

因为本书不像我介绍的其他书有较多数学部分,因此关于本书的读书笔记以文字为主,数学为辅(没有太多值得额外推导的部分)...

2. 书籍导读 - Chapter 1 - Giving Computers the Ability to Learn from Data

该书的第一章主要是科普和做好准备工作,归纳来说主要做了四件事情:

  1. 介绍基本概念: 什么是 a. 监督学习 b. 无监督学习 c. 强化学习,以及在监督学习中 a. 对于离散值的预测叫做分类(classification) b. 对于连续值的预测叫做回归(regression)。
  2. 介绍该书中使用的符号传统。
  3. 介绍了一般机器学习的三步骤: a. 数据预处理 b. 训练和选择学习模型 c. 评估和预测。
  4. 介绍如何安装必备的机器学习工具包: SciPy, NumPy, Pandas, Sklearn等。我自己推荐直接使用Anaconda来整体安装Python和以上工具包,省去了维护和更新的痛苦。

第一章的确没有太多深入内容,只是给出了一些基本的概念和思路。行百里者半九十,我觉得了解基本概念还是很有帮助的。此处我想推荐大家使用Anaconda进行Python和这些数据包的安装,同时Anaconda里面还包含了两个非常好用的Python IDE: Spyder和Jupyter Notebook(以前叫做IPython Notebook)。Spyder的使用和Matlab非常相似,非常好上手且免费。

2. 书籍导读 - Chapter 2 - Training Machine Learning Algo for Classification

从第二章开始,我们终于开始接触到了一些算法。在本章的开头,作者不可免俗的又将神经元(neuron)和感知机(perceptron)进行了类比。这个是无可厚非的,但请读者注意,神经网络和人的脑神经相似度是非常有限的。现在很多新闻都说深度学习是根据人脑原理开发的,这个有待商榷,甚至可以说只是个噱头。

在第二章的一开始,作者以单层感知机为切入点(神经网络也一度被叫做multi-layer perceptron 多层感知机),逐步介绍了如何对一个单层感知机进行训练,如何用来进行预测。特别值得一提的是,作者在第28页提到了如何将一个感知机从二分类任务(binary classification)扩展用于多分类任务(multi-class classification),他介绍了one-vs-rest这个算法。有兴趣的小伙伴可以稍微多了解一下这个算法,因为在支持向量机(SVM)中我们会再见到这个算法,而单层感知机往往不会用于多分类因为其功能局限性

在介绍了单层感知机的训练后,作者马上介绍了代价函数(cost function)和优化方法即梯度下降法(gradient descent - GD)。因为这些都属于常规的教科书内容,我不在此赘述。而本章最出彩的部分就是介绍为什么要在大规模机器学习(Large Scale Machine Learning)中使用随机梯度下降(Stochastic Gradient Descent - SGD),总结作者的观点并补充一点我的看法:

  1. 梯度下降法有3种:a. Stochastic Gradient Descent b. Mini-batch learning c. Batch Learning(使用普通的gradient descent)。简单来说,从左至右,a每次随机挑选训练数据集中的1个训练数据对参数进行更新,b每次从整个训练数据集中挑选一个固定数量的数据点对参数进行更新, c每次用整个训练集对参数进行优化。因此,a->b->c中每次更新参数时所使用的数据点逐步递增。此处特别想说,在深度学习中,我们一般使用b. Mini-batch learning,一般选择64或者128个数据点作为b的大小。
  2. 不难看出,从a->b->c,因为每次参数更新时使用训练集越来越大,因此损失函数(loss function)的下降逐步越来越平滑。SGD中波动较大,普通GD的下降比较平滑。
  3. 既然普通GD更加平滑,那何必使用SGD呢?作者给出的原因是因为SGD收敛速度快,训练快,同时避免了陷入局部最优(local optima)。对于前两点原因我是赞同的,但第三点其实在深度学习中已经很少出现了,Bengio在《Deep Learning》一书中也指出了深度网络不大容易陷入到局部最优,有兴趣的读者可以思考一下为什么

因此总结来说,在大规模机器学习中,优化算法我们一般不使用最普通的梯度下降(Gradient Descent),也不怎么使用SGD,而是Mini Batch learning,这样可以平衡训练速度和效果。同时工程经验告诉我们,比较建议使用64或者128作为你的batch size,当然如果你的每个训练数据都很大你还需要调整batch size,使得你的GPU可以内存可以容纳当下batch中的数据大小。

这一章的代码还指出了感知机,神经网络,甚至是深度学习中的代码哲学-向量化(Vectorization)。使用向量化可以大幅度的提高我们的运算速度,同时代码也更简洁,具体的实现请参考原书内容:)

3. 后记

写这篇文章的时候,我正处于知乎社区舆论的“风口浪尖”上。我曾有想过很多途径去解释去证明,但我又何苦“自证其罪”。就像很多朋友跟我说的,理解我的人总理解我,误解我的人永远无法原谅我。

好吧,与其和野蛮人互殴,还是让我们把精力放在有意义的事情上吧~Let us get back to work now buddy!


* 封面配图: Python Machine Learning英文版封面,版权归出版商和作者所有,仅为推广展示用途。

编辑于 05-07

文章被以下专栏收录