数据大师Olivier Grisel给志向高远的数据科学家的指引

2018-03-13 15:39:40 浏览数 (1)

原文:http://www.dataiku.com/blog/2015/09/28/interview-grisel-part1.html

译文:http://www.csdn.net/article/2015-10-11/2825882

(编译/刘帝伟 审校/朱正贵、赵屹华 责编/周建丁)

译者简介:刘帝伟,中南大学软件学院在读研究生,关注机器学习、数据挖掘及生物信息领域。

Olivier Grisel(OG)本人在InriaParietal工作,主要研发scikit-learn,使用Python语言编写的最流行的机器学习库之一。OG是机器学习、文本挖掘和自然语言处理领域的专家。大概在几周前,我们的Florian Douetteau (FD)对OG进行了一次访谈,很幸运,我得到这个机会去旁听。

FD:Olivier,你作为scikit-learn的主要贡献者已经有一段时间了。你可以告诉我们一些关于你的贡献么?

OG:大概是2010年,我就开始做scikit-learn这个项目。我是利用业余时间去做这个项目的。在2013年10月,我加入了Inria,一所面向计算机科学和自动化研究的法国研究院。我们有个团队,名叫Parietal,主要研究使用MRI数据对大脑进行建模。在这个项目中,我主要负责让scikit-learn发展地更长远,主要是指性能和可扩展性方面。

FD:scikit-learn已经发展了这么多年,而且知道开发过程中的许多阻碍。你能告诉我们一些关于将来的事么?

OG:当然可以。在过去的几年中,我们已经知道了一个重大的进展。现在,我们有很多新的用户和贡献者。根据我们的网站统计,我们每个月有150000到160000个独立访客,其中有1 / 3是回访用户,而且我们也有越来越多的贡献者。例如,在这些天,几乎有300个pull请求需要我们去处理。

scikit-learn大多数的新发展都来自用户社区自身的贡献。他们不断给scikit-learn库进行修改和补充,并为scikit-learn更好的后续版本提交这些工作。然后我们会对这些修改进行测试,并将其添加到每个新的版本中。例如,在最近的一个测试版本里,我们的一个贡献者开发了LDA估测器。这个算法在某种程度上可以替换scikit-learn已经存在的MMF,而且LDA在可扩展性方面表现的更强。

我开发的是一个更加长期的项目,这个项目涉及了大量的问题(因此它并不属于下一个版本的一部分)。我们正在努力使更多的scikit-learn算法能够以数据流模式,或核外模式,来管理数据,而不是在内存中控制整个数据集。我们希望它们逐渐地加载数据集,就像它们训练模型那样。

scikit-learn VS MLlib

FD:目前,在机器学习领域,我们听到了大量关于Spark的传闻。你有机会去尝试一下么?如何把它与scikit-learn进行比较呢?

OG:通过制作的两个Spark教程,我了解了一下Spark。Spark和Python或scikit-learn之间的主要区别是,Spark默认是一个系统,以分布式的方式管理那些其它数据处理方法无法在内存中处理的数据。这也是MLlib一开始的设计方向(ed:Spark分布式机器学习框架)。他们选择仅实现可扩展性的算法,这些算法可以在它们有能力处理的那些数据上和大量集群中运行。通过只选择有这种特性的算法,他们目前已经解决了这个双重可扩展性问题。

scikit-learn最初的目的是处理内存中的数据,所以我们不存在偏见。我们有一些非常有效的算法,它们只在小数据集上有效。但事实上,我们有很多算法都是以批处理模式实现的。目前,我正在对它们进行重构,主要是为了让其具有更好的可扩展性。

scikit-learn并不是创建跨集群的功能。我们不想改变所有的功能,来处理存储在集群中的资源,但我们想把它作为一种可能性,确保scikit-learn模型可以嵌入到一个类似Spark的框架里,这样它们就可以分布在集群中。例如,当你在训练一个随机森林时,如果你认为你的数据小到可以在整个集群中进行复制,那么你可以很容易地训练每棵树。对于中等规模的数据集,我们也想要加快超参数搜索和交叉验证的速度,这自然就是并行。

在解决集群的分布式计算之前(正如Spark关注的),我对于研究有效的核外处理方法(像Dato正在做的)也是很有兴趣的。目前我还没有真正地研究过细节,但似乎只要你能够更好地进行核外处理并重视算法效率,你就可以减少资源的浪费。这也可能成为scikit-learn未来发展的驱动力。

FD:以分布式方式存储大量数据会导致性能和结果的偏差么?我正在思考使用Spark运行随机森林的例子。

OG:MLlib随机森林算法在选择特征进行划分时,它是直接在每棵树的训练层面进行并行的。它并没有考虑所有可能的分裂。它建立的是一个直方图,并在划分的数据集上进行并行运算。然后,使用总的信息构建划分。这跟估计算法类似。尽管这种方法是近似估算,但在实际应用中,当你使用样本进行建模时,几乎不会出现问题。因为和非估计算法的结果相比非常接近,只是实现的效率差了点。

未来的方向是特征生成?

FD:当你去查看一个数据项目,很多时间–如果不是大部分时间–是用在数据预处理和特征生成。在过去的几个月里,scikit-learn在朝着特征工程方向发展。这是你将继续维持的方向吗?你会朝一个集成的管道工作吗?这似乎像是一条无止尽的路。有没有一些平行的项目专攻特定的数据类型和格式,同时又遵循scikit-learn的习惯和理念?

OG:在创建scikit-learn预测模型时,特征始终是一个关键点。因为pandas数据框的最新版本,我们越来越善于整合工具箱去操纵任何格式的数据,并把它转为其它格式或是任何其他的表示。

我赞同你的观点,特征工程对于一个具体的应用程序而言,永远是一个特殊环节。我们希望保留一个通用库。如果我们要专攻某个特定的领域并开发特征,它将成为一个独立的特定库的一部分。例如,在天体物理学中有一个叫AstroML的专用库。此前,我在INRIA的团队处理的是影像数据。我们已经开发了一个特定的库,叫做nilearn,它是scikit-learn的一个分支项目。事实上,划分不同项目的范围是很有好处的。它可以围绕社区特定的实践活动进行更好地交流。

FD:在特征工程这个主题上,你相信Spark和MLlib会改变数据科学家的工作方式么?

OG:最近的数据框API是Spark的一个优点。它给了数据科学家一个非常直观,灵活,并富有表现力的工具,用于测试他们不同的数据表示。

从更高层面来讲,最新版本的spark.ml包,允许在以数据组合为特征的“链”中创建管道和预测模型。在链的不同阶段可以交叉验证参数的相互作用。也正是这类API的优点,使它更易于测试。其实在scikit-learn中也可以安装插件,使用数据框作为输入并且添加用户自定义的scikit-learn转换脚本。事实上,使这个过程变得更加简单也正是我们应该努力的实践方向。

搜寻这些项目

FD:非常感谢您这次精彩的谈话!你觉得还有其他任何需要补充的吗?

OG:我认为Python生态圈越来越意识到当前的技术形势,特别是在谈及到处理大量数据时。Java和Scala领先于我们,尤其是Hadoop和Spark。开发人员对于这一点都非常清楚,他们正在寻找答案。如今有很多有趣的项目,如Blaze,Dask,或XRay。他们正在开发相关的APIs,努力使其像Pandas一样出色,并且能做核外计算,最终形成分布式的。Wes McKinney给Cloudera做的Ibis项目也很有趣。它使用的是Python,但用Impala作为后台,用其替代PySpark。其实,我并不相信在当今的生产中能够使用它,但我相信这个主题的发展将会很有趣。

明智地选择大规模

FD:这个问题来自某个机器学习初学者,他不知道该使用哪个框架和算法可以获得更强的扩展能力,你有什么建议呢?

OG:一个很好的规则就是根据你最终必需处理的数据量来抉择,当然还要把未来数据的增量考虑进去。最近,一台配置很好的机器可以有上百G的RAM。当然,原始数据集可能比这更大。一旦你提取了特征并将其转为数值表,你就可以得到更小的数据集,那样你就可以在内存中处理数据并使用scikit-learn运行预测模型。实际上,想要你的系统具有可扩展性,并不意味着你就必须使用MLlib。

大数据基础设施的挑战

FD:人们开始考虑如何管理大量的数据,对于如何得到一个很好的衡量标准,你的建议是什么呢?

OG:在你开始做机器学习之前,从一个基本模型开始很重要。比如,你可以对这些基本模型计算平均值。当你在Spark中做这些基本计算时,你可以看看管道和处理时间,确保在你的模型变得复杂之前,你没有设置一些多余的东西。

我建议他们选择自己数据中的一个子样本,在内存中能装得下,这样就可以使用所有可用的算法来做比较机器学习的分析结果,甚至是那些永远不能部署到整个集群的算法。你要记住,MLlib是通过限制它的算法面板来达到可扩展性功能。这表示它们如今的库并不像R或Python包那样多。子样本总归还是好的,回到小数据世界能确保你遵循正确的方法。

事实上,你也应该这样做,这样你就可以确保当你向你的样本添加更多的数据时,实际上你是在提高你的模型性能。这有利于检查。

将工作分析流程从一种语言(如Python)复制到另一种(如R或Scale),也是个不错的想法。像Data Science Studio这种工具,它使得在同一个数据上使用不同的编程语言设计两个管道变得更加容易。有些操作可能在另一些框架上表现的更自然或者更加高效,而且做这种管道转变训练是建立实践直觉的快速方式。一旦你的两个管道产生了一致的输出,那么你可以去请教经验丰富的同事或者专家朋友来帮你快速地检查下代码。他(她)应该知道如何使你的代码更加高效或更加精简并且避免语法错误。

FD:你可以给出一些你或者你的团队使用scikit-learn运行大数据集的例子么?

OG:这真的取决于我们正在研究和试验中的模型。当样本上升到数以万计的时候,一些模型就会失效。我们团队研究的数据集大概有百万兆字节,但是他们做了大量的预处理和降维操作。

对于缺乏经验的用户,这一点真的必须考虑。如果他们研究的数据集真的足够大,他们可能自然而然地选择使用Spark。但这种方法最终可能会以效率较低而失败告终。如果他们多给予一点思考,原本使用Spark需要消耗CPU几个小时来计算的任务,在笔记本上使用scikit-learn可能5分钟就完成了。实际上每种新的技术都是一把双刃剑。

Python VS R

FD:对于数据科学初学者而言,应该如何选择学习哪种语言和框架呢,你有好的建议么?

OG:个人认为,你必须根据你的喜好来选择,如果你身边有这方面的专家,你还可以依据他的情况而定。在数据科学中,交流可以让你学到更多的知识。如果你去参加聚会或者与其他人报名参加Kaggle比赛,那么你一定要抓住与专家互动交流的机会,这真的很重要。与他们相互交流学习的技巧和诀窍是学习数据科学很好的方式。

之后,将分析思路用另一个框架来表达就更加容易了。如果你掌握了一种语言,这种学习语言的方法是一样的。这一点最重要。这对于像Data Science Studio这种工具也是很有用的。你可以用它在一个环境下尝试不同的语言和技术。当你能轻松的比较结果时,将分析思路从一种语言翻译成另一种语言其实很简单,比如Python和R。

最后,让我们再次感谢Olivier!




0 人点赞