[火炉炼 AI]机器学习 028 五分钟教你打造机器学习流水线
(本文所使用的 Python 库和版本号: Python 3.6, Numpy 1.14, scikitlearn 0.19, matplotlib 2.2 )
现在的社会工业化大生产离不开流水线作业, 有了流水线, 我们可以轻松的制造出成千上万相同的产品, 而且所需要的价格成本极大地下降, 所以说, 流水线操作, 使得工业化生产水平极大的提高.
那么有没有可能将这种流水线的处理思想转移到机器学习领域了 我们可不可以将数据清洗 数据规整 数据处理 特征选择 监督学习 模型评估等一整套流程做成一条机器学习的流水线了 如果可以, 那就能极大的节省我们打造一个 AI 模型的时间, 极大的提高构建优秀 AI 的效率.
在此,[火炉炼 AI]可以十分肯定的告诉你, 这是可以的, 而且打造这种机器学习流水线非常方便, 只需要短短的五分钟即可.
1. 流水线第一步: 准备数据集
数据集在本项目中反而不是很重要, 故而我们用 sklearn 自带模块 samplesgenerator 生成一些示例数据即可. 虽然 numpy 也在 random 模块中有随机产生数据集的函数, 但是 numpy 比较适合用于产生一些简单的抽样数据. 而 sklearn 中的 datasets 类却可以用来产生适合机器学习模型的数据集.
sklearn 的 datasets 中常用的 API 有:
用 makeregression 生成回归模型的数据
用 makehastie102,makeclassification 或者 makemultilabelclassification 生成分类模型数据
用 makeblobs 生成聚类模型数据
用 makegaussianquantiles 生成分组多维正态分布的数据
- # 准备数据集
- from sklearn.datasets import samplesgenerator
- # 使用这个函数产生示例数据
- X,y=samplesgenerator.makeclassification(ninformative=4,
- nfeatures=20,
- nredundant=0,
- randomstate=5)
- # 产生一个分类数据集, 包含有 100 个样本, 20 个 features,2 个类别, 没有冗余特征.
- # print(X.shape) # (100, 20)
- # print(y.shape) # (100,)
- # print(X[:3]) # 查看没有问题
复制代码
2. 流水线第二步: 构建特征选择器
在数据集准备完成之后, 需要提取数据集中最重要的几个特征, 即对我们的分类结果影响最大的几个主要特征, 这样做可以减小模型的复杂程度, 同时还能保持模型的预测精准度. sklearn 框架也为我们准备好了特征选择函数 SelectKBest(), 我们只需要指定要选择的特征数 K 即可. 如下为代码, 非常简单.
- # 建立特征选择器
- from sklearn.featureselection import SelectKBest, fregression
- featureselector=SelectKBest(fregression,k=10)
- # 一共 20 个特征向量, 我们从中选择最重要的 10 个特征向量
复制代码
3. 流水线第三步: 构建分类器
下一步, 我们就需要构建分类器模型, 前面在我的文章中讲到了很多分类器算法, 比如 SVM, 随机森林, 朴素贝叶斯等, 此处我们构建一个简单的随机森林分类器作为例子.
- # 建立分类器
- from sklearn.ensemble import RandomForestClassifier
- classifier=RandomForestClassifier(nestimators=50,maxdepth=4)
- # 此处构建随机森林分类器作为例子, 参数随便指定
复制代码
4. 流水线第四步: 组装完整流水线
上面的几个步骤相当于建立各种产品处理模块, 这一步我们就需要将这些模块组装起来, 构建成一个可以完整运行的机器学习流水线. 代码很简单, 如下所示.
- # 第四步: 组装完整流水线
- from sklearn.pipeline import Pipeline
- pipeline=Pipeline([('selector',featureselector),
- ('rfclassifier',classifier)])
- # 修改流水线中参数设置
- # 假如我们希望特征选择器不是选择 10 个特征, 而是 5 个特征,
- # 同时分类器中的参数 nestimators 也要修改一下, 可以采用:
- pipeline.setparams(selectork=5,
- rfclassifiernestimators=25)
复制代码
输 出
- Pipeline(memory=None,
- steps=[('selector', SelectKBest(k=5, scorefunc=<function fregression at 0x000000001891B7B8>)), ('rfclassifier', RandomForestClassifier(bootstrap=True, classweight=None, criterion='gini',
- maxdepth=4, maxfeatures='auto', maxleafnodes=None,
- minimpuritydecrease=0.0, min...njobs=1,
- oobscore=False, randomstate=None, verbose=0,
- warmstart=False))])
完
从上面的输出中可以看出, 这个流水线中只有两个模块, 一个是特征选择器 selector, 另外一个是分类器 rfclassifier, 各自分别的参数位于后面.
对于模型, 最终都是要用数据集进行训练, 并且用训练好的模型来对新样本做出预测. 如下为代码:
- # 将数据输入到流水线中
- pipeline.fit(X,y) # 对流水线进行训练
- predicty=pipeline.predict(X) #用训练好的流水线预测样本
- # print(predicty)
- # 评估该流水线的模型性能
- print('pipeline model score: {:.3f}'.format(pipeline.score(X,y)))
复制代码
输 出
pipeline model score: 0.960
完
这个流水线模型在训练集上的得分为 0.960, 貌似性能还不错.
上面我们构建了一个特征选择器, 但是怎么知道哪些特征被选择, 哪些陪抛弃了 如下代码:
- # 查看特征选择器选择的特征:
- featurestatus=pipeline.namedsteps['selector'].getsupport()
- # getsupport()会返回 true/false, 如果支持该 feature, 则为 true.
- selectedfeatures=[]
- for count,item in enumerate(featurestatus):
- if item: selectedfeatures.append(count)
- print('selected features by pipeline, (0indexed): \n{}'.format(
- selectedfeatures))
复制代码
输 出
selected features by pipeline, (0indexed): [5, 9, 10, 11, 15]
完
由此可以看出, 流水线自动选择了五个特征(我们前面指定了 k=5), 这最重要的五个特征分别是标号为 5,9,10,11,15 的特征.
######################## 小 ********** 结 ###############################
1, 打造机器学习流水线非常简单, 只需要先构建机器学习的基本模块即可, 然后将这些模块组装起来.
2, 前面的特征提取器选择最重要特征的过程是先进行单变量统计测试, 然后从特征向量中抽取最优秀的特征. 这种测试之后, 向量空间中的每个特征将有一个评价分数, 基于这些评价分数, 选择最好的 K 个特征, 一旦抽取出 K 个特征, 一旦 K 维的特征向量形成, 就可以用这个特征向量用于分类器的输入训练数据.
3, 打造这种流水线的优势有很多, 可以简单快速的构建机器学习模型, 可以方便的提取最重要的 K 个特征向量, 可以快速的评估构建的模型, 正所谓, 这是个快速进行 AI 模型构建的必备良器.
4, 上面的流水线只是整合了特征选择, 分类器部分, 唯一让人遗憾的是, 怎么把数据处理, 数据清洗这部分也整合到流水线中 暂时我还没有找到这部分内容, 有哪位朋友找到了这种方法, 请联系我啊.
#################################################################
注: 本部分代码已经全部上传到 (我的 github https://github.com/RayDean/MachineLearning ) 上, 欢迎下载.
参考资料:
1, Python 机器学习经典实例, Prateek Joshi 著, 陶俊杰, 陈小莉译
来源: https://juejin.im/post/5b95db876fb9a05d396ef46a