是否可以安装 sklearn 管道的单独部分?

Posted

技术标签:

【中文标题】是否可以安装 sklearn 管道的单独部分?【英文标题】:Is it possible to fit separate parts of an sklearn pipeline? 【发布时间】:2021-07-22 19:03:18 【问题描述】:

考虑关注 sklearn Pipeline:

pipeline = make_pipeline(
    TfidfVectorizer(),
    LinearRegression()
)

我已经预训练了TfidfVectorizer,所以当我调用pipeline.fit(X, y) 时,我只想安装LinearRegression 而我不想改装TfidfVectorizer

我可以提前应用转换并在转换后的数据上拟合 LinearRegression,但在我的项目中,我的管道中有很多转换器,其中一些是预训练的,有些不是,所以我是寻找一种不围绕 sklearn 估计器编写另一个包装器并保持在一个 Pipeline 对象的范围内的方法。

在我看来,它应该是 estimators 对象中的一个参数,表示在调用 .fit() 时如果对象已安装,则不重新安装对象。

【问题讨论】:

【参考方案1】:

您可以通过如下定义管道来仅找到回归量:

pipeline = make_pipeline(steps = [
    ('vectorizer', TfidfVectorizer()),
    ('regressor', LinearRegression())
])

然后

pipeline['regressor']

应该只给你回归量。

【讨论】:

但是假设你在管道中有很多估计器,单独调用它们不是很方便。此外,如果您想使用 GridSearchCV 优化管道,您不能单独调用每个估计器的拟合。 如果您需要单独的结果,请尝试Voting Classifier。【参考方案2】:

查看“内存”参数。它缓存来自管道的转换器。

https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.make_pipeline.html

pipeline = make_pipeline(
    TfidfVectorizer(),
    LinearRegression(),
    memory='cache_directory'
)

【讨论】:

感谢您的回答,但这不是我想要完成的。根据scikit-learn.org/stable/modules/… 的说法,当参数和输入数据与适合的参数和输入数据相同时,使用缓存。但就我而言,我想将LinearRegression 拟合到新数据,而TfidfVectorizer 拟合另一个数据并保持不变。重点是我想训练一次变压器,然后在不重新安装变压器的情况下在新数据的管道中使用它。【参考方案3】:

您只能使用此 hack 来安装变压器一次

from sklearn.preprocessing import FunctionTransformer

def fit_once(transformer):
    fitted = [False]

    def func(x):
        if not fitted[0]:
            transformer.fit(x)
            fitted[0] = True
        return transformer.transform(x)

    return FunctionTransformer(func)

pipeline = make_pipeline(
    fit_once(TfidfVectorizer()),
    LinearRegression()
)

【讨论】:

以上是关于是否可以安装 sklearn 管道的单独部分?的主要内容,如果未能解决你的问题,请参考以下文章

SK-Learn 全家福

您可以使用 LDA(线性判别分析)作为 sklearn 管道的一部分进行预处理吗?

sklearn 管道 + keras 顺序模型 - 如何获取历史记录?

是否可以将多个管道组合到 Neuraxle 或 sklearn 中的单个估计器中以创建多输出分类器并一次性适应

sklearn “管道实例尚未安装。”错误,即使它是

是否可以访问 spark.ml 管道中的估计器属性?