将两个拟合估计器合并到管道中

Chr*_*ris 4 pipeline scikit-learn

我有两个阶段的数据:

import numpy as np

data_pre = np.array([[1., 2., 203.],
                     [0.5, np.nan, 208.]])

data_post = np.array([[2., 2., 203.],
                      [0.5, 2., 208.]])
Run Code Online (Sandbox Code Playgroud)

我还有两个预先存在的拟合估算器:

from sklearn.preprocessing import Imputer
from sklearn.ensemble import GradientBoostingRegressor

imp = Imputer(missing_values=np.nan, strategy='mean', axis=1).fit(data_pre)
gbm = GradientBoostingRegressor().fit(data_post[:,:2], data_post[:,2])
Run Code Online (Sandbox Code Playgroud)

我需要将一个合适的管道传递data_pre给另一个函数。

def the_function_i_need(estimators):
    """
    """
    return fitted pipeline

fitted_pipeline = the_function_i_need([imp, gbm])
sweet_output = static_function(fitted_pipeline, data_pre) 
Run Code Online (Sandbox Code Playgroud)

有没有办法将这两个现有的和拟合的模型对象组合到拟合的管道中,而无需重新拟合模型,还是我运气不好?

小智 6

我尝试对此进行调查。我找不到任何直接的方法来做到这一点。

我觉得唯一的方法是编写一个自定义 Transformer,它作为现有 Imputer 和 GradientBoostingRegressor 的包装器。您可以使用已安装的回归器和/或输入器来初始化包装器。fit然后,您可以通过不执行任何操作来覆盖对 的调用。在所有后续transform调用中,您可以调用transform基础拟合模型的 。这是一种肮脏的方法,除非这对您的应用程序非常重要,否则不应这样做。可以在此处找到有关为 Scikit-Learn Pipelines 编写自定义类的好教程。scikit-learn 文档中自定义管道对象的另一个工作示例可以在此处找到。