如果能基于“自己动手,丰衣足食”的原则,自行实现机器学习的各种经典算法,固然是好的,且好处很明显:能让自己对机器学习算法的细节了然于胸。
但即使我们使用了简单而高效的 Python 来编写代码,实现起来,代码量依然不容小觑。何况我们写的代码可能并不专业,对很多意外情况可能考虑不足(如数值计算不够稳定等),算法的性能难以保证。
这时,我们可能会有这样的需求:是否有成熟的机器学习框架,能让我们更加关注算法的业务逻辑,而不必事无巨细地“重造轮子”呢?比如,求方差、求均方根误差这类通用函数可否不必自己编写?
《荀子·劝学》中有一句名言:君子生非异也,善假于物也。意思是说,君子的资质与一般人没有什么区别,君子之所以高人一等,是因为他善于利用外物。因此,善于利用已有条件,是成为君子的一个重要途径。
上面的断言,对于机器学习而言同样适用。只有分工,才能专业。它山之石,可以攻玉。善于利用第三方工具,提高自己的开发效率,或许也是算法工程师的必备技能之一。
事实上,对于一些经典的机器学习算法,一些专家或工程达人们早已将其实现。大概率上,由他们实现的算法,在各种条件下的完备性及数值计算的稳定性都要远胜我们自己实现的算法。在机器学习领域,scikit-learn(以下简称 sklearn)就是由专业人士开发的、久经考验的机器学习框架,其标识如图 1 所示。
图 1:scikit-learn 的标识
sklearn简介
2007年,数据科学家大卫·库尔纳佩(David Cournapeau)等人发起了机器学习的开源项目 sklearn,至今已逾十载。到目前为止,它已成为一款非常成熟的知名机器学习框架。
sklearn 是一款开源的 Python 机器学习库,它基于 NumPy 和 SciPy,提供了大量用于数据挖掘和分析的工具,以及支持多种算法的一系列接口。和其他开源项目类似,sklearn 也是由社区成员自发组织和维护的。与其他开源项目不同的是,sklearn 更显“保守”。但这里的“保守”并非贬义,而是意味着“可靠”。
sklearn 的可靠性主要体现在两个方面:sklearn 非常专一,从不做机器学习领域之外的扩展;sklearn 非常务实,从不轻易支持未经广泛验证的机器学习算法。比如,当下比较火热的“深度学习”,愣是不在它法眼之内,它想“让子弹飞一会”。一定程度上的“保守”并非坏事,这会使 sklearn 因专注而更加专业。
作为一款“成熟稳重”的机器学习框架,sklearn 提供了很多好用的 API(Application Programming Interface,应用程序接口)。通常,我们使用寥寥几行代码,就可以很好地完成机器学习的 7 个流程,具体如下。
1) 数据处理
从磁盘中读取数据,并对数据进行预处理,如归一化、标准化、正则化、属性缩放、特征编码、插补缺失值、生成多项式特征等。
2) 分割数据
将数据随机分割成三组:训练集、验证集(有时为可选项)、测试集。
3) 训练模型
针对选取好的特征,使用训练数据来构建模型,即拟合数据,寻找最优的模型参数。这里的拟合数据,主要是指使用各种机器学习算法来学习数据中的特征,拟合出损失函数最小化参数。
4) 验证模型
使用验证集的数据接入模型。我们将模型在验证集上的表现作为模型参数优化和选择的依据。常用的方法有 Holdout 验证、留一验证(leave-one-out cross-validation)等。
5) 测试模型
在优化模型的参数以后,使用测试数据验证模型的表现,可以评估模型的泛化性能。
这里需要展开说明的是,在有些场景下,测试模型和验证模型是有区别的。如果我们不设置验证集,而不断地使用相同的测试集来评估模型性能,久而久之,作为“裁判”的测试集,其角色慢慢就会“蜕变”成训练集,从而让模型陷入过拟合状态。
为了解决这个问题,有时就把数据集一分为三:一部分用于训练,即作为训练集;一部分用于模型优化,即作为验证集;最后一部分用来评估模型的泛化误差,即作为测试集,通常不参与模型的优化。
6) 使用模型
正所谓“养兵千日,用兵一时”。模型训练完毕后,就该“上战场”了,在全新数据集上进行预测。所有机器学习算法的终极价值,都体现在对新数据的预测上。过往的历史数据(即训练数据)的价值,就在于“喂养”出一个靠谱的数据预言家,对我们从未接触过的新数据做出预测,从而指导我们未来的行为方向,实现基于数据的“洞察”。
7) 调优模型
当我们不断使用更多的数据(包括预测的新数据)时,就会得到反馈,然后根据反馈重新调整数据使用策略,包括收集更为全面的数据、使用不同的特征、调整过往模型参数等,以此来迭代优化模型。实际上,以上 1~7 可以算作一个无限循环、迭代升级的过程。
https://docs.qq.com/pdf/DR1doYmNBYUZ3RVNX
你可以思考一下,为何诸如今日头条、京东、淘宝等应用会不断地迭代升级,不光是为了软件缺陷的修复,App 界面的优化,更多的可能还是对深嵌其内的模型算法进行迭代升级。
sklearn的功能
sklearn 的功能主要分为六大部分:分类、回归、聚类、数据降维、模型选择和数据预处理。
简单来说,如果定性输出预测(预测变量是离散值),可称之为分类(classification),比如预测花的品类、顾客是否购买商品等。sklearn 中已实现的经典分类算法包括:支持向量机(SVM)、最近邻算法、Logisti c回归、随机森林、决策树,以及多层感知器(Multilayer Perceptron,MLP)等。
相比而言,如果定量输出预测(预测变量是连续值),则称之为回归(regression),比如预测花的长势、房价的涨势等。目前 sklearn 中已经实现的回归算法包括:线性回归、支持向量回归(SVR)、岭回归、Lasso 回归、贝叶斯回归等。常见的应用场景有股价预测等。
聚类(clustering)的功能是将相似的对象自动分组。sklearn 中常用的聚类算法包括:k 均值聚类、谱聚类(spectral clustering)、均值漂移(Mean shift)等。常见的应用场景有客户细分、实验结果分组及数据压缩等。
数据降维(dimension reduction)的目的在于,减少要考虑的随机变量的数量。sklearn中常见的数据降维算法有主成分分析(Principal Components Analysis,PCA)、特征选择(feature selection)、非负矩阵分解(non-negative matrix factorization)等。常见的应用场景包括数据压缩、模型优化等。
模型选择是指评估与验证模型,对模型参数进行选择与平衡。sklearn 提供了很多有用的模块,可实现许多常见功能,包括模型度量(metrics)、网格搜索(grid search)、交叉验证(cross validation)等。其目的在于,通过调整模型参数来提高模型性能(预测准确度、泛化误差等)。
数据预处理的功能在于,把输入数据(如文本、图形图像等)转换为机器学习算法适用的数据,主要包括数据特征的提取和归一化。在 sklearn 中,常用的模块有数据预处理(preprocessing)、特征抽取(feature extraction)等。
sklearn 不仅功能强大,而且官方文档还很齐全,它针对每种算法都提供了简明扼要的参考用例,实在是机器学习爱好者应该常去的“游览胜地”。