只需一根“管道”,你就可以将机器学习中的复杂步骤串联起来
作者头像
  • 刘亚如
  • 2020-05-10 17:53:22 5

机器学习快速入门指南

第15篇

感谢您的订阅!

您的支持是我持续创作的动力!

在开发机器学习算法的过程中,通常需要经历多个步骤。现在有一种更高效的方法,可以将这些步骤串联起来,这就是“管道”。

管道的优势

管道的主要优势在于简化了步骤,提高了算法的效率。此外,它还有另一个重要优点,我们将在后续部分介绍。

小细节带来的大问题

在引入管道前,让我们回顾一下构建算法模型的一般流程。假设我们使用支持向量机(SVM)来建立模型:

  1. 将数据集分为训练集和测试集。
  2. 对训练集进行缩放处理,以适应SVM的需求。
  3. 使用带有交叉验证的网格搜索来确定最佳参数。
  4. 最后,评估模型在测试集上的精度。

虽然这一流程看起来完整,但其中隐藏着一个小错误。您发现了吗?

在对训练集进行预处理时,我们使用了整个训练集的数据。而在进行交叉验证时,我们将一部分训练集用作验证集。由于数据缩放是在交叉验证之前进行的,因此验证集中的数据同样也被缩放了。这就意味着模型在拟合过程中已经获得了部分数据的信息,而非完全全新的数据,从而可能导致过拟合,使模型精度被高估。

解决这个问题的方法很简单:将交叉验证放在数据预处理之前。具体来说,就是在外层循环中执行交叉验证,内层循环中进行数据预处理。这样,只有交叉验证中的训练集会被缩放,验证集不会受到影响。

在scikit-learn中,可以通过Pipeline实现这一目标。

创建管道

首先,我们需要导入必要的工具: python from sklearn.pipeline import Pipeline from sklearn.preprocessing import MinMaxScaler from sklearn.svm import SVC

接着,创建管道: python pipeline = Pipeline([('scale', MinMaxScaler()), ('svc', SVC())])

这样,我们就将数据预处理工具和SVC模型连接在一起。其中,“scale”和“svc”是我们自定义的名称。

我们还可以使用管道对数据进行拟合,并观察其精度。这里以乳腺癌数据集为例: python from sklearn.datasets import load_breast_cancer cancer = load_breast_cancer() from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target) pipeline.fit(X_train, y_train) pipeline.score(X_test, y_test) 结果显示,模型的精度约为95.8%。

网格搜索中的管道

管道的另一个优点是可以应用于网格搜索。这样,我们就能解决之前提到的问题。

在实际应用中,与之前的流程相比没有太大的区别。需要注意的是,在向GridSearchCV传递需要调整的参数时,要指定模型的名称。这个名称就是我们之前自定义的名称。

例如,如果我们需要调整SVC模型的参数C和gamma,并将其命名为“svc”,则需在参数中写成“svcC”和“svcgamma”。

更高效的管道创建方法

除了使用Pipeline创建管道外,还有一种更简便的方法——make_pipeline。这种方法不需要为每个工具或模型命名,系统会自动为其命名,名称即为工具或模型的英文小写形式。

例如: python from sklearn.pipeline import make_pipeline new_pipeline = make_pipeline(MinMaxScaler(), SVC())

这样,只需直接传入数据预处理工具和模型即可,系统会自动命名。

当然,我们也可以查看具体的步骤或参数: python new_pipeline.steps 如果需要查询特定步骤或参数,可以使用named_steps属性: python new_pipeline.named_steps['svc'].C

这就是今天的内容,感谢您的阅读和支持!

    本文来源:图灵汇
责任编辑: : 刘亚如
声明:本文系图灵汇原创稿件,版权属图灵汇所有,未经授权不得转载,已经协议授权的媒体下载使用时须注明"稿件来源:图灵汇",违者将依法追究责任。
    分享
一根串联管道步骤只需复杂机器起来可以学习
    下一篇