Python,机器学习以及语言之间的战争(1)

2015824

作者:Sebastian Raschka


  哦,上帝,又一个主观的、明显地自以为是的标题党?是的,为什么我要写这个呢?嗯,下面这句话是我的前任教授的一个最平凡的但却改变了生活的见解和世俗智慧的名言,也成了我的口头禅,“如果你要做这个任务超过3次,那么就写一个脚本使它自动化。”

到现在为止,你可能已经开始对这个博客的猜测了。我已经半年没写过东西了!好吧,我在社交网络平台那边沉思,那不是真的:我写了一些东西–精确来说有400页左右的。这对我来说真的是一段很长的旅程。对于经常被问到的问题“你为什么选择Python机器学习?“我想是时候写我的脚本了。


  在下面的文章中,我真的不是想告诉你为什么你或任何其他人应该使用Python。说实话,我真的很讨厌这样的问题。


目录:

  • 一个复杂问题的简短回答  

  • 我最喜欢的Python工具是什么?

  • 我觉得MATLAB怎么样? 

  • Julia很棒。。。在纸上!

  • R真的没有什么错

  • 那Perl怎么样呢

  • 其他的选择

  • Python语言是一个正在衰落的语言吗?

  • 结论

  • 反馈和意见


一个复杂问题的简短回答



  也许我应该从简短的回答开始。欢迎你停止阅读这篇文章本段以后的内容,因为它真的不属实。我是一个科学工作者,我喜欢把我的东西做完。我想有一个环境,我可以快速拥有原型并记下我的模型和思路。我需要解决非常特殊的问题。我分析给定的数据集并得出我的结论。这对我来说是最重要的:我怎么能最有效得完成工作?什么是“有效的”?嗯,我通常只运行一个分析一次(测试不同的想法和调试);我不需要一天二十四小时重复运行一段特定的代码,我并不是在为终端用户开发软件应用程序或Web应用程序。当我量化“效率”时,我估计下面几件事的时间总和,(1)它指的是将想法写成代码所需的时间,(2)调试它,(3)执行它。对我来说,“最有效”的意思是“需要多长时间才能得到结果?“现在,在过去的几年里,我认为Python很适合我。并不总是,但往往是。就像生活中所有事一样,Python不是“杀手锏”,“它不是每一个问题的“最佳”解决方案。然而,它已经非常接近最佳方案了,如果你比较编程语言在常见的和不常见的问题中的表现;Python是最通用的和最有能力的多面手。

  (Source: https://xkcd.com/974/)

  记住:“过早优化是万恶的根源”(唐纳德)。如果你是软件工程团队中的一员,想让你的机器学习和数据科学部门优化下一个高频交易模型的交易规则部分,Python可能不适合你(但也许它是由数据科学团队的选择的语言,所以学习如何阅读它可能仍然是有用的,)。所以,我的一点建议是,当你选择一种语言时,先评估你的日常问题的任务和需要。“如果你拥有的是一把锤子,一切都开始看起来像一个钉子”,你太聪明了,没有掉进这个陷阱!但是,在头脑中保持一个平衡。有些场合,锤子可能是最好的选择,即使一个螺丝刀可能是“更好”的解决方案。再次,它归结为生产率。

  让我给你一个我个人经验的例子。我需要开发一堆新的算法来“筛选”1500万个小的,化学化合物,关于一个非常问题的具体假设。我是一个完全计算的人,但我与生物学家合作,它们做非计算实验(我们称之为“wet lab”实验)。目标是缩小到在实验室中可以测试100个潜在的化合物。需要说明的是,他们需要快速的结果,因为他们只有有限的时间来进行实验。相信我,时间真的是有限的:“结果必须收集的几个星期前,我们的资助申请被接受了,我们得到了研究资助,就在结果必须被收集之前的几个星期。(我们的合作者做某种鱼类产卵幼虫实验只在春天做),因此,我开始思考“我怎么能尽快把这些结果给他们呢?好吧,我知道C和Fortran语言,相比与使用Python,如果我用它们实现这些算法,并在各自的语言中执行“筛选”,运行可能更快。这是一个有把握的猜测,我真的不知道它是否真的会有更快的速度。但有一件事我知道:如果我使用Python来进行开发,我可以让它在几天内运行,也许它需要一个星期才能得到各自的C版本编码了。我会担心一个更有效的实现。在那一刻,把这些结果给我的合作者这是非常重要的—“过早的优化是所有邪恶的根源。” 在节点上:同一个思路也适用于数据存储解决方案。在这里,我只使用SQLite。CSV没有意义因为我需要反复地注释和检索某些分子。我当然不想从开始到结束每一次我想查一个分子或处理它的记录时——处理内存容量的问题,都要扫描或重写一个CSV。也许,MySQL会更好。除了上述原因以外,但是,我想将这份工作尽快完成,并建立一个额外的SQL Server…没有时间,SQLite可以很好的完成这个工作。

  (Source: https://xkcd.com/1319/)

  判决:选择满足你的需要的语言!然而,有一点值得注意的是!一个刚刚开始的程序员在学习它之前如何知道一门语言的优点和缺点,以及该程序员怎么知道,这种语言对他来说到底有没有用?这是我要做的:在谷歌和 GitHub只搜索特定的应用程序和你的最常见的问题和任务的相关解决方案。你不需要阅读和理解代码。只看最终产品。还有,不要犹豫,问别人。不要笼统的只是问“最好的”编程语言,要具体的描述你的目标,为什么你要学习编程。如果你想在MacOS X上开发应用,你可能需要学习面向对象的C、swift,如果你想在Android平台上开发应用,你可能对学习java等更感兴趣。


我最喜欢的Python工具是什么?

  如果你有兴趣,这些是我最喜欢和最经常使用的Python的工具,我几乎每天都会使用他们中的大多数。

  • NumPy: 我最喜欢的库,使用线性代数处理阵列结构和矢量方程;增强版的SciPy

  • Theano:可以在我的GPU上实现机器学习算法一些比较繁重的计算和分布式计算。

  • scikit-learn:平时最方便的API,用来实现最基本的机器学习任务。

  • matplotlib:绘图时我会选择这个库,有时我也会使用 seaborn为一些特定的情节,例如,画一个特别大的热地图!

(来源:  http://stanford.edu/~mwaskom/software/seaborn/examples/structured_heatmap.html)


  • Flask (Django): 很少用,当我想把一个想法变成一个Web应用程序。这时,Flask是非常方便的!

  • SymPy: 用于符号数学,它取代了我原来用的WolframAlpha。

  • pandas: 用于相对较小的数据集,大多来源于CSV文件

  • sqlite3: 对“中型”数据集进行注释和查询

  • IPython notebooks: 我能说什么,我的90%的研究都发生在IPython notebook。它是一个伟大的环境,将所有的东西都放在一个地方:想法,代码,评论,LaTeX 方程,插图,图,输出,…

  

  请注意,IPython项目最近演变成 Project Jupyter。现在你在jupyter notebook环境下不仅仅可以使用Python还可以使用R,Julia,和更多其他语言。


我觉得MATLAB怎么样?

  几年前,我相当广泛地使用Matlab;大多数的计算机科学课都教授MATLAB。我真的认为这毕竟不是一个坏的的环境!因为它是用线性代数的思想建立的(矩阵实验室MATLAB),当它来实现机器学习算法时,相比Python / NumPy ,MATLAB的感觉更“自然”,好,公平来说,对我们的程序员来说,1-indexed编程语言似乎有点奇怪,但是,请记住,MATLAB带有一个很大的价格标签,而且在学术界以及工业界它正在慢慢衰落。另外,我毕竟是一个开源爱好者的粉丝。此外,相比于其它的高效的语言,它的性能也没有多么突出,看下面的基准:

(基准时间相对于C——越小越好,C绩效= 1;来源:http://julialang.org/benchmarks/


  然而,我们不应该忘记,还有Python的灵巧的Theano库的。2010年,Theano的开发者报道了当代码运行在CPU上时,Theano性能比NumPy快1.8倍,如果Theano是针对GPU的,速度甚至比NumPy快11倍(J. Bergstra, O. Breuleux, F. Bastien, P. Lamblin, R. Pascanu, G. Desjardins, J. Turian, D. Warde-Farley, and Y. Bengio. Theano:Python中的CPU和GPU的数学编译。在Proc,Python科学会议的第九条,第1页–第7页,2010。)。现在,记住这个Theano的基准是2010,而且近几年Theano明显提高了很多,所以现代图形卡的能力也提高了很多。

  我知道许多希腊人相信毕达哥拉斯说所有的事情都是来源与数字。这一断言提出了一个难题:那些不存在的事情是怎样被孕育产生的?——西雅娜巴豆(Theano of Croton )(哲学家,公元前第六世纪)。

  PS:如果你不喜欢NumPy的点方法,敬请期待即将到来的Python 3.5,我们将为矩阵乘法提供一个中缀运算符,耶!

  矩阵乘法的“手动计算”(我的意思是没有NumPy和BLAS或LAPACK的帮助,看起来繁琐且效率低下)。

blob.png

  

  如果我们有线性代数和库,进行优化,来对付它,谁还会希望实现这个表达式嵌套循环?

blob.png

  

  现在,如果这个点方式的产品不吸引你,这是它将在Python 3.5中的样子:

blob.png

 

  说实话,我不得不承认,我并不是“@”符号作为矩阵运算符的忠实粉丝。然而,我真的认为这是长期和艰难的,并不能找到任何更好的“未使用”的符号来实现这一目的了。如果你有更好的主意,请让我知道,我真的很好奇!

Julia很棒。。。在纸上!


  我认为Julia是一个伟大的语言,我想推荐给一个开始学编程和机器学习的人。我不确定我是否真的应该。为什么?关于编程语言有这样一个可悲的,有些自相矛盾的事情。对于Julia,我们不能确定它在未来几年会一直流行。等等,“受欢迎”和编程语言多么好和有用有什么关系呢?让我告诉你。困境是,最有用的语言不一定是那些精心设计的,而是那些最受欢迎的。为什么?

  1. 1.已经有很多(大多是免费的)库,这样你就可以充分利用你的时间,不必全盘重来。

  2. 2.它是更容易找到帮助,在线的教程和例子。

  3. 3.语言提高,更新,补丁应用更加的频繁,使它“更好”。

  4. 4.它使得在团队中工作可以更好地协作也更容易。

  5. 5.更多的人会从你的代码中受益(例如,如果你决定分享GitHub上)。


  就我个人而言,我爱Julia是因为什么,因为它完全符合我的兴趣。我虽然使用Python;主要是因为有太多好的东西使它特别有用。Python社区是伟大的,我相信它会在即将到来的(至少)5至10年普及并且很繁荣。对于Julia,我不那么肯定。我喜欢它的设计,我认为特别好。然而,如果它不受欢迎,我不能确定它是“未来的证据”,如果发展在未来几年就停止了呢?我所投资的事情到那时就“死”了。然而,如果每个人都这样想,那么就没有新的语言会有机会了。


R真的没有什么错


  嗯,我想我曾经是一个R的使用者这件事并不是什么大秘密。我甚至写了一本关于它的书(好吧,其实准确的来说是关于使用R绘制热图。请注意,这是多年前以前,在ggplot2出现之前。没有真正令人信服的理由去仔细讨论它–我说的是我的那本书。然而,如果你无法抗拒,下面是免费的,五分钟就可以读完的简短版)。我同意,这是一点题外话。所以,回到我们的讨论:R语言有什么不对吗?我认为没有什么不对的。我的意思是,在数据科学中,它是非常强大的,一个很有能力和“流行”的语言,不久前,连微软也变得很感兴趣:微软收购革命分析,一个商业供应商服务的开源R编程语言的统计计算和预测分析。

  那么,我怎么总结我对R的感觉呢?我并不知道这句话出自哪里–前段时间我在某个地方看到它–但是可以很好地解释R和Python的区别:“R是由统计人员为统计人员开发的一种程序设计语言;Python是由计算机科学家开发的,它可以由程序员使用,来运用统计技术。”这句话的一层意思是,R和Python都可以处理“数据科学”的任务,然而,我感觉Python的语法更为自然–只是个人品味。

  我只是想把Theano 和其在可以在GPU上运算作为Python的一大优势,但我发现R也可以,在GPU上使用R并行编程:我知道接下来想问什么:“好吧,那把我的模型变成一个出色的Web应用程序怎么样?我敢打赌,这是你不能在R上做的事情!“对不起,但你输了这个赌注;看一下这个Shiny by RStudio A web application framework for R,你明白我的意思了吗?这里没有赢家。可能永远不会有。

  拿我最喜欢的一句来自其他领域的Python格言来说:“我们都是成人了”–别浪费我们的时间在语言的战争上了。选择“单击”为您的工具。当谈到就业市场的观点:这里也没有对或错。我不认为一个公司,想聘请你作为一个“数据科学家”,却会因为你最喜欢的工具箱而困扰,毕竟编程语言只是“工具”。最重要的技能是像一个“数据科学家”思考,问正确的问题,能够解决问题。困难的部分是数学和机器学习理论,一个新的编程语言可以很容易地学习。想想,你学会了如何使用一把锤子,把钉子钉进去,那么拿起一个不同的制造商制造的锤子会很难吗?但如果你仍然有兴趣,看看下面的TIOBE指数,它可以用来衡量编程语言的普及程度:

  

  然而,如果我们看看2015前十的编程语言,由 Spectrum IEEE提供,R语言上升的很快(左栏:2015,右栏:2014)。

  我想你应该已经知道了。Python和R,真的没有什么大的区别。此外,当你选择了一种语言的时候,你不应该担心工作机会。




 

2月15日11:00到13:00网站停机维护,13:00前恢复