《Python机器学习》作者Sebastian Raschka的Quora专题

昨日机器之心编译的一篇文章(参见:超越R,Python成为最受欢迎的机器学习语言)显示Python已经逐渐成为最受欢迎的机器学习语言。在今日的 Quora 专题上, 《Python机器学习》一书的作者 Sebastian Raschka 回答了有关 Python、机器学习、计算生物学方面的许多问题。让我们通过这个专题看看这个机器学习界的明星(他被列为Github中最有影响力的数据科学家之一)是如何完成从生物到计算机的传奇跨界经历的。

blob.png

1. 你用过什么让你工作效率提升的工具?

从较高的层面来说,我把「计算编程语言和算法」视为最重要的生产工具,它能处理所有类型的问题。然而,从软件应用层面来说,我喜欢 Atom Editor(我仍在使用 VIM 进行远程工作)。每天我都需要编写很多不同类型的文件:Python 脚本、.cpp 文件、HTML 文件、Markdown、.tex 、纯文本文件、蛋白质结构文件等等。Atom Editor 支持跨平台(macOS 和 Linux)并带有丰富的插件系统。自从有了 VIM 后,我逐渐习惯使用这个小工具了。当然,我的大部分数据分析工作都在 Jupyter Notebook 上做。我不会用 Jupyter 来「开发」代码,但是对我来说,它为我提供一个记录研究轨迹的环境,就像一本「笔记本」,把所有的事情都集中在一处:执行代码,不同的 notation 和 comment,inline plots,以及 LaTeX 等式,不仅节约了时间,在我回顾某个项目写报告赶 deadline 时,它还是我的救命武器,哈哈。

对了,差点忘了「git」(和 GitHub)和一个强大的笔记类应用程序 Quiver(只能在 Mac 上用)。笔记类应用太多了,但我只喜欢 Quiver,它能输出所有格式的数据,有了它你永远不会觉得你会陷入某个特定的程序或格式。

2. 对一个刚入行的、有点手忙脚乱的机器学习/数据科学家,你有什么建议?

我认为手上握有太多的可用资源既有好处又有坏处。好的是我们有很多可选的工具和信息资源,但是为了利用好时间充分使用它们,做好「选择」和保持「关注」才是真正重要的事情。

我不想说很多资源都是「冗余的」,因为「冗余」这个词用在这里有点负面。然而,市面上有很多看似不同的书、工具、教程,内容实际上都差不多,可能在范围和风格上有些差别。

所以,不要想贪多,我们总是被长长的阅读清单拖后腿,更重要的是先想清楚个人的目标(「我需要学习那些技能来解决 X 问题?」「我真的要学这个流行的 X 工具而不是 Y 工具吗?」)。资料和工具太多了,我们需要更加精心地挑选。当然有时候我们会感觉是不是错过了什么,但是我觉得习惯这种感觉会帮你把注意力集中在某一件事情上,取得稳定的进步。

例如,我认为「机器学习简介」的书一本就足够了,没必要每本都读,除非你真的感觉到内容不完整需要补充。就像 Cathy O'Neil 和 Rachel Schutt 解释的那样,没有「完美」的数据科学家,因为没有时间去学每样东西。每个人掌握属于自己的一套技能,擅长某一领域就可以了。

我认为不知道所有的事情不一定是件坏事。因为(如下图所示)我们能通过团队合作来弥补各自的缺陷。

10415_670d3369559cd4f24e79046d6372a0e9.png

3.2016 年机器学习领域发生的哪件事让你最兴奋?

我对如何将解决特定问题的技术比如卷积神经网络和循环神经网络应用到除图像识别和神经语言处理外的其他问题上极度感兴趣。我认为现在这些技术应用上的一个关键挑战是找到合适的「表征」(除了有足够的 数据外)。这里有个例子(比较旧):

Lusci, Alessandro, Gianluca Pollastri, 和 Pierre Baldi。「化学信息学中的深度架构和深度学习:药物类分子的水溶性预测」Journal of chemical information and modeling 53.7(2013):1563-1575.

研究者们用有向非循环图呈现分子(通常来说,结构是无向循环图)作为递归神经网络的输入,来预测这些分子的水溶性。

最近的一个例子是:Gómez-Bombarelli, Rafael 等人「使用数据驱动的连续分子表达进行自动化学设计(Automatic chemical design using a data-driven continuous representation of molecules)」arXiv:https://arxiv.org/abs/1610.02415

简而言之,研究者们训练了一个自动解码器来生成现实的、合成分子。这里,他们的神经网络将 SMILES 串转换成潜在的表达(经过压缩后仅包含统计上的显著信息的向量)并以最小的(或者没有)误差回到 SMILE 串。SMILE 串是一个分子的一维表达;例如,阿司匹林的 SMILES 串是 CC(=O)OC1=CC=CC=C1C(=O)O 对应的是下面的二维结构:

blob.png

阿司匹林(2 -(乙酰氧基)苯甲酸)

最后,这些年出现了很多非常棒的工具,从 scikit-learn 到 Theano、 TensorFlow 和 Keras,使得进入机器学习的门槛降低,这也让我很兴奋。这些工具带来的便利让我们不用太担心技术上的部署问题,还让我们集中关注我们想解决的实际问题。

4. 你是如何在紧张的工作中挤出时间做那些小项目的?

这个问题问的好,说实话,我没有什么秘密可以分享。我觉得这个问题就像是:人们总是说要控制体重,但最终问题还是会归结于每日的热量摄入与消耗。而且,每天只有 24 小时,没人可以延长这个数字。我认为挤出时间的秘诀是你需要对这些小项目感兴趣,这样我就会自然地减少其他业余活动的时间,如看比赛,读小说等等。当然,你的关注点也是很重要的。我觉得对大多数有趣的东西说「不」是其中的关键。我没有说我们必须全天无休止地工作,我想表达的是:如果你有一个绝妙的想法,你通常会挤出时间来实现它。

5. 解决机器学习问题时最适用的数学是什么?

统计、概率论、线性代数 和微积分。

统计和概率论,因为首要任务之一通常是在区别生成模型之间选择一个,来定义性能指标,并评估结果。线性代数是机器学习部署中主要支柱之一,因为它让我们能持续高效地记录和部署。我想说微积分在纯机器学习应用中显得不太重要,但是如果你想理解我们使用或部署的算法,多元微积分和优化理论就显得非常重要,如果你想研究机器学习,那就更不必说了。

6. 我是一位生物物理学专业的学生,对 Python 在自然科学中的应用很感兴趣。对于初学者,你能推荐一本学习 Python 的最好的书吗?

不幸的是,在学习 Python 上,我个人没有什么推荐的书,因为我是通过 Codecademy 以及后面参加的一个大学课程(CS Programming I)学会 Python 的;与此同时,我还大概在 2011 年 12 月份学习了 Udacity 的「计算机科学入门」课程。所以我倒是愿意推荐 Codecadamy 和 Udacity 的计算机科学入门课程,它们都是很好的资源(而且就我所知它们是免费的)。推荐书的话,我觉得最受欢迎的两本书是《Hitchhiker's Guide to Python》和《Learn Python the Hard Way》。但是我个人从来没有读过这两本书,也就不能为它们做担保了——但这不是说它们并不够好 :)

另外,我认为这还要看你在其它编程语言上的经验如何。如果你之前曾经使用过另一种动态语言(例如 Ruby 或甚至 R),那么我觉得你只需要读一下 Python Pocket Guide(甚至只需要网页文档)就可以很快掌握 Python 了。

尽管我相信上面列出的所有资源都对入门很有帮助,但你应该通过应用这门语言来解决你领域内的问题的方式来自动地学习这门语言。或者换句话说,一旦你通过入门的门槛,你就可以快速地在网上找到相关的或更特定的概念实现(比如通过 StackOverflow)。另外,写代码的时候进行合作也是有帮助的,因为你可以通过阅读其他人的代码获得很多有用的想法,而且其他人也能为你的实现提供有用的指点。

参考:

7. 在生物学和机器学习的尖端,最激动人心的问题是什么?

在计算生物学领域(computational biology),我们常常有丰富的无标签的数据(有标签的数据有时候可能会有些棘手,这要看具体的项目)。我认为主要的难题之一实际上是我们应该如何呈现数据以使之能够被机器学习算法处理(即:特征表征(feature representation))。现在我看到了很多有潜力的想法和方法;碰巧的是,我刚刚在上面还回答了这个问题。

8. 我喜欢你的《Python Machine Learning》这本书,你有计划再写一本吗?

我很高兴听到你喜欢我的《Python Machine Learning》。是的,我正计划写另一本书!在 2015 年我上一本书之后,我在学术界度过了非常忙碌的一年,我在教书、写论文、参加会议……上花掉了大量的时间,而且在写作新书之前我还需要休息一下 :)

但长话短说:我正计划写一本关于模型评估(model evaluation)的书。我收到过关于这个主题的很多问题,而且其往往只在介绍性的书里面有一些简短的介绍。因此,我今年开始写作关于「机器学习中模型评估、模型选择和算法选择的博客」,但关于它的更多内容我想在一本书(Model Evaluation and Selection in Machine Learning)中扩展——通过使用 Python/scikit-learn/Tensorflow 的说明性的和实用的代码例子来增强这些概念。(另外,我相当确定未来某天我还会写一本关于深度学习的书。)

9. 我可以如何在 10 天之内学会机器学习?

10 天?嗯,这绝对很有难度 :)。但是,我也认为 10 天是一个你需要用来很好地整体了解机器学习领域的时间框架,也许还能开始将一些技术应用到你的问题上了。

在阅读了机器学习三个不同的子领域(监督学习、无监督学习和强化学习)的介绍之后。我可能会花时间了解一下这些领域内代表性的简单(但有用的)算法(可能要把强化学习放到后面一点)。比如:用于回归分析的简单线性回归和 Ridge 回归、用于分类的 logistic 回归和 k-最近邻、以及用于聚类任务的 k-均值聚类和分层聚类。一旦你了解了每种算法的目标和它们解决特定问题的方式,你就能轻松地为你的知识库增加更多算法和方法。但是除了算法之外,你还要清楚如何准备你的数据(特征选择、变换和压缩)以及如何评估你的模型。也许,作为初学者,你可以查看我们在 SciPy 2016 上的 scikit-learn 机器学习教程。它大概有 6 小时长,并总结了大部分基础,还介绍了 scikit-learn 库,这些库可被用于实现和进一步的学习。

教程地址:

10. 人工智能会颠覆设计行业吗?

当然,我肯定这么想。人工智能或机器学习已经在很多设计相关的领域得到了应用。从提升图像质量到 Stitch Fix 的个人造型(https://www.stitchfix.com/)和自动驾驶汽车。另一个将自动算法整合到设计里面的例子是 NASA 用在太空船上面的「进化天线(evolved antenna)」。

Synced (4).jpg

人工智能和机器学习可能并不会完全取代设计师,但我认为它将成为设计师的工作流程中「机械性的(mechanical)」部分中不可缺少的部分。或者换句话说,我认为这是一种增强而非完全的替代。但我预计「设计(design)」将随时间变得越来越好,因为特定的人工智能驱动的流程将能帮助缺乏人力或资源的公司或行业实现「好」的设计。

11. 你如何鉴定机器学习是否对一个项目有用?

第一步需要考虑这个项目的主要目的以及完成目标的需要那些步骤。一旦我确定了某个问题可以用一个预测模型(一个分类器或回归器)来处理,或一个聚类算法(clustering algorithm),我会问自己这些数据是否适用于这个任务。

如果这是一个监督学习任务,我能访问这些标签/目标变量吗?如果不能,我能不能从别的地方获取?是否有足够的可用样本?在一个机器学习算法中,我能不能以某种适当的格式(也许是表格)表达这些输入数据?

还有,如果我有一个可以轻易可视化或手绘的简单的一维或二维数据,用机器学习处理可能会有点过。

例如,我或许不会为预测分子重量拟合一个回归模型,因为它是输入的结构。举个例子,给定一个乙酰水杨酸分子,它的分子结构是:

blob.png

我们得到了包含 9 个碳原子、8 个氢原子和 4 个氧原子的化合物;

  • C ~ 12 g/mol

  • H ~ 1 g/mol

  • O ~ 16 g/mol

所以我们可以轻松计算出它的重量。

思考一些我们想要解决的问题十分重要,无论我们是否能轻松手动推倒出规则或者,无是够需要机器学习。大体上说,机器学习就是把手动推倒规则和假设或逼近函数的工程自动化。另一个例子是 Joel Grus 写的: Fizz Buzz in Tensorflow

12. 从分子生物学学士到 Python 机器学习,你转行进入数据科学领域的想法是因何而起?

我得承认,在本科学分子生物的时候,我确实对其中的统计和数据分析最感兴趣,而不是那些「实际」的实验室工作,仅仅为了一篇老式的,无名的论文就花了我本科学习的大部分时间。顺便说一句,我在这篇论文中,用实验数据画结论中的图表用了一两天时间,做实验却用了一个多月。所以我不是那么地不喜欢分子生物学,但我很快发现潮湿的实验室不是我的归宿:我视它为:「必要的邪恶」——项目中繁琐的数据收集部分。希望我说完以后,实验室的同僚们不要对我发火,我很感谢他们的辛勤工作(笑)。

虽然我的博士学位是纯计算机领域的,我觉得我对数据科学和机器学习的热情来源于我在研究生学习期间的统计识别课程。学习这些技术非常有意思,而且效果立竿见影,我很快就能在生物学问题上用到它们。那段时间,我得说我对于算法和技术有点过于感兴趣了,而生物学被放在了第二位。今天,我对通用领域解决问题的过程最感兴趣,而生物学恰好是一个有很多数据的学科,恰好有很多问题需要解决。

13. 你认为机器学习和数据科学会对医疗领域产生什么样的影响?

我的工作并不涉及医疗领域,但是我遇到了几个在机器学习和医疗交叉领域工作的人。例如在我们学院的 Mias 实验室(G.Mias Lab)就专注于收集来自于各种在线数据库和数据源的基本数据,用以预测患上特定疾病的风险。《Why》的作者 Samantha Kleinberg 正在做着非凡的研究,她应用和开发了各种用于医疗行业的统计学建模技术。

看看那些生物医学的文献,我觉得描述特定蛋白质或基因的功能的经典方法是孤立地看待它们,然后分类至特定的表型。

这种自下而上的方法当然也是医疗领域中的关键。然而,基因或蛋白质其实只是更大,更复杂系统中的一小部分。我相信汇集实验和设备的信息能对我们理解这个复杂系统提供有用的信息,并且能使医疗进步。特别是,我希望监测随着时间推移不同风险因素的变化。如果这能够被高效地完成,那么我相信医疗界将会因此受益。我想说的是我们的目标是尽早获知健康隐患,最好是在这些隐患成为真正的问题之前。比如在一个人真正地患了糖尿病之前跟踪那些有患糖尿病风险的因素。

发展更好的糖尿病治疗方法是很重要的,但是如果我们更好地理解哪种外界环境的组合会提高患糖尿病的风险,我们就能帮助许多人避免患上这种疾病。我认为不需要在这方面做任何研究,只需要整合如家庭历史、基因表达水平、年龄、购物行为、锻炼等信息就能帮助我们尽早发现患病的风险。我们收集越来越多的数据在一定程度上可以是以匿名形式研究的,因为这样才可以更容易地把它加入到机器学习算法中来建立一个预测模型。

然而,主要的挑战就是这些数据是高度异质,原始的,并且结合不同的数据库也是也是一个瓶颈,当然,出于隐私方面的担忧——数据是匿名的,这种方式很难链接不同的数据集。然而,苹果等公司正在研究如智能手机这类电子设备上的匿名追踪数据的解决方案。现如今,我认为找到一个将个人资料通过匿名方式提供给研究者的可行方法是建立一个更好的健康问题检测系统的第一步。我相信一旦解决这个问题,我们就为个人预警系统铺平了道路,这个系统是结合数据, 如购物行为, 日常锻炼和饮食信息, 也许个人基因组和偶尔的血液测试。   

14. 你在计算生物学中参与过哪些有趣的项目?

我的大多数其他项目都专注于虚拟筛选的应用:我们一直与实验生物学的实验室合作,开发和使用各种方式,在不存在或存在蛋白质晶体结构的情况下预测单独抑制的(或活性的,取决于哪个项目)候选分子。最有趣的地方是预测与反馈之间的关系:我需要预测(在某些时候),得到实验结果,然后再看看我的尝试对不对,分析我的方式为什么比其他方式更好。这些项目的另外一个挑战在于研究者需要让所有算法在计算上可行——如果你有 1500 万个分子,想在其中选取 100 个候选分子有点像在大海捞针。通常在这种情况下我们会预先进行「过滤」步骤让计算变得简单一些,因为研究总是有时间限制的。我的项目需要所有人充分发挥自己的创造力和技术,但最终,我们的研究成果也需要对合作方产生价值。

除了虚拟筛选的应用(其中的一些已经完成了,我现在正在撰写论文,同时准备发布工具包),我同时正在参与蛋白质——配体相互作用等一般概念的研究,我们最近发现了一个蛋白质——配体相互作用的有趣现象,我们正在寻找数据点以确认它不是一个特例。今年夏天刚刚结束的一个项目则有关计算蛋白质——配体结合袋的局部刚性,用以预测近天然蛋白质——配体的结合模式。

我觉得这是一个有趣的想法,因为近天然捆绑模式通常需要通过不同的能量项求和来进行预测。使用刚性理论,计算结构中的自由度更多是关于相互作用的协同性,而不是它们的相加和。换句话说,如果特定的非共价相互作用不从复合体中去除额外的自由度(如果复合体已经是刚性的),则其不被「计数」到相互作用分数。在实践中,使用局部刚性蛋白质——配体符合体似乎比其他方式或基于知识的评分方式一样好。而且,除了除了作为「独立」评分函数之外,我认为它是一个有趣的新的「信号」或「特征」,可以用于整体评分。

15. 使用 Octave 作为机器学习语言到底有多高效?

我认为 Octave 是一种原型设计的高效环境,同时它也是(和 MATLAB 一起)计算机科学(学术领域)中的流行语言。我在很多地方必须使用它,而且我得说它确实是在机器学习上的好选择。但是,看起来现实世界中不趋向于使用 Octave/MATLAB,我得说像 Python 这样的语言也很容易学习——而且功能更多一点(但请注意这是我的个人喜好)。简而言之:如果你的研究需要大量使用,或者你的实验室/团队已经再用了,Octave 是一个不错的选择,否则我会考虑 Python 和 R 语言。

如果你有兴趣,可以看我去年写的一篇关于「语言战争」的文章:http://sebastianraschka.com/blog/2015/why-python.html

16. 对于有一些机器学习知识的程序员来说,学习计算生物学有什么好的方法?

这是一个好问题!计算生物学是一个广阔的领域,有很多不同的子领域和方向可以研究:蛋白质折叠,同源性蛋白质建模,蛋白质配体对接和评分、分子动力学模拟、序列比对、基因组装配、微生物组研究、进化生物学和系统发育等等。

生物学的入门可以从分子生物学和基因开始,首先了解「大局」,然后再开始进入你所感兴趣的分区。关于生物计算方面的学习,我主要通过阅读论文——这一领域的变化很快,一本十年前的教科书可能已经过时了。我听说 Edx 和 Coursera 这样的网站已经在提供计算生物学和生物信息学的专门课程了,我没有接触过这些课程,但我觉得这也是不错的入门方式。有一个内容我想要特别分享一下,Greg Caporaso 的「应用生物信息学概论(Introduction to Applied Bioinformatics)」,一本免费的在线图书。

17. 你对数据科学的初学者有什么好建议?

我的建议是选择你个人感兴趣的问题或项目,而不是从复制一个问题的解决方案入手。如果你对一个问题感兴趣,自然会急于去解决它,并在此过程中开发新的工具和技术。首先,你需要以你能够熟练使用的技术和工具入手,看看能做到什么程度。如果使用现有的工具包不能够解决问题,我会尝试在线搜索类似问题的解决方案,或者问问别人。举个例子,如果你对某种预测感兴趣,在一开始你会将键值对储存在 Python 字典中。随着你的数据集不断增长,你可能会开始需要其他的存储方式,如 SQLite,然后你会开始学习 SQLite。同样的,假如你会使用 NumPy 数组处理很多问题,在收集异构数据时,你可能会转而寻求 Pandas 来处理;如果你的系统内存有限,你会尝试使用其他工具,例如 Blaze。

我建议的方法是你需要学习使用你认为可以解决问题的工具,假如合适就使用它们。第二步是看看你目前工具的潜在替代者,看看它们有什么额外的功能。

我发现为了学习工具而学习工具很快就会变得无聊,所以我的方式是在实践中学习工具。如果方向正确,你自然会花时间来学习新的工具。

18. 您怎么找到时间来掌握机器学习,获得另一个博士学位,并且还对这个学科出了本书的?

我认为计算生物学和机器学习在解决问题的时候是有很大的相似之处的。在计算生物学中,我们通常通过各种数据挖掘来解决计算问题,机器学习中,数据挖掘也占大头。我一直很喜欢统计学,在研究生的阶段我就上过一门「类统计模式识别」,我真的认为这门课点燃了我对预测建模还有机器学习的热情。最开始的时候,我感到「哇,这真是太不可思议了,它帮我解决了计算生物学各种各样的问题」,后来,我真是感觉到「哇,机器学习是那么重要,他几乎能帮我解决所有问题,我要学到更多。」

在课程中,我发展出了对机器学习真正的热情,这使我有动力在晚上花一些额外的时间去努力钻研。说实话,有很多机器学习的方面我都没有深入研究,还有很多文件资料我都没有来得及读。然而当我被要求写本书的时候,我发现先前的研究正好与此有关。虽然我在每个周末晚上花上几个小时来写书,我的社交生活在这几个月里也遭受些磨难,但是这也是我激情的来源:我十分高兴能够分享那些使我兴奋的的知识,这也使整个写书的过程变得充满了乐趣。所以,我认为抓紧所有时间在已经足够疯狂的博士期间写一本书是一个很棒的体验(因为他直接有助于解决计算生物学的问题),所以我也愿意花费一些我的「空闲」时间。

19. 我能在哪找到可以用来学习的 Python 机器学习项目?

我的建议是关注一些数据科学的博客,因为有很多人的博客都在分享他们所爱好的 Python 机器学习方面的东西。现在这边有一个较为全面的数据科学家博客列表,不过这并不是全都关于机器学习的,所以你得做一些手动搜索:rushter/data-science-blogs 你也可以看看 Kaggle(https://www.kaggle.com/)。

例如:

不幸的是,他的博客似乎不常更新了(或者有了个新的站点),但还是可以看看通过了 Kaggle 比赛的解决方案。同样的,我也认为 Kaggle 比赛和论坛是学习的良好平台。

理论机器学习人工智能Python入门数据科学
机器之心
机器之心

机器之心编辑

返回顶部