将两个合适的估算器组合成一个管道

时间:2016-06-17 21:07:36

标签: scikit-learn pipeline

我有两个阶段的数据:

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.]])

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

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])

我需要将一个适合的管道和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) 

有没有办法将这两个现有的和适合的模型对象组合成一个合适的管道而不需要改装模型或者我运气不好?

1 个答案:

答案 0 :(得分:2)

我试着调查一下。我找不到任何直截了当的方法来做到这一点。

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