Python粉都应该知道的开源机器学习框架:Scikit-learn入门指南

对Python语言有所了解的科研人员可能都知道SciPy——一个开源的基于Python的科学计算工具包。基于SciPy,目前开发者们针对不一样的应用领域已经发展出了为数众多的分支版本,它们被统一称为Scikits,即SciPy工具包的意思。而在这些分支版本中,最有名,也是专门面向机器学习的一个就是Scikit-learn。html

Scikit-learn项目最先由数据科学家 David Cournapeau 在 2007 年发起,须要NumPy和SciPy等其余包的支持,是Python语言中专门针对机器学习应用而发展起来的一款开源框架。python

和其余众多的开源项目同样,Scikit-learn目前主要由社区成员自发进行维护。多是因为维护成本的限制,Scikit-learn相比其余项目要显得更为保守。这主要体如今两个方面:一是Scikit-learn历来不作除机器学习领域以外的其余扩展,二是Scikit-learn历来不采用未经普遍验证的算法。算法

本文将简单介绍Scikit-learn框架的六大功能,安装和运行Scikit-learn的大概步骤,同时为后续各更深刻地学习Scikit-learn提供参考。原文来自infoworld网站的特约撰稿人Martin Heller,他曾在1986-2010年间作过长达20多年的数据库、通用软件和网页开发,具备丰富的开发经验。数据库

Scikit-learn的六大功能

Scikit-learn的基本功能主要被分为六大部分:分类,回归,聚类,数据降维,模型选择和数据预处理。网络

分类是指识别给定对象的所属类别,属于监督学习的范畴,最多见的应用场景包括垃圾邮件检测和图像识别等。目前Scikit-learn已经实现的算法包括:支持向量机(SVM),最近邻,逻辑回归,随机森林,决策树以及多层感知器(MLP)神经网络等等。数据结构

须要指出的是,因为Scikit-learn自己不支持深度学习,也不支持GPU加速,所以这里对于MLP的实现并不适合于处理大规模问题。有相关需求的读者能够查看一样对Python有良好支持的Keras和Theano等框架。框架

回归是指预测与给定对象相关联的连续值属性,最多见的应用场景包括预测药物反应和预测股票价格等。目前Scikit-learn已经实现的算法包括:支持向量回归(SVR),脊回归,Lasso回归,弹性网络(Elastic Net),最小角回归(LARS ),贝叶斯回归,以及各类不一样的鲁棒回归算法等。能够看到,这里实现的回归算法几乎涵盖了全部开发者的需求范围,并且更重要的是,Scikit-learn还针对每种算法都提供了简单明了的用例参考。机器学习

聚类是指自动识别具备类似属性的给定对象,并将其分组为集合,属于无监督学习的范畴,最多见的应用场景包括顾客细分和试验结果分组。目前Scikit-learn已经实现的算法包括:K-均值聚类,谱聚类,均值偏移,分层聚类,DBSCAN聚类等。函数

数据降维是指使用主成分分析(PCA)、非负矩阵分解(NMF)或特征选择等降维技术来减小要考虑的随机变量的个数,其主要应用场景包括可视化处理和效率提高。工具

模型选择是指对于给定参数和模型的比较、验证和选择,其主要目的是经过参数调整来提高精度。目前Scikit-learn实现的模块包括:格点搜索,交叉验证和各类针对预测偏差评估的度量函数。

数据预处理是指数据的特征提取和归一化,是机器学习过程当中的第一个也是最重要的一个环节。这里归一化是指将输入数据转换为具备零均值和单位权方差的新变量,但由于大多数时候都作不到精确等于零,所以会设置一个可接受的范围,通常都要求落在0-1之间。而特征提取是指将文本或图像数据转换为可用于机器学习的数字变量。

须要特别注意的是,这里的特征提取与上文在数据降维中提到的特征选择很是不一样。特征选择是指经过去除不变、协变或其余统计上不重要的特征量来改进机器学习的一种方法。

总结来讲,Scikit-learn实现了一整套用于数据降维,模型选择,特征提取和归一化的完整算法/模块,虽然缺乏按步骤操做的参考教程,但Scikit-learn针对每一个算法和模块都提供了丰富的参考样例和详细的说明文档。

安装和运行Scikit-learn

如前所述,Scikit-learn须要NumPy和SciPy等其余包的支持,所以在安装Scikit-learn以前须要提早安装一些支持包,具体列表和教程能够查看Scikit-learn的官方文档: http://scikit-learn.org/stable/install.html ,如下仅列出Python、NumPy和SciPy等三个必备包的安装说明。

Python:https://www.python.org/about/gettingstarted/

NumPy:http://www.numpy.org/

SciPy:http://www.scipy.org/install.html

假定已经完整安装了全部支持包,那么利用安装Scikit-learn只须要简单的一条简单的pip命令(也能够用conda命令,详见官方文档):

$ sudo pip install -U scikit-learn

这里加上sudo是为了不安装过程当中出现一些权限问题,若是用户已经确保了管理员权限也能够省略。

固然,开发者也能够选择本身到GitHub开源平台上下载Scikit-learn的源代码,解压后在根目录键入make自行编译和链接可执行文件,效果是同样的。另外,为了确保测试方便,高级用户还能够选择安装针对Python的测试框架nose,安装方法详见其官方说明: http://nose.readthedocs.io/en/latest/  。

经过Jupyter Notebook工具运行Scikit-learn样例的过程也很简单,用户只须要在官方给出的样例库: http://scikit-learn.org/stable/auto_examples/index.html#general-examples  选择一个样例,而后在页面中下载其Python源码和IPython notebook文件,借着经过Jupyter Notebook工具运行就能够了。假如选择了交叉验证预测的样例,那么其运行状况的截图以下所示。

Python粉都应该知道的开源机器学习框架:Scikit-learn入门指南

原做者在这里表示,Scikit-learn是他测试过的最简单易用的机器学习框架。他表示,Scikit-learn样例的运行结果和文档描述如出一辙,API接口的设计合理且一致性高,并且几乎不存在“阻抗不匹配”的数据结构,使用这种功能完善且几乎没有Bug的开源框架进行机器学习研究,无疑是一件值得高兴的事。

更深刻地学习Scikit-learn

如前所述,Scikit-learn针对每一个算法和模块都提供了丰富的参考样例和详细的说明文档,据官方的统计大约有200多个。并且为了清晰明白,绝大多数样例都至少给出了一张由Matplotlib绘制的数据图表。这些都是官方提供的学习Scikit-learn框架最直接有效的学习材料。

针对科学数据处理的应用场景,官方还给出了一个更为详细和全面的参考教程:A tutorial on statistical-learning for scientific data processing,其中包括统计学习、监督学习、模型选择和无监督学习等若干部分,内容覆盖全面,讲解细致,而且使用了真实的数据、代码和图表。

另外,教程中还调用了与文本相关的样例,例以下图所示的四个不一样SVM分类器的比较。

Python粉都应该知道的开源机器学习框架:Scikit-learn入门指南

这里须要指出的是,虽然运行Scikit-learn官方给出的样例后一般都能获得一致的结果,但大多数状况下系统都会抛出警告信息。做者认为抛出警告信息的缘由来自两个方面:一是苹果vecLib框架自己对Scikit-learn支持很差(做者用的是MacOS),二是样例中使用的Python版本多是早期的版本,而实际运行中是最新的版本。例以下图中是使用Python 2.7.10版本抛出的警告信息,而Scikit-learn官方页面上并无出现。

Python粉都应该知道的开源机器学习框架:Scikit-learn入门指南

整体上来讲,做为专门面向机器学习的Python开源框架,Scikit-learn能够在必定范围内为开发者提供很是好的帮助。它内部实现了各类各样成熟的算法,容易安装和使用,样例丰富,并且教程和文档也很是详细。

另外一方面,Scikit-learn也有缺点。例如它不支持深度学习和强化学习,这在今天已是应用很是普遍的技术,例如准确的图像分类和可靠的实时语音识别和语义理解等。此外,它也不支持图模型和序列预测,不支持Python以外的语言,不支持PyPy,也不支持GPU加速。

看到这里可能会有人担忧Scikit-learn的性能表现,这里须要指出的是:若是不考虑多层神经网络的相关应用,Scikit-learn的性能表现是很是不错的。究其缘由,一方面是由于其内部算法的实现十分高效,另外一方面或许能够归功于Cython编译器:经过Cython在Scikit-learn框架内部生成C语言代码的运行方式,Scikit-learn消除了大部分的性能瓶颈。

应该明确的一点是:虽然归纳地说Scikit-learn并不适合深度学习问题,但对于某些特殊场景而言,使用Scikit-learn仍然是明智的选择。例如要建立链接不一样对象的预测函数时,或者在未标记的数据集中为了训练模型对不一样的对象进行分类时,面对这些场景Scikit-learn只经过普通的旧机器学习模型就能很好地解决,而并不须要创建数十层的复杂神经网络。

就好像喜欢Scala语言的人会选择Spark ML,喜欢绘制图表和偶尔编写少许Python/R语言代码的人会选择微软Cortana和Azure同样,对于那些Python语言的死忠粉而言,Scikit-learn多是各类机器学习库中的最好选择。

相关文章
相关标签/搜索