如何利用python语言实现机器学习算法

Python038

如何利用python语言实现机器学习算法,第1张

基于以下三个原因,我们选择Python作为实现机器学习算法的编程语言:(一) Python的语法清晰;(二) 易于操作纯文本文件;(三) 使用广泛,存在大量的开发文档。 可执行伪代码 Python具有清晰的语法结构,大家也把它称作可执行伪代码(executable pseudo-code)。默认安装的Python开发环境已经附带了很多高级数据类型,如列表、元组、字典、集合、队列等,无需进一步编程就可以使用这些数据类型的操作。使用这些数据类型使得实现抽象的数学概念非常简单。此外,读者还可以使用自己熟悉的编程风格,如面向对象编程、面向过程编程、或者函数式编程。不熟悉Python的读者可以参阅附录A,该附录详细介绍了Python语言、Python使用的数据类型以及安装指南。 Python语言处理和操作文本文件非常简单,非常易于处理非数值型数据。Python语言提供了丰富的正则表达式函数以及很多访问Web页面的函数库,使得从HTML中提取数据变得非常简单直观。 Python比较流行 Python语言使用广泛,代码范例也很多,便于读者快速学习和掌握。此外,在开发实际应用程序时,也可以利用丰富的模块库缩短开发周期。 在科学和金融领域,Python语言得到了广泛应用。SciPy和NumPy等许多科学函数库都实现了向量和矩阵操作,这些函数库增加了代码的可读性,学过线性代数的人都可以看懂代码的实际功能。另外,科学函数库SciPy和NumPy使用底层语言(C和Fortran)编写,提高了相关应用程序的计算性能。本书将大量使用Python的NumPy。 Python的科学工具可以与绘图工具Matplotlib协同工作。Matplotlib可以绘制二D、三D图形,也可以处理科学研究中经常使用到的图形,所以本书也将大量使用Matplotlib。 Python开发环境还提供了交互式shell环境,允许用户开发程序时查看和检测程序内容。 Python开发环境将来还会集成Pylab模块,它将NumPy、SciPy和Matplotlib合并为一个开发环境。在本书写作时,Pylab还没有并入Python环境,但是不远的将来我们肯定可以在Python开发环境找到它。 Python语言的特色 诸如MATLAB和Mathematica等高级程序语言也允许用户执行矩阵操作,MATLAB甚至还有许多内嵌的特征可以轻松地构造机器学习应用,而且MATLAB的运算速度也很快。然而MATLAB的不足之处是软件费用太高,单个软件授权就要花费数千美元。虽然也有适合MATLAB的第三方插件,但是没有一个有影响力的大型开源项目。 Java和C等强类型程序设计语言也有矩阵数学库,然而对于这些程序设计语言来说,最大的问题是即使完成简单的操作也要编写大量的代码。程序员首先需要定义变量的类型,对于Java来说,每次封装属性时还需要实现getter和setter方法。另外还要记着实现子类,即使并不想使用子类,也必须实现子类方法。为了完成一个简单的工作,我们必须花费大量时间编写了很多无用冗长的代码。Python语言则与Java和C完全不同,它清晰简练,而且易于理解,即使不是编程人员也能够理解程序的含义,而Java和C对于非编程人员则像天书一样难于理解。 所有人在小学二年级已经学会了写作,然而大多数人必须从事其他更重要的工作。 ——鲍比·奈特 也许某一天,我们可以在这句话中将“写作”替代为“编写代码”,虽然有些人对于编写代码很感兴趣,但是对于大多数人来说,编程仅是完成其他任务的工具而已。Python语言是高级编程语言,我们可以花费更多的时间处理数据的内在含义,而无须花费太多精力解决计算机如何得到数据结果。Python语言使得我们很容易表达自己的目的。 Python语言的缺点 Python语言唯一的不足是性能问题。Python程序运行的效率不如Java或者C代码高,但是我们可以使用Python调用C编译的代码。这样,我们就可以同时利用C和Python的优点,逐步地开发机器学习应用程序。我们可以首先使用Python编写实验程序,如果进一步想要在产品中实现机器学习,转换成C代码也不困难。如果程序是按照模块化原则组织的,我们可以先构造可运行的Python程序,然后再逐步使用C代码替换核心代码以改进程序的性能。C++ Boost库就适合完成这个任务,其他类似于Cython和PyPy的工具也可以编写强类型的Python代码,改进一般Python程序的性能。 如果程序的算法或者思想有缺陷,则无论程序的性能如何,都无法得到正确的结果。如果解决问题的思想存在问题,那么单纯通过提高程序的运行效率,扩展用户规模都无法解决这个核心问题。从这个角度来看,Python快速实现系统的优势就更加明显了,我们可以快速地检验算法或者思想是否正确,如果需要,再进一步优化代码

Python语言下的机器学习库

Python是最好的编程语言之一,在科学计算中用途广泛:计算机视觉、人工智能、数学、天文等。它同样适用于机器学习也是意料之中的事。当然,它也有些缺点;其中一个是工具和库过于分散。如果你是拥有unix思维(unix-minded)的人,你会觉得每个工具只做一件事并且把它做好是非常方便的。但是你也需要知道不同库和工具的优缺点,这样在构建系统时才能做出合理的决策。工具本身不能改善系统或产品,但是使用正确的工具,我们可以工作得更高效,生产率更高。因此了解正确的工具,对你的工作领域是非常重要的。

这篇文章的目的就是列举并描述Python可用的最有用的机器学习工具和库。这个列表中,我们不要求这些库是用Python写的,只要有Python接口就够了。我们在最后也有一小节关于深度学习(Deep Learning)的内容,因为它最近也吸引了相当多的关注。

我们的目的不是列出Python中所有机器学习库(搜索“机器学习”时Python包索引(PyPI)返回了139个结果),而是列出我们所知的有用并且维护良好的那些。另外,尽管有些模块可以用于多种机器学习任务,我们只列出主要焦点在机器学习的库。比如,虽然Scipy包含一些聚类算法,但是它的主焦点不是机器学习而是全面的科学计算工具集。因此我们排除了Scipy(尽管我们也使用它!)。

另一个需要提到的是,我们同样会根据与其他科学计算库的集成效果来评估这些库,因为机器学习(有监督的或者无监督的)也是数据处理系统的一部分。如果你使用的库与数据处理系统其他的库不相配,你就要花大量时间创建不同库之间的中间层。在工具集中有个很棒的库很重要,但这个库能与其他库良好集成也同样重要。

如果你擅长其他语言,但也想使用Python包,我们也简单地描述如何与Python进行集成来使用这篇文章列出的库。

Scikit-LearnScikit Learn是我们在CB Insights选用的机器学习工具。我们用它进行分类、特征选择、特征提取和聚集。我们最爱的一点是它拥有易用的一致性API,并提供了很多开箱可用的求值、诊断和交叉验证方法(是不是听起来很熟悉?Python也提供了“电池已备(译注:指开箱可用)”的方法)。锦上添花的是它底层使用Scipy数据结构,与Python中其余使用Scipy、Numpy、Pandas和Matplotlib进行科学计算的部分适应地很好。因此,如果你想可视化分类器的性能(比如,使用精确率与反馈率(precision-recall)图表,或者接收者操作特征(Receiver Operating Characteristics,ROC)曲线),Matplotlib可以帮助进行快速可视化。考虑到花在清理和构造数据的时间,使用这个库会非常方便,因为它可以紧密集成到其他科学计算包上。

另外,它还包含有限的自然语言处理特征提取能力,以及词袋(bag of words)、tfidf(Term Frequency Inverse Document Frequency算法)、预处理(停用词/stop-words,自定义预处理,分析器)。此外,如果你想快速对小数据集(toy dataset)进行不同基准测试的话,它自带的数据集模块提供了常见和有用的数据集。你还可以根据这些数据集创建自己的小数据集,这样在将模型应用到真实世界中之前,你可以按照自己的目的来检验模型是否符合期望。对参数最优化和参数调整,它也提供了网格搜索和随机搜索。如果没有强大的社区支持,或者维护得不好,这些特性都不可能实现。我们期盼它的第一个稳定发布版。

StatsmodelsStatsmodels是另一个聚焦在统计模型上的强大的库,主要用于预测性和探索性分析。如果你想拟合线性模型、进行统计分析,或者预测性建模,那么Statsmodels非常适合。它提供的统计测试相当全面,覆盖了大部分情况的验证任务。如果你是R或者S的用户,它也提供了某些统计模型的R语法。它的模型同时也接受Numpy数组和Pandas数据帧,让中间数据结构成为过去!

PyMCPyMC是做贝叶斯曲线的工具。它包含贝叶斯模型、统计分布和模型收敛的诊断工具,也包含一些层次模型。如果想进行贝叶斯分析,你应该看看。

ShogunShogun是个聚焦在支持向量机(Support Vector Machines, SVM)上的机器学习工具箱,用C++编写。它正处于积极开发和维护中,提供了Python接口,也是文档化最好的接口。但是,相对于Scikit-learn,我们发现它的API比较难用。而且,也没提供很多开箱可用的诊断和求值算法。但是,速度是个很大的优势。

GensimGensim被定义为“人们的主题建模工具(topic modeling for humans)”。它的主页上描述,其焦点是狄利克雷划分(Latent Dirichlet Allocation, LDA)及变体。不同于其他包,它支持自然语言处理,能将NLP和其他机器学习算法更容易组合在一起。如果你的领域在NLP,并想进行聚集和基本的分类,你可以看看。目前,它们引入了Google的基于递归神经网络(Recurrent Neural Network)的文本表示法word2vec。这个库只使用Python编写。

OrangeOrange是这篇文章列举的所有库中唯一带有图形用户界面(Graphical User Interface,GUI)的。对分类、聚集和特征选择方法而言,它是相当全面的,还有些交叉验证的方法。在某些方面比Scikit-learn还要好(分类方法、一些预处理能力),但与其他科学计算系统(Numpy, Scipy, Matplotlib, Pandas)的适配上比不上Scikit-learn。但是,包含GUI是个很重要的优势。你可以可视化交叉验证的结果、模型和特征选择方法(某些功能需要安装Graphviz)。对大多数算法,Orange都有自己的数据结构,所以你需要将数据包装成Orange兼容的数据结构,这使得其学习曲线更陡。

PyMVPAPyMVPA是另一个统计学习库,API上与Scikit-learn很像。包含交叉验证和诊断工具,但是没有Scikit-learn全面。

深度学习尽管深度学习是机器学习的一个子节,我们在这里创建单独一节的原因是,它最新吸引了Google和Facebook人才招聘部门的很多注意。

TheanoTheano是最成熟的深度学习库。它提供了不错的数据结构(张量,tensor)来表示神经网络的层,对线性代数来说很高效,与Numpy的数组类似。需要注意的是,它的API可能不是很直观,用户的学习曲线会很高。有很多基于Theano的库都在利用其数据结构。它同时支持开箱可用的GPU编程。

PyLearn2还有另外一个基于Theano的库,PyLearn2,它给Theano引入了模块化和可配置性,你可以通过不同的配置文件来创建神经网络,这样尝试不同的参数会更容易。可以说,如果分离神经网络的参数和属性到配置文件,它的模块化能力更强大。

DecafDecaf是最近由UC Berkeley发布的深度学习库,在Imagenet分类挑战中测试发现,其神经网络实现是很先进的(state of art)。

Nolearn如果你想在深度学习中也能使用优秀的Scikit-learn库API,封装了Decaf的Nolearn会让你能够更轻松地使用它。它是对Decaf的包装,与Scikit-learn兼容(大部分),使得Decaf更不可思议。

OverFeatOverFeat是最近猫vs.狗(kaggle挑战)的胜利者,它使用C++编写,也包含一个Python包装器(还有Matlab和Lua)。通过Torch库使用GPU,所以速度很快。也赢得了ImageNet分类的检测和本地化挑战。如果你的领域是计算机视觉,你可能需要看看。

HebelHebel是另一个带有GPU支持的神经网络库,开箱可用。你可以通过YAML文件(与Pylearn2类似)决定神经网络的属性,提供了将神级网络和代码友好分离的方式,可以快速地运行模型。由于开发不久,就深度和广度上说,文档很匮乏。就神经网络模型来说,也是有局限的,因为只支持一种神经网络模型(正向反馈,feed-forward)。但是,它是用纯Python编写,将会是很友好的库,因为包含很多实用函数,比如调度器和监视器,其他库中我们并没有发现这些功能。

NeurolabNeuroLab是另一个API友好(与Matlabapi类似)的神经网络库。与其他库不同,它包含递归神经网络(Recurrent Neural Network,RNN)实现的不同变体。如果你想使用RNN,这个库是同类API中最好的选择之一。

与其他语言集成你不了解Python但是很擅长其他语言?不要绝望!Python(还有其他)的一个强项就是它是一个完美的胶水语言,你可以使用自己常用的编程语言,通过Python来访问这些库。以下适合各种编程语言的包可以用于将其他语言与Python组合到一起:R ->RPythonMatlab ->matpythonJava ->JythonLua ->Lunatic PythonJulia ->PyCall.jl

不活跃的库这些库超过一年没有发布任何更新,我们列出是因为你有可能会有用,但是这些库不太可能会进行BUG修复,特别是未来进行增强。MDPMlPyFFnetPyBrain如果我们遗漏了你最爱的Python机器学习包,通过评论让我们知道。我们很乐意将其添加到文章中。

Java PK Python

Java是一种面向对象语言,具有许多程序员熟悉的类似于C / C ++的语法。其吸引力和价值所在是其具有的可移植性和相对效率。Java作为一种编译语言,执行模式与解释性语言(比如Python和Perl)相比更加以机器为中心。Java不仅仅是一种语言和库:它也是一个虚拟机,一个生态系统。Java虚拟机(JVM)是运行Java代码的理想化和便携式平台。程序员不必担心硬件细节,并且不必将代码移植到新平台,Java承诺“一次写入,到处编译(WORA)”。同时,JVM语言有很多,比如Groovy、Clojure、Scala、Python或者Jython。

Python起源于一种脚本语言,它的语法体现了一种可读性的理念,具有简单而规则的界限,鼓励简洁和一致的代码布局。Python的参考实现(以C编写,被称为CPython)在许多平台上可用,并且是众多实现中最常用的。Python的动态类型有助于代码简化和组合,是许多平台的解释性语言,成为众多程序员编程首选的便携式选项。Python是围绕可扩展对象模型构建的通用语言。其面向对象的核心并不意味着对象定向是开发人员在用Python编程时最常用的方式。它支持程序化编程,模块化编程和部分函数式编程。

Java PK Python之一:速度

在网络I / O成本或数据库访问占主导地位的情况下,语言的具体效率不如技术选择和设计方面的整体效率重要。Java和Python都不适合高性能计算,但在性能上,Java还是略胜一筹。虽然一些Python实现(如PyPy)可以针对性能进行微调,但原始的便携式性能Python不占优势。

Java的效率优势体现在虚拟机执行。程序执行时,JVM可以将字节码转换为本地机器码。这种即时(JIT)编译让Java的性能略胜Python。Java从其第一个公开版本起就支持并发,而Python则是按序执行。在当前多核处理的趋势下,Java代码更易实现。

Java PK Python之二:实用敏捷性

漫长的发展中,Java和Python都受益匪浅。Java通常被认为与敏捷开发及其社区有更密切的联系。Python在敏捷领域一直存在,并且受到诸多原因的影响而更加普及,包括DevOps运动的兴起。

Java比Python具备更一致的重构支持,一方面,它的静态类型使自动化重构更可预测和可靠,另一方面是Java开发中IDE(例如IntelliJ,Eclipse和NetBeans)的普及。Python的动态类型在代码中鼓励使用不同类型的敏捷性,其重点在于简洁和流动。然而,Pythonic文化倾向于多种编辑器,而不是基于IDE,这意味着对强自动重构的支持较低。

JUnit的早期知名度及其与测试驱动开发(TDD)的关联意味着,在所有语言中,Java可能是唯一一个单元测试受到程序员一致欢迎的语言。在IDE中自动包含JUnit已经在很大程度上对此有所帮助了。

Python的脚本起源和在其标准库中包含测试功能意味着Python对现代开发中自动化测试相当重视,尽管它更有可能是集成而不是单元测试。在Java世界中,传统Java代码库可以通过采用另一种JVM语言来加以改善,例如使用Groovy或Clojure进行自动化测试,或者完全跨越Java Universe,例如使用Python来处理系统方面操作 。

Java PK Python之三:架构

围绕Python Web框架构思的软件体系架构与Java的不会相差甚远。Java和Python都有各自的开源社区,并有很多程序员一直在源源不断的贡献源代码,这些代码已经解决了常见或者不常见的问题,事实上,这两种语言都因开源社区而受益匪浅。

Java PK Python之四:历史遗留问题

历史遗留问题在其技术上具有惯性。当企业选择了一种编程语言,就很难再次更换。例如,更多的企业项目后端可能会使用Java代码来扩展其功能,也许可以迁移到更新版本的语言,或者通过其他JVM语言(如Scala和Groovy)添加新功能。Java在企业中的历史比Python更久,这也是招聘Java程序员的企业比招Python更多的原因。

Java PK Python之五:市场普及度

Java和Python都是TIOBE编程语言排行榜上的前十名,并且是稳稳地占据前十名。 但Java一直比Python更受欢迎,但是Python的受欢迎程度已经超过了两种编程语言:Perl和Ruby。

此外,两种语言在教育中都具有强大的立足点,但Java比Python更常用于大学课程中。

结论

Java和Python都是富有活力的编程语言,这两种语言与开放性相关联,所以公司,团队和程序员在做出决定时最好保持开放的态度。