【外文翻译】Scikit-learn:在Python中进行机器学习

外文原文版出处: Pedregosa F, Varoquaux G, Gramfort A, et al. Scikit-learn: Machine learning in Python[J]. Journal of Machine Learning Research, 2011, 12(Oct): 2825-2830.

摘要

  Scikit-learn是一个Python库,整合了大量的且先进的机器学习算法,适用于中等规模的监督学习和无监督学习的问题。这个库专注于使用通用的高级语言将机器学习带给非专业人士;重点放在易用性,性能,文档和API的一致性。它具有最小的依赖性,并且在简化的BSD协议许可下分发,鼓励其在学术和商业环境中使用。源代码,二进制文件和文档可以从 http://scikit-learn.sourceforge.net 下载。
  关键词:Python,监督学习,无监督学习,模型选择

简介

  Python编程语言本身作为科学计算中最流行的语言之一,由于其高互动性及其成熟的科学文库生态系统,它是算法开发和探索性数据分析的一个具有强大吸引力的选择(Dubois,2007年;Milmann和Avaizis,2011年)。而且,作为一种通用语言,它不仅仅在学术环境中使用,而且在工业中也越来越多地受到了重视。
  Scikit-learn利用这种丰富的环境提供了许多著名的机器学习算法最先进的实现,同时保持一个易于使用的界面与Python语言紧密集成。这回应了软件和网络行业以及计算机科学以外领域(如生物学或物理学)非专业人士对统计数据分析的日益增长的需求。Scikit-learn与Python中的其他机器学习工具箱有所不同,原因如下:(1)它是在BSD协议的许可分发下进行开发的;(2)它结合了编译代码的效率,不像MDP(Zito等人,2008年)和pybrain(Schaul等人,2010年);(3)它只取决于numpy和scipy以方便开发,不像pymvpa(Hanke等人,2009年)有可选的依赖关系,如R和shogun,同时(4)它专注于命令式编程,不同于使用数据流框架的pybrain。
  虽然该组件大部分是用Python编写的,但它包含了提供SVM的参考实现和兼容许可的广义线性模型的C++库LibSVM(Chang和Lin,2001年)和LibLinear(Fan等人,2008年)。但编译之后的版本可以在各种各样的平台上使用,包括Windows和任何POSIX平台。此外,由于其自由的许可证,它已经广泛分布在主要的免费软件发行版本中,如Ubuntu,Debian,Mandriva,NetBSD和Macports;并且也分布在商业发行版中,如作为“Enttought Python 发行版”的一部分。

项目愿景

  代码质量。与其提供尽可能多的功能,该项目的目标是提供坚实的实现。通过单元测试(版本0.8,测试覆盖率为81%)和使用静态分析工具(如pyflakes和pep8)来确保代码质量。最后,我们致力于对严格遵守Python编码准则和numpy样式文档的函数和参数使用一致性的命名。
  BSD许可。大多数Python生态系统都获得non-copyleft许可证。虽然这种政策有利于通过商业项目采用这些工具,但它确实施加了一些限制:我们不能使用一些现有的科学代码,如GSL。
简要设计和API。为了降低进入的门槛,我们避免框架代码并且让不同类型对象的数量控制在最小,仅仅依赖于数据容器的numpy数组。
  社区主导型发展。我们的开发基于协作工具,如git,github和公共邮件列表。同时欢迎并鼓励外部的捐款。
文档。Scikit-learn提供了300页的用户指南,包括叙事文档,类参考,教程,安装说明,以及超过60个示例,其中一些事例反应了真实的应用程序。我们尽量减少机器学习术语的使用,同时保持所使用算法的精度。

底层技术

  Numpy:用于数据和模型参数的基本数据结构。输入数据表示为numpy数组,从而与其他科学Python库无缝集成。即使绑定使用编译后的代码,Numpy的基于视图的内存模型可限制其他人的复制(范德沃尔特等人,2011年)。它还提供基本的算术运算。
  Scipy:线性代数的高效算法,包括稀疏矩阵表示、特殊函数和基本统计函数。 Scipy有许多基于Fortran的标准数字包的绑定,例如LAPACK。这对于易于安装和便携性很重要,因为提供Fortran代码的库可以证明在各种平台上具有挑战性。
  Cython:一种在Python语言中组合C语言的组件。Cython使得通过类似Python的语法和高级操作来轻松实现编译语言的性能。它也用于绑定编译的库,消除Python / C扩展的样板代码。

代码设计

  面向接口编程而不是面向继承。 为了方便外部对象对scikit-learn的使用,不使用继承的方式; 相反,代码中约定并提供了一致的接口。最重要的对象是估计器,它实现了一个拟合方法,接受输入数据数组作为参数,并且可选地接受用于监督问题的标签数组。而监督估计器,例如SVM分类器,可以实现预测方法。一些估计器,我们称为变换器,例如PCA,实现一个变换方法,返回修改的输入数据。估计器也可以提供一个估分的方法,该方法是拟合优度的递增评估:对数似然,或者提供一个否定的损失函数。另一个重要的对象是交叉验证迭代器,它提供了将输入数据分割为列和测试索引对的方法,例如K折叠,留出一层或分层交叉验证。
  模型选择。 Scikit-learn可以评估估计器的性能或使用交叉验证选择参数,可选择分配计算的几个核心参数。这是通过在GridSearchCV对象中包装一个估计器来实现的,其中“CV”代表“交叉验证”。在调用拟合期间,它选择指定参数网格上的参数,最大限度地估分(底层估计得分的方法)。预测、得分或变换,然后提交给调整估计器。因此,该对象可以被透明地被任何其他估计器所使用。通过利用特定属性,如热重启或正则化路径,可以使某些估计器的交叉验证更有效(Friedman等人,2010年)。这是通过特殊对象所支持的,例如LassoCV。最后,通过流水线对象可以组合若干个变换器和估计器来创建组合估计器,例如,在拟合之前对多维数据进行降维操作。它表现为一个标准估计器,因此GridSearchCV可调整所有步骤的参数。

高水平还是高效:一些权衡取舍

  虽然scikit-learn专注于易用性,并且大多操作是用高级语言编写的,但是也注意应该要最大化计算效率。在表1中,我们比较了在Python语言中可访问的主要机器学习工具包中对几个算法的实现所需要的计算时间。我们使用Madelon数据集(Guyon等人,2004年),4400个实例和500个属性。数据集相当大,但对于大多数算法来说都算小型了。
  SVM。虽然所有包的比较中都在后台调用了libsvm,但scikit-learn的性能比较好,可以由以下两个因素进行解释:首先,我们的绑定避免了内存副本,并且比原始Python的libsvm绑定减少了40%的开销。第二,我们修补libsvm以提高密集数据的效率,使用更小的内存占用,并更好地使用现代处理器的内存对齐功能和流水线功能。该修补版本还提供了独特的功能,如设置单个样本的权重。
  LARS。迭代地细化残差而不是重新计算它们,使得性能增益比参考R语言实现高了2~10倍之多(Hastie和Efron,2004年)。 而Pymvpa通过对Rpy R的绑定使用来实现这个算法,并为内存副本支付沉重的代价。
  Elastic Net。我们对Elastic Net的scikit-learn坐标下降实现进行了基准测试。它实现了与高度优化的Fortran版本glmnet(Friedman等人,2010年)在中等规模问题上的性能相同的顺序,但是因为我们不使用KKT条件来定义活动集,所以在非常大的问题上的性能是有限的。
  kNN。k-最近邻居分类器实现构建样本的球树(Omohundro,1989年),但是在大规模的数据中应使用更有效的蛮力搜索。
  PCA(主成分分析)。对于中到大型数据集,scikit-learn提供了基于随机投影的截断PCA的实现(Rokhlin等人,2009年)。
  k-均值。scikit-learn的k-均值算法是在纯Python中实现的。它的性能受到numpy数组对数据传递次数的限制。

结论

  Scikit-learn 使用一致的、面向任务的界面来展示各种各样的机器学习算法,包括监督学习和无监督学习,从而使得能够更容易地进行比较,进而给定应用的方法。并且由于它依赖于科学的Python生态系统,它可以轻松地集成到传统范围的统计数据分析之外的应用程序中。更重要的是,以高级语言实现的算法可以用作特定于用例的方法的构建块,例如在医学成像中(Michel等人,2011)。未来的工作包括在线学习,规模化到大数据集。

文章目录
  1. 1. 摘要
    1. 1.1. 简介
    2. 1.2. 项目愿景
    3. 1.3. 底层技术
    4. 1.4. 代码设计
    5. 1.5. 高水平还是高效:一些权衡取舍
    6. 1.6. 结论

20170126-scikit-learn-translation/

本页二维码