1.1 scikit-learn模块库
scikit-learn,简称sklearn,是用Python开发的机器学习模块库,其中包含大量机器学习算法、数据集。
scikit-learn模块库优点很多:简单易用、API接口完善、案例文档丰富等。内置大量经过筛选的、高质量的机器学习模型;模块库覆盖了大多数机器学习任务;系统可扩展至较大的数据规模。
在scikit-learn.org网站首页抬头,scikit-learn官方自我总结的优点如下。
· 简单高效的数据挖掘和数据分析工具。
· 可在各种环境中重复使用。
· 建立在NumPy、SciPy和Matplotlib上。
· 开放源码,可免费商业使用BSD license。
scikit-learn模块库是老牌的开源Python机器学习算法框架,源于2007年谷歌公司的Google Summer of Code项目,最早由数据科学家David Cournapeau发起,是Python语言中专门针对机器学习应用而发展起来的一款开源框架。
scikit-learn模块库是一个简洁、高效的算法库,提供一系列的监督学习和无监督学习的算法,以用于数据挖掘和数据分析。scikit-learn几乎覆盖了机器学习的所有主流算法,这为其在Python开源世界中奠定了江湖地位。
scikit-learn的算法库是建立在SciPy(Scientific Python)之上的,这也是其命名的由来。
SciPy模块库是Python语言的基础科学计算工具包,基于SciPy,目前开发者们针对不同的应用领域,已经发展出了众多的分支版本,SciPy的扩展和模块在传统上被命名为Scikits,即SciPy工具包的意思。
和其他众多的开源项目一样,scikit-learn目前主要由社区成员自发维护。可能是由于维护成本的限制,scikit-learn相比其他项目要显得更为保守。
这种保守主要体现在两个方面。
· scikit-learn从来不做除机器学习领域之外的其他扩展。
· scikit-learn从来不采用未经广泛验证的算法。
1.1.1 scikit-learn的缺点
虽然scikit-learn模块库功能强大,目前已经是机器学习最重要的模块库,但是,scikit-learn也有缺点。
scikit-learn模块库的缺点主要包括以下几个方面。
· 不支持深度学习和强化学习。
· 不支持PyPy加速,也不支持GPU加速。
· 不支持除Python之外的其他编程语言。
这些缺点主要是由历史原因造成的,scikit-learn毕竟是2007年的作品,已经有超过十年的历史,其整体架构不适用于目前的GPU编程、神经网络和深度学习。不过这些缺点都不是大问题。
在深度学习、神经网络领域,目前有众多的优秀平台:TensorFlow、MXNet、CNTK、PyTorch等,scikit-learn模块库与这些平台配合,主要用于数据预处理和结果验证。
GPU加速和PyPy优化属于Python底层优化,特别是NumPy基础科学计算库的优化,目前基于GPU的优化版本已经不断涌现,其中MXNet、PyTorch底层模块库,都是基于NumPy的GPU优化版本。
从工程角度而言,scikit-learn的性能表现是非常不错的。
究其原因,一方面是因为其内部算法的实现十分高效,另一方面或许可以归功于Cython编译器:通过Cython在scikit-learn框架内部生成C语言代码的运行方式,scikit-learn消除了大部分的性能瓶颈。
至于最后一个缺点,scikit-learn模块库不支持除Python之外的其他编程语言。这更加不是问题,目前Python已经是人工智能、机器学习领域的标准编程语言,强如Facebook,坚持多年,最终还是把Lua语言开发的Torch项目,全部采用Python改写,并重新命名为PyTorch项目。
1.1.2 scikit-learn算法模块
为了方便学习,scikit-learn开发团队还提供了一个scikit-learn算法模块图,如图1.2所示。
图1.2 scikit-learn算法模块图
图1.3是scikit-learn算法模块图的汉化版本。
scikit-learn模块库实现了一整套用于数据降维、模型选择、特征提取和归一化的完整算法和模块,并且针对每个算法和模块,底层都进行了高度优化以提升速度,与此同时,模块库提供了丰富的参考案例和详细的说明文档。
这些案例程序,内容覆盖全面,讲解细致,并且很多案例都使用了真实的数据,绝大多数案例还配有Matplotlib绘制的数据图表。
图1.3 scikit-learn算法模块图汉化版
据官方的统计,scikit-learn模块库共提供了200多个参考案例程序,包括统计学习、监督学习、模型选择和无监督学习等若干部分。
1.1.3 scikit-learn六大功能
scikit-learn机器学习模块库,功能强大,模块繁多。模块库的主要功能包括以下六大类别:分类、回归、聚类、数据降维、模型选择和数据预处理。
需要说明的是,随着近年神经网络、深度学习的崛起,scikit-learn机器学习模块库在最新版本的模型库中增加了MLP多层感知器等最基本的神经网络模型。
不过,scikit-learn本身不支持深度学习,也不支持GPU加速,因此其内置的MLP等模型仅用于教学和小规模数据应用。
图1.4是scikit-learn模块功能图,也是scikit-learn网站首页截图,图1.5是scikit-learn模块功能图的汉化版本。
图1.4 scikit-learn模块功能图
图1.5 scikit-learn模块功能图汉化版
1.分类
分类是指识别某个对象属于哪个类别,属于监督学习的范畴,最常见的应用场景包括垃圾邮件检测和图像识别等。
目前scikit-learn已经实现的分类算法包括:SVM(支持向量机)、Nearest Neighbors(最近邻)、逻辑回归、Random Forest(随机森林)、决策树,以及多层感知器、MLP神经网络等。
2.回归
回归是指预测与对象相关联的连续值属性,最常见的应用场景包括预测药物反应和股票价格等。
目前scikit-learn已经实现的回归算法包括:SVR(支持向量回归)、Ridge Regression(脊回归)、Lasso回归、Elastic Net(弹性网络)、LARS(最小角回归)、贝叶斯回归,以及各种不同的鲁棒回归算法等。
可以看到,scikit-learn内置的回归算法几乎涵盖了所有开发者的需求,而且更重要的是,scikit-learn针对每种算法都进行了底层优化加速,并且提供了简单明了的参考案例。
3.聚类
聚类是指将相似对象自动分组,也就是自动识别具有相似属性的给定对象,并将其分组为集合,属于无监督学习的范畴,最常见的应用场景包括顾客细分和试验结果分组。
目前scikit-learn已经实现的聚类算法包括:k-Means聚类、Spectral Clustering(谱聚类)、Mean-shift(均值偏移)、分层聚类、DBSCAN聚类等。
4.降维
数据降维是指减少要考虑的随机变量的个数,其主要应用场景包括可视化处理和效率提升。
目前scikit-learn已经实现的降维算法包括:PCA(主成分分析)、NMF(非负矩阵分解)、Feature Selection(特征选择)等降维技术。
5.模型选择
模型选择是指比较、验证、选择参数和模型。对于给定参数和模型进行比较、验证和选择,其主要目的是通过参数调整来提升精度。
目前scikit-learn实现的模型选择算法包括:Grid Search(网格搜索)、Cross Validation(交叉验证)和各种针对预测误差评估的Metrics(度量)函数。
6.预处理
数据预处理是指数据的特征提取和归一化,是机器学习过程中的第一个环节,也是最重要的一个环节。
这里归一化是指将输入数据转换为具有零均值和单位权方差的新变量,但因为大多数时候都做不到精确等于零,因此会设置一个可接受的范围,一般都要求落在0~1之间。而特征提取是指将文本或图像数据转换为可用于机器学习的数字变量。
需要注意的是,数据预处理环节的特征提取与数据降维中提到的特征选择完全不同。
这里的特征选择是指通过去除不变、协变或其他统计上不重要的特征量,来改进机器学习的一种方法。
目前scikit-learn实现的预处理算法包括预处理和特征提取。