是否可以安装 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 管道的单独部分?的主要内容,如果未能解决你的问题,请参考以下文章
您可以使用 LDA(线性判别分析)作为 sklearn 管道的一部分进行预处理吗?
sklearn 管道 + keras 顺序模型 - 如何获取历史记录?