适用于机器学习的Python vs R


101

我刚刚开始出于学术目的开发机器学习应用程序。我目前正在使用R并对其进行训练。但是,在很多地方,我都看到人们在使用Python

人们在学术界和工业界使用什么,建议是什么?


3
那么,什么类型的机器学习(图像/视频?NLP?财务?天文学?),哪些分类器,什么大小的数据集(Mb?Gb?Tb?),什么规模,什么延迟,在什么平台上(移动/单计算机)? / multicore / cluster / cloud)...?您的应用程序将使用/需要哪些特定的库,并且您是否检查了每种语言提供的库?您是否只是为个人学习而构建一个玩具应用程序,或者它是否曾经被商品化是否重要?使用开源还是专有的?您将与其他人或现有应用程序一起使用吗,它们将使用/支持什么?Web前端/ GUI?等
smci

1
一种观察是,使用Python的机器学习人员使用Python的数量更多,而使用R的机器则使用传统的“统计学家”,例如使用心理学实验处理数百个数据点的人。尽管这种差异可能正在缩小。
xji

蟒蛇一路走!我一天做的事情是同事的4倍。您可以将python用于各种编程任务,而不仅限于机器学习。
Francesco Pegoraro

Answers:


91

当您相互选择RPython时,要考虑一些真正重要的区别:

  • 机器学习分为两个阶段。模型构建和预测阶段。通常,模型构建是作为批处理执行的,并且预测是实时完成的。建立模型的过程是一个计算密集型过程,而预测只是一瞬间就发生了。因此,Python或R中算法的性能并不会真正影响用户的周转时间。Python 1,R 1。
  • 生产: Python和R之间的真正区别在于可以进行生产。因此,Python是一种成熟的编程语言,许多组织在其生产系统中使用它。R是受到许多学术界青睐的统计编程软件,并且由于数据科学的兴起以及图书馆的可用性和开放源代码,该行业已开始使用R。这些组织中的许多组织都使用Java,C ++,C#, Python等。因此,理想情况下,他们希望使用相同语言的预测系统来减少延迟和维护问题。Python 2,R 1。
  • 库:两种语言都有庞大而可靠的库。R有5000多个库可满足许多领域的需求,而Python则提供了一些令人难以置信的软件包,例如Pandas,NumPy,SciPy,Scikit Learn,Matplotlib。Python 3,R 2。
  • 发展:两种语言都是解释性语言。许多人说python很容易学习,几乎就像读英语(把它写得很浅)一样,但是R需要更多的初步学习工作。而且,它们都具有良好的IDE(Python的Spyder等和R的RStudio)。Python 4,R 2。
  • 速度: R软件最初在大型计算方面存在问题(例如,像nxn矩阵乘法)。但是,通过Revolution Analytics引入R解决了此问题。他们用C语言重写了计算密集型运算,速度非常快。Python作为高级语言相对较慢。Python 4,R 3。
  • 可视化:在数据科学中,我们经常倾向于绘制数据以向用户展示模式。因此,可视化成为选择软件的重要标准,并且R在这方面完全杀死了Python。感谢Hadley Wickham提供了令人难以置信的ggplot2软件包。R胜出。Python 4,R 4。
  • 处理大数据: R的限制之一是它将数据存储在系统内存(RAM)中。因此,在处理大数据时,RAM容量成为一个约束。Python表现不错,但是我想说,由于R和Python都具有HDFS连接器,因此利用Hadoop基础架构将大大提高性能。因此,Python 5,R 5。

因此,两种语言都一样好。因此,根据您的领域和工作地点,您必须明智地选择正确的语言。技术界通常更喜欢使用一种语言。商业用户(市场分析,零售分析)通常会使用R等统计编程语言,因为他们经常进行快速原型制作和可视化(在R中比Python更快)。


15
R在可视化方面几乎没有击败python。我认为情况恰恰相反。python不仅具有ggplot(我不使用我自己,因为有更多的pythonic选项,例如seaborn),它甚至可以在浏览器中使用bokeh等软件包进行交互式可视
Emre 2014年

10
R还具有与Shiny进行交互的能力。
stanekam 2014年

13
图书馆员-我一点都不同意。到目前为止,R是最丰富的工具集,而且它还以适当的方式提供信息,部分是通过继承S,部分是通过最大的知名专家社区之一提供的。
rapaio 2014年

34
“速度:R软件最初在大型计算方面存在问题(例如,像nxn矩阵乘法)。但是,通过Revolution Analytics引入R可以解决此问题。它们在C中重写了计算密集型运算,速度非常快。 Python作为高级语言相对较慢。” 我不是经验丰富的R用户,但据我所知,R中所有具有低级实现的东西在numpy / scipy / pandas / scikit-learn / whatever中也有类似的低级实现。Python还具有numba和cython。这一点应该是平庸的。
Dougal 2015年

8
对于您“处理大数据”的评论,我要补充一下,python是apache spark支持的3种语言之一,它具有极快的速度。您对R具有C后端的评论是正确的,但是python scikitlearn库也是如此。我认为您的帖子具有很好的平衡性,但是我认为速度至少是一个纽带,而可伸缩性(即处理大数据)肯定支持python。
jagartner

23

没有比“ python更好”或“ R比x更好”之类的东西了。

我知道的唯一事实是,在行业中,很多人坚持使用python,因为这是他们在大学中学到的。python社区真的很活跃,并且有一些很棒的ML和数据挖掘框架等。

但老实说,如果您有一个优秀的c程序员,他就可以像人们在python或r中所做的一样,如果您有一个优秀的java程序员,他也可以(几乎)在java中做任何事情。

因此,请坚持使用您喜欢的语言。


5
但是图书馆呢?有一些高级R软件包(认为Ranfom Forest或Caret)对于用通用语言(例如C或Java)重新实现来说是完全不切实际的
Santiago Cepas 2014年

mahout即支持Java的随机森林
Johnny000,2014年

1
是的,但是R并不能带来处理大型数据集所需的性能,而且在大多数情况下,您拥有真正的工业化大型数据集。
Johnny000 2014年

1
是的,一个好的程序员可以做同样的C.但是一个坏的程序员可以在Python一样快,有经验的程序员可以在C.做到这一点做到这一点
Pithikos

1
我不认为这总是对的@Pithikos给定基本的数学公式,通常我自己可以使用VB / T-SQL更快地实现它们,而无需花时间去研究R或Python库的不必要的神秘语法。在此过程中,使生成的代码更具可伸缩性。我很高兴这些库存在,但是它们内置了缺点。在某些情况下和特定项目中,最好绕开它们。
SQLServerSteve

16

一些其他想法。

编程语言“本身”仅是一种工具。所有语言都旨在使某些类型的结构比其他结构更易于构建。与其他语言相比,编程语言的知识和精通度比该语言的功能更为重要和有效。

据我所知,这个问题有两个方面。第一个维度是能够快速探索,建立概念或模型的证明,最终拥有足够的工具来研究正在发生的事情(例如统计测试,图形,测量工具等)。研究人员和数据科学家通常都喜欢这种活动(我总是想知道这是什么意思,但是我用这个词来表示它的宽松定义)。他们倾向于依靠众所周知的经过验证的工具,这些工具可以用于证明或论证。

第二个维度是扩展,更改,改进甚至创建工具,算法或模型的能力。为了实现这一点,您需要适当的编程语言。几乎所有人都是一样的。如果您在一家公司工作,那么您将非常依赖于公司的基础架构,内部文化以及您的选择会大大减少。另外,当您想要实现用于生产的算法时,您必须信任该实现。用另一种您不会掌握的语言来实现将不会有多大帮助。

对于第一种活动,我倾向于R生态系统。您拥有一个强大的社区,大量工具,并证明这些工具能够按预期运行。另外,您可以考虑使用Python,Octave(仅举几例),它们是可靠的候选者。

对于第二项任务,您必须先考虑自己真正想要的。如果您需要强大的生产就绪工具,那么C / C ++,Java和C#是不错的选择。我认为Python与Scala和朋友一起是该类别的第二公民。我不想发动火焰战争,这只是我的意见。但是,在作为开发人员超过17年之后,我倾向于更严格的合同和我的知识,而不是自由地做任何您可能想到的事情(就像发生在许多动态语言中一样)。

我个人想尽可能多地学习。我决定必须选择困难的方法,这意味着我要从头开始实施所有内容。我使用R作为模型和灵感。它在图书馆中拥有巨大的财富,并且积累了很多经验。但是,R作为编程语言对我来说是一场噩梦。因此,我决定使用Java,并且不使用任何其他库。那只是因为我的经验,没有别的。

如果有时间,最好的办法就是花些时间处理所有这些事情。这样,您将为自己赢得最适合自己的最佳答案。Dijkstra曾经说过,这些工具会影响您的思维方式,因此建议您先了解您的工具,然后再让它们为您的思维建模。您可以在他的著名论文《谦虚程序员》中了解更多


15

到目前为止,我将补充其他人的发言。没有一个单一的答案说一种语言比另一种语言更好。

话虽如此,R在数据探索和学习方面拥有更好的社区。它具有广泛的可视化功能。另一方面,自引入熊猫以来,Python在数据处理方面已经变得更好。与R(R是一种低级语言)相比,Python的学习和开发时间非常少。

我认为最终归结为您所处的生态系统和个人喜好。有关更多详细信息,您可以在此处查看此比较。


2
“ R有一个更好的学习社区”-我想这很大程度上取决于学习的类型。R中的神经网络(任意前馈体系结构,CNN,RNN)发生了什么?
马丁·托马

1
R并不是真正的“低级” IMO。它也是一种动态语言。
xji

12

没有解决所有与数据相关的问题的灵丹妙药语言。语言选择取决于问题的背景,数据的大小,如果您在工作场所工作,则必须坚持使用它们。

就个人而言,由于它的可视化库和交互样式,我比Python更常使用R。但是,如果我需要更高的性能或结构化代码,则一定要使用Python,因为它具有一些最佳的库,如SciKit-Learn,numpy,scipy等。在项目中我可以同时使用R和Python。

因此,如果您开始从事数据科学工作,我建议您同时学习两者,这并不困难,因为Python还为R和Pandas提供了类似的接口。

如果必须处理更大的数据集,则无法逃脱使用Java构建的生态系统(Hadoop,Pig,Hbase等)。


8

没有“更好”的语言。我已经尝试过这两个方法,并且对Python感到很满意,所以我仅使用Python。尽管我仍在学习东西,但是到目前为止,我还没有遇到任何使用Python的障碍。关于Python的好处是社区太好了,您可以在Internet上轻松获得很多帮助。除此之外,我想说的是使用您喜欢的语言,而不是一个人推荐的语言。


8

根据我的经验,答案取决于手头的项目。对于纯研究,我更喜欢R的原因有两个:1)种类繁多的库,以及2)许多数据科学文献都包含R样本。

如果项目要求非专业人员使用交互式界面,我发现R太受限制。闪亮是一个不错的开始,但还不够灵活。在这些情况下,我将开始考虑将我的R工作移植到Python或js。


8

所有其他答案无法解决的问题是许可

大多数上述精彩的R库都是GPL(例如ggplot2data.table)。这样可以防止您以专有形式分发软件。

尽管这些库的许多用法并不意味着软件的分发(例如,离线训练模型),但GPL本身可能会诱使公司停止使用它们。至少以我的经验。

另一方面,在python领域中,大多数库具有业务友好的发行许可证,例如BSD或MIT。

在学术界,许可问题通常不是问题。



6

我面临的真正挑战之一是R与不同版本兼容的不同软件包..很多R软件包不适用于R的最新版本。而R相当多的时间由于库或软件包是为较旧的版本而给出错误版..


3
我不确定这是R的特殊问题,还是不确定它是否回答了Python和R的不同问题。
肖恩·欧文

5

我还没有尝试过R(好一点,但是不足以进行很好的比较)。但是,这是Python的一些优势:

  • 很直观的语法:元组拆包,element in a_listfor element in sequencematrix_a * matrix_b(为矩阵乘法),...
  • 许多图书馆
    • scipy:科学计算;它的许多部分只是用于快速Fortran代码的包装器
    • theano > 千层面 > nolearn:用于神经网络的库-可以在GPU上对其进行训练(需要nvidia,需要CUDA),而无需进行任何调整
    • sklearn:通用学习算法
  • 良好的社区
  • IPython笔记本
  • 其他
    • 0索引数组...我一直都用R犯那个错误。
    • 建立包装结构
    • 良好的测试代码支持

3

与Python相比,我更喜欢Python,因为Python是一种完整的编程语言,因此我可以进行端到端的机器学习任务,例如使用以Python编写的HTTP服务器收集数据,执行高级ML任务,然后在线发布结果。这一切都可以在Python中完成。实际上,我发现R较难学习,并且学习Python的收益要大得多,因为R几乎可以用于任何编程任务。


2
您可以在R
Gaius

2

R:R是开源的对应物。传统上一直在学术和研究中使用。由于其开源性质,因此最新技术会迅速发布。互联网上有很多文档,这是一个非常划算的选择。Python:随着起源作为一种开放源代码脚本语言,Python的使用随着时间的推移而增长。如今,它具有各种库(numpy,scipy和matplotlib)和功能,几乎可以用于您想要进行的任何统计操作/模型构建。自从引入大熊猫以来,它在结构化数据的操作上已变得非常强大。

Python代码

导入库

导入其他必要的库,例如pandas,numpy ...

从sklearn导入linear_model

加载训练和测试数据集

识别功能和响应变量,值必须是数字和numpy数组

x_train = input_variables_values_training_datasets y_train = target_variables_values_training_datasets x_test = input_variables_values_test_datasets

创建线性回归对象

线性= linear_model.LinearRegression()

使用训练集训练模型并检查分数

linear.fit(x_train,y_train)linear.score(x_train,y_train)

方程系数和截距

print('系数:\ n',linear.coef_)print('拦截:\ n',linear.intercept_)

预测输出

预测= linear.predict(x_test)R代码

加载训练和测试数据集

识别功能和响应变量,值必须是数字和numpy数组

x_train <-input_variables_values_training_datasets y_train <-target_variables_values_training_datasets x_test <-input_variables_values_test_datasets x <-cbind(x_train,y_train)

使用训练集训练模型并检查分数

线性<-lm(y_train〜。,data = x)摘要(线性)

预测输出

预测=预测(线性,x_test)



0

在此处输入图片说明

我在linkedin帖子中得到了这张图片。每当我对使用python或R产生疑问时,我都会对其进行调查,事实证明它非常有用。


那你选择什么呢?
Serhii Polishchuk '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.