当前位置: 首页 > 科技观察

一个开源机器学习框架初学者入门,Scikit那些事儿-learn

时间:2023-03-12 00:56:57 科技观察

对Python语言有所了解的研究人员可能知道SciPy——一个开源的基于Python的科学计算工具包。基于SciPy,开发者针对不同的应用领域开发了大量的分支版本。它们统称为Scikits,意思是SciPy工具包。在这些分支版本中,最著名的也是专门用于机器学习的版本是Scikit-learn。Scikit-learn项目最早由数据科学家D**idCournapeau于2007年发起,需要NumPy、SciPy等其他包的支持。它是一个专门为Python语言的机器学习应用而开发的开源框架。与许多其他开源项目一样,Scikit-learn目前主要由社区成员维护。或许是受维护成本的限制,Scikit-learn相比其他项目更加保守。这主要体现在两个方面:一是Scikit-learn从不扩展到机器学习领域之外,二是Scikit-learn从不使用未经广泛验证的算法。本文将简要介绍Scikit-learn框架的六大功能,安装运行Scikit-learn的大致步骤,为后续更深入的学习Scikit-learn提供参考。原文来自infoworld网站特约撰稿人MartinHeller。从1986年到2010年,做了20多年的数据库、通用软件和web开发,有丰富的开发经验。Scikit-learn的六大功能Scikit-learn的基本功能主要分为分类、回归、聚类、数据降维、模型选择和数据预处理六个部分。分类是指识别给定对象的类别,属于监督学习的类别。最常见的应用场景包括垃圾邮件检测和图像识别。Scikit-learn目前实现的算法包括:支持向量机(SVM)、最近邻、逻辑回归、随机森林、决策树和多层感知器(MLP)神经网络等。需要指出的是,由于Scikit-learn本身不支持深度学习或GPU加速,这里实现MLP不适合处理大规模问题。有相关需求的读者可以看看Keras、Theano等对Python也有很好支持的框架。回归是指预测与给定对象关联的连续值属性。最常见的应用场景包括预测药物反应和预测股票价格。Scikit-learn目前实现的算法包括:支持向量回归(SVR)、岭回归、Lasso回归、弹性网(ElasticNet)、最小角回归(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假定所有支持包的完整安装,那么你只需要一个简单的pip命令就可以安装Scikit-learn(你也可以使用conda命令,详见官方文档):$sudopipinstall-Uscikit-learn在这里添加sudo可以避免安装过程中出现一些权限问题,如果用户已确保管理员权限,也可以省略。当然,开发者也可以选择从GitHub开源平台下载Scikit-learn的源码,解压后在根目录下键入make,自行编译链接可执行文件。效果是一样的。另外,为了保证测试的方便,高级用户还可以选择安装Python的测试框架nose。安装方法请参考其官方说明:http://nose.readthedocs.io/en/latest/。通过JupyterNotebook工具运行Scikit-learn示例的过程也非常简单。用户只需从官方示例库中选择:http://scikit-learn.org/stable/auto_examples/index.html#general-examples一个示例,然后在页面下载其Python源码和IPythonnotebook文件,并通过JupyterNotebook工具运行它。如果选择交叉验证预测的样本,其运行截图如下所示。原作者在此声明,Scikit-learn是他测试过的最简单易用的机器学习框架。他表示,Scikit-learn样本运行结果与文档描述完全一致,API接口设计合理,一致性高,几乎没有“阻抗失配”数据结构,使用这个开源完整功能齐全且几乎没有bug的机器学习框架研究无疑是一件值得高兴的事情。进一步了解Scikit-learn如前所述,Scikit-learn为每个算法和模块提供了丰富的参考示例和详细文档。据官方统计,有200多个。并且为了清楚起见,大多数示例至少给出了一张由Matplotlib绘制的数据图表。这些是官方提供的学习Scikit-learn框架最直接有效的学习资料。对于科学数据处理的应用场景,官方也给出了更加详细全面的参考教程:Atutorialonstatistical-learningforscientificdataprocessing,包括统计学习、监督学习、模型选择和非监督学习等部分,附全面覆盖,详细解释,并使用真实数据、代码和图表。此外,教程中还调用了与文本相关的示例,例如下图所示的四种不同SVM分类器的比较。这里需要指出的是,虽然运行Scikit-learn官方给出的例子通常可以得到一致的结果,但大多数情况下系统会抛出警告信息。笔者认为,出现警告信息的原因来自两方面:一是苹果的vecLib框架本身对Scikit-learn的支持不够好(笔者使用的是MacOS),二是样本中使用的Python版本可能是较早的版本,而实际运行中是最新的版本。比如下图是Python2.7.10抛出的警告信息,但是在Scikit-learn官方页面上并没有出现。总的来说,作为专门针对机器学习的Python开源框架,Scikit-learn在一定范围内可以为开发者提供很好的帮助。内部实现了多种成熟算法,安装使用方便,示例丰富,教程和文档也很详细。另一方面,Scikit-learn也有缺点。例如,它不支持深度学习和强化学习这些当今应用非常广泛的技术,例如准确的图像分类和可靠的实时语音识别和语义理解。另外不支持图形模型和序列预测,不支持Python以外的语言,不支持PyPy,不支持GPU加速。看到这里,可能有人会担心Scikit-learn的性能。这里需要指出的是,如果不考虑多层神经网络的相关应用,Scikit-learn的性能是非常不错的。究其原因,一方面是其内部算法的实现非常高效,另一方面也可能归功于Cython编译器:Scikit-learn消除了大部分性能瓶颈。需要明确的是:虽然Scikit-learn在一般情况下并不适用于深度学习问题,但对于一些特殊场景,使用Scikit-learn仍然是一个明智的选择。例如,当你想创建一个连接不同对象的预测函数时,或者当你在未标记的数据集中对不同对象进行分类以训练模型时,Scikit-learn可以使用普通的旧机器学习模型很好地处理这些场景,而无需需要构建具有数十层的复杂神经网络。就像喜欢Scala的人选择SparkML,喜欢画图偶尔写少量Python/R代码的人选择MicrosoftCortana和Azure,对于那些Python的铁杆粉丝来说,Scikit-learn可能是其中最好的选择各种机器学习库。