查看原文
其他

3分钟了解入门「机器学习」该学习什么?(下)

2017-11-14 刘明 GitChat技术杂谈


本文来自作者 刘明 在 GitChat 上分享「机器学习/深度学习书单推荐及学习方法」,「阅读原文」查看交流实录

「文末高能」

编辑 | 坂本

写在前面

本人是个对数学和人工智能极其感兴趣的人。平时,我也在线上线下经常与国内外的朋友讨论人工智能的各种方面,无论是技术方面还是哲学方面。

我帮助过很多实习生和网上的学生,带领他们从入门一步步过渡到足够从事数据挖掘工作。

在此期间,我发现了一件很有趣的事情,所有技术好的数据分析/挖掘工作者,都是喜欢”主动学习”的人。

这次在 GitChat 上发起 Chat,就是想帮助更多喜欢数据科学、喜欢主动学习的人能够少走弯路。

这个 Chat 中主要讨论的是如何入门学习机器学习/深度学习的理论知识、如何着手数据挖掘项目以及从事数据挖掘相关岗位所需要的能力。

正文

不论你是学生、想转行数据岗位的在职程序员,都需要自学达成目标,我本身就是一个苦逼自学者例子。

我的本硕都是计算机专业,由于本科搞的是算法编程,硕士开始搞机器学习方向本来也比较适合,但机器学习算法真的让我头疼了很久。

在慢慢攻克了机器学习算法,并学到一定程度后,我发现真正的数据挖掘绝不仅仅是会机器学习算法就够了,还要学习很多东西,比如数据清洗等等技巧。

作为一个”过来人”,我明白大家在学习中会遇到的困惑。我此次,就是来帮助大家解除困惑。

关于机器学习,非数学/统计专业的人都会有这些疑问:

  1. 到底要把数学学到什么程度才能够无障碍地推导机器学习算法?实变、复变、泛函、矩阵论到底要不要全都学会?

  2. 入门机器学习到底要看什么书?

  3. 除了机器学习,真正的工作中还哪些必要技巧?

  4. 如何入门深度学习?

  5. 如何着手开始进行数据挖掘项目?

下面,我会对以上问题逐个进行细致分解,结合自己的学习及工作经历为你一一解答,并给你提出适合建议。

数学要到什么程度?

从最基础的来说,微积分、线性代数与概率论是学习机器学习的必会内容。

相信大家看到这个答案会很失望,但是放心,这绝对不像你想象的那么难。

在本科期间,我们学习数学的目的其实是为了期末考试,需要做很多习题。

而在机器学习中,使用到的仅仅是这些他们的特性,而不需要用他们来解题,所以只要知道他们的定义就可以。

比如线性代数,我们仅仅需要了解向量、矩阵和逆矩阵等等的定义,而不需要去真正的计算逆矩阵。

这说明,我们不需要花费大量时间去学习数学,而只需要了解并记住他们的定义。

那么,看什么书好呢?我个人给大家推荐的是《金榜图书》的考研数学讲义系列的《高等数学辅导讲义》、《线性代数辅导讲义》和《概率论与数理统计辅导讲义》。

这三本书算是考研数学入门级,他们的优点是简洁、全面,把教科书中几百页的内容压缩到几十页,如果不看其中的例题,几天就能看完。

这三本书外,还有很多数学内容需要学习,比如 Jacobian 矩阵、张量、特征分解、奇异值分解(SVD)和 Moore-Penrose 伪逆等等……这些是实分析、复分析、矩阵论等书中的内容,也是机器学习的必会内容。

看到这里你可能会开骂了,我要是会这些,干嘛还看你写的东西!

放心,我就是来给你解决这些问题的。之前我说过,推导机器学习算法的过程中,需要的是了解数学定义,而非系统地学习每门课。

然而想要通过看书学习某一个知识点是很难的,因为需要很多先修知识,否则根本看不懂。

这里,给大家推荐一个非常良心的免费在线课程可汗学院(www.khanacademy.org,需要科学上网),这个网站中包含很多学科,其中的数学部分几乎把所有机器学习中所需要的数学知识都涵盖到了,而且每个知识点的讲解都是独立的视频,每段视频大约只有几分钟,还有配套的在真实应用中的例子。

比如向量微积分中的 Jacobian 矩阵这个知识点,可汗学院将其分为5个短视频来讲解:

1. Jacobian 矩阵的先修知识;

2. 多变量函数的局部线性法;

3. Jacobian 矩阵;

4. Jacobian 矩阵的计算;

5. Jacobian矩阵的决定子应用

这5个短视频从最基础的先修知识慢慢过渡到最难的部分,每个短视频只有3-8分钟,已经足够让我们理解 Jacobian 矩阵了。

入门机器学习到底要看什么书?

关于入门机器学习要看什么书,网上已经有很多人提出过建议。 而我的建议是:不看书。是的,不看书。

所有的书都假设你的数学基础已经非常好,很多数学推导并没有告诉你其中的根源,使你无法看下去。

只有一个人,他假设你只懂最基础的微积分和线性代数——林轩田。他在台大开设的两门公开课”机器学习基石”与”机器学习技法”(网上很容易找到),基石是机器学习基础、技法是机器学习算法推导。

不过,这两部视频似乎在各种方面都不如 Andrew Ng 的机器学习课程。而且几乎每一个看过他的 “机器学习基石” 课程的人都表示非常不喜欢,看不下去,原因有三:无聊、推导公式的过程太细,不知道学过之后的用处。

讲到这里,大家可能会想到,当年学习高等数学的时候,好像也是这种感觉?

对的,他的课程非常”无聊”但确实很重要,而且他讲的每一节课只要认真思考就一定能够听懂。

他讲的是机器学习中最重要的基础,当你真的懂一点机器学习的时候,反过来看基石中讲的内容,比如 Break Point、VC维、误差衡量、线性回归、非线性转换和梯度下降,哪一个是不重要的?

当你看完”机器学习基石”,我建议你继续学习他的”机器学习技法”。

我相信你刚开始学习”技法”的时候,会发现他比上部更加无聊,于是忍不住去看对应的书籍,想要避免看这种无聊的视频。

然而,你最后一定还会回来继续看他的视频,因为你会发现他的视频虽然巨无聊,但讲的真的很细致,每一步推导都讲的很明白!

在学习”技法”课程的时候,你可以同步的看书了,因为光看视频,很多东西会忘记,要不断的看书复习。

这里,我推荐给你三本书:《统计学习方法》by李航、《机器学习》by周志华、《机器学习》by Mitchell。

这三本书都是机器学习界入门的经典书籍,我之所以同时推荐三本,不是让你做三选一的选择题,而是把这三本对照着看:

  • 《统计学习方法》对公式的推理深入;

  • Mitchell 的书重在算法思路的讲解,对公式的推理很浅显,但易懂;

  • 周志华的书内容更加广泛且包含很多两本书中没有的内容。

建议学习的时候以李航的书为基础,与视频对照着看;使用周志华的书进行补充;当无法理解某处的时候看 Mitchell 的书。

除了机器学习,真正的工作中还哪些必要技巧?

真正的工作和项目中,只会机器学习是不够的。最早的就是对数据进行清洗,数据清洗工作和机器学习算法的选择同样重要。

数据清洗注意需要掌握两点:数据处理与正则表达式。

这里推荐三本书:《Python数据处理》、《数据科学实战手册(R+Python)》与《正则表达式经典实例》,前两本讲的是数据清洗处理,最后一本讲的是正则表达式的语法。

这三本书讲的是通用技巧,在具体工作中所需要的方法是不同的,不要把自己禁锢与书本中,要在具体的工作中自己思考。

如何入门深度学习?

目前,深度学习并非工作的必备技能,仅仅是加分项。所以我建议大家在掌握了一定的机器学习知识后,再开始学习深度学习的内容。

深度学习最好的入门书籍,莫过于《神经网络与深度学习》by Michael Nielsen,该书有中文版。这本书通俗易懂,用最简单的语言和例子阐述了概念和原理。

但这本书虽然通俗,却非常细致的把深度学习最基础的核心算法——BP网络的数学公式仔细地推导了一遍,乍一看很容易,但如果多读几遍,相信大家每一遍都会有不同的收获。

在读了《神经网络与深度学习》后,需要开始学习 CNN、RNN 等主流的深度学习网络了,学习这些网络的时候,也需要把他们的 BP 算法推导清楚。

目前我见过的讲解最好的不是书籍,而是一位网名为 hanbingtao 的作者在网上写的Blog,该Blog把深度学习从最基础的感知机基础到 CNN、RNN、LSTM 的数学公式都推导了一遍,而且很浅显易懂,强烈建议大家阅读。

如何着手开始进行数据挖掘项目?

着手数据挖掘项目,首先要选择一门合适的语言。数据挖掘可以用很多语言完成,R、Python、Java 等等都可以。

但我个人建议大家使用 Python,因为使用 Python 相对简单且大多数公司都要求使用 Python 进行工作。 

刚开始进行数据挖掘项目的时候,很多程序员出身的人会陷入一个误区,认为既然是做项目就要把算法的每一个细节都自己实现,而是不使用现成的工具包,担心自己会变成调包侠。

其实,每个高手都是从调包侠开始的,而且自己写的代码都是使用 Python 完成的,效率与工具包中直接调用C语言的代码相比要差很多。

而且,在入门阶段,不应该花费极多的时间只为了对算法造轮子。

在后期,当你的能力足够而进行一些非常复杂的项目的时候,才会觉得工具包满足不了你,那时候再顺其自然的造轮子岂不甚好。

说到 Python 的机器学习工具包,不能不提到 scikit-learn。scikit-learn的算法非常齐全(几乎把所有你能想到的机器学习算法都包括在内,甚至数据预处理、特征提取等等都有现成的工具),调用简单(两条语句就能训练出一个模型),API非常友善(可以到官网)。

学习 scikit-learn 最好的一本书是《机器学习系统设计》by里彻特。这本书共12章,除去最后一章外,每章都带着我们从最基础一步步地做出一个数据挖掘项目,其实把这本书看完,其实已经有最基础的数据挖掘项目能力了。

除了 scikit-learn 外,还有一个深度学习框架也非常好,叫做 Keras。

Keras 的底层可以用 TensorFlow 或者 Theano,在理解神经网络的情况下,学习 Keras 只需要花费极短的时间就可以上手。

这里建议大家学习一个免费视频课程:莫烦 Python( https://morvanzhou.github.io/tutorials/machine-learning/keras/ )。

这个网站是一个免费的机器学习视频课程网站,站主莫烦大神用最简洁的方式会使你在不到一个小时的时间内就掌握 Keras 的语法。

以上是所用到的工具,学完《机器学习系统设计》已经有基础的实战能力,但其中的一些流程该书并没有系统地介绍。

如果想要更加系统的学习,推荐大家阅读《数据挖掘导论》,这本书包括分类、关联分析、聚类和异常检测的项目流程实例,还提供数据集和幻灯片,非常适合系统的学习。

在以上的事情都做完后,大家可以上 Kaggle 进行小的比赛,只要足够努力,拿到一些小比赛的 Top5% 还是有机会的。

写在最后

当你一步步的按照我给你的建议进行学习之后,会发现其实这些理论其实很简单,但实际应用起来绝非易事,这也构成了大多数搞数据挖掘的人能力平庸无奇的事实。这里,我对大家有几条私人的建议:

  1. 机器学习的理论基础一定掌握好,这是未来长远工作的筹码。

  2. 在学习算法的过程中,永远是对算法的效率进行分析揣摩在第一位,具体的代码实现在第二位,不要本末倒置。

  3. 对算法的学习要掌握所谓的”分寸”,相对重要的部分多学,不太主流的部分稍稍了解即可。

  4. 英语很重要,你会越来越发觉英语的重要性,请坚持每天学习一点英语。

  5. 学习机器学习算法要真正学懂,某些小的地方学不懂便跳过,最终会造成很多漏洞,而这漏洞,填补起来要花费很大的精力。

祝您学习的过程是愉快的,前路虽艰,行则心安。

近期热文

小白入坑 Web 渗透测试必备指南

前端攻城狮该了解的 Vue.2x 响应式原理

前端工程师“应试”指南

如何用 Node.js 爬虫?

两款敏捷工具,治好你碎片化交付硬伤

福利

「阅读原文」看交流实录,你想知道的都在这里

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存