机器学习流水线

日期: 2018-11-15 15:35:49 人气: - 评论: 0

随着实验的增加,操作的复杂程度也在提高。我们可能需要切分数据集,对特征进行二值化处理,以特征或数据集中的个体为基础规范化数据,除此之外还可能需要其他各种操作。

要跟踪记录所有这些操作可不容易,如果中间出点问题,先前实验的结果将很难再现。常见问题有落下步骤,数据转换错误,或进行了不必要的转换操作等。

另一个问题就是代码的先后顺序。上一节,我们创建了X_transformed数据集,然后创建了一个新的估计器用于交叉检验。如果有多个步骤,就需要跟踪代码中对数据集进行的每一步操作。

流水线结构就是用来解决这些问题的当然不限于这些,下一章会讲到它在其他方面的应用。流水线把这些步骤保存到数据挖掘的工作流中。之后你就可以用它们读入数据,做各种必要的预处理,然后给出预测结果。我们可以在cross_val_score等接收估计器的函数中使用流水线。创建流水线前,先导入Pipeline对象。

from sklearn.pipeline import Pipeline

 

流水线的输入为一连串的数据挖掘步骤,其中最后一步必须是估计器,前几步是转换器。输入的数据集经过转换器的处理后,输出的结果作为下一步的输入。最后,用位于流水线最后一步的估计器对数据进行分类。我们流水线分为两大步。

      1. MinMaxScaler将特征取值范围规范到0~1

      2. 指定KNeighborsClassifier分类器。

每一步都用元组‘名称’,步骤来表示。现在来创建流水线。

scaling_pipeline = Pipeline([('scale', MinMaxScaler()),

('predict', KNeighborsClassifier())])

 

流水线的核心是元素为元组的列表。第一个元组规范特征取值范围,第二个元组实现预测功能。我们把第一步叫作规范特征取值scale,第二步叫作预测predict,也可以用其他名字。元组的第二部分是实际的转换器对象或估计器对象。

流水线写好后,运行它很简单。使用先前用到的交叉检验代码看一下实际效果。

scores = cross_val_score(scaling_pipeline, X_broken, y, scoring='accuracy')

print("The pipeline scored an average accuracy for is {0:.1f}%". format(np.mean(transformed_scores) * 100))

运行结果跟之前一样82.3%,表明我们这次用到的步骤跟之前相同。

后续章节会使用更高级的测试方法,而设置流水线就很有必要,因为它能确保代码的复杂程度不至于超出掌控范围。