【问题标题】:How to execute only particular part of the scikit-learn pipeline?如何仅执行 scikit-learn 管道的特定部分?
【发布时间】:2020-09-22 14:10:26
【问题描述】:

以下是与问题相关的部分代码。如果需要完整代码,这里有一个完整的可复制代码,也可以下载数据:https://github.com/ageron/handson-ml2/blob/master/02_end_to_end_machine_learning_project.ipynb

我有一个管道:

prepare_select_and_predict_pipeline = Pipeline([
    ('preparation', full_pipeline),
    ('feature_selection', TopFeatureSelector(feature_importances, k)),
    ('svm_reg', SVR(**rnd_search.best_params_))
])

现在,我只想从上面的管道中执行这部分:

('preparation', full_pipeline),
('feature_selection', TopFeatureSelector(feature_importances, k)),

我尝试了prepare_select_and_predict_pipeline.fit(housing, housing_labels),但它也执行了 SVM 部分。

最后,当我执行下面的代码时,我需要从上面的管道中获得相同的结果:

preparation_and_feature_selection_pipeline = Pipeline([
    ('preparation', full_pipeline),
    ('feature_selection', TopFeatureSelector(feature_importances, k))
])

housing_prepared_top_k_features = preparation_and_feature_selection_pipeline.fit_transform(housing)

我该怎么做?

【问题讨论】:

  • 有什么充分的理由不同时拥有这两个声明?我的意思是,一个管道有 2 个步骤,另一个管道有 3 个步骤。
  • @HemersonTacon 不再重复相同的代码,如果可能的话,有一个地方可以修改。

标签: python python-3.x machine-learning scikit-learn pipeline


【解决方案1】:

您可以像列表一样对管道进行切片(版本 >=0.21),所以

prepare_select_and_predict_pipeline[:-1].fit_transform(housing)

应该可以。

(您需要在这里小心;您正在改装管道的变压器部分,因此在新数据集上执行此操作,然后prepare_select_and_predict_pipeline.predict(X_new) 将使用改装后的变压器!您可以@如果需要,将 987654323@ 添加到新变量。)

【讨论】:

    【解决方案2】:

    FeatureUnion 可以解决问题:

    from sklearn.pipeline import FeatureUnion, Pipeline
    
    prepare_select_pipeline = Pipeline([
        ('preparation', full_pipeline),
        ('feature_selection', TopFeatureSelector(feature_importances, k))
    ])
    
    feats = FeatureUnion([('prepare_and_select', prepare_select_pipeline)])
    
    prepare_select_and_predict_pipeline = Pipeline([('feats', feats),
                                   ('svm_reg', SVR(**rnd_search.best_params_))])
    

    您可以在A Deep Dive Into Sklearn Pipelines找到更多相关信息

    【讨论】:

    • 因此,如果我在这里理解正确,我们将创建第一个管道,然后通过添加额外的变压器在第一个管道的基础上创建第二个管道。我理解正确吗?
    • 是的。通过这种方式,您可以实现您想要的(没有代码重复,只需更改一点即可进行可能的修改)。
    • 这里需要 FeatureUnion 吗?使用prepare_select_pipeline 作为更大管道中的第一步不一样吗?
    • 您肯定可以按照您在答案中陈述的方式更简单地进行操作(索引管道)。但是,我看到 FeatureUnion 的一个优点是它保持了代码的可读性和可管理性,因为您不会在不知道正在执行管道的哪一部分的情况下访问一些魔术索引,并且您会避免完全错误索引。当然,对于小管道,这个优势可以忽略不计,但对于更大的管道,这会产生很大的不同。
    • 我的意思是,如果不进行切片,您的代码也可以使用prepare_select_pipeline 替换最后一个管道中的feats。我看不出FeatureUnion 有什么帮助?
    猜你喜欢
    • 2015-08-14
    • 2016-06-08
    • 2019-02-14
    • 2018-07-29
    • 2016-03-21
    • 2014-07-30
    • 2017-02-25
    • 2017-08-08
    • 2018-07-07
    相关资源
    最近更新 更多