如何腌制sklearn管道中的各个步骤?

Posted

技术标签:

【中文标题】如何腌制sklearn管道中的各个步骤?【英文标题】:How to pickle individual steps in sklearn's Pipeline? 【发布时间】:2016-07-15 13:44:00 【问题描述】:

我正在使用来自 sklearn 的Pipeline 对文本进行分类。

在这个示例Pipeline 中,我有一个TfidfVectorizer 和一些用FeatureUnion 和一个分类器作为Pipeline 步骤包装的自定义功能,然后我拟合训练数据并进行预测:

from sklearn.pipeline import FeatureUnion, Pipeline
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.svm import LinearSVC

X = ['I am a sentence', 'an example']
Y = [1, 2]
X_dev = ['another sentence']

# classifier
LinearSVC1 = LinearSVC(tol=1e-4,  C = 0.10000000000000001)

pipeline = Pipeline([
    ('features', FeatureUnion([
       ('tfidf', TfidfVectorizer(ngram_range=(1, 3), max_features= 4000)), 
       ('custom_features', CustomFeatures())])),
    ('clf', LinearSVC1),
    ])

pipeline.fit(X, Y)
y_pred = pipeline.predict(X_dev)

# etc.

在这里,我需要腌制TfidfVectorizer 步骤并保留custom_features 未腌制,因为我仍在使用它们进行实验。这个想法是通过酸洗 tfidf 步骤使管道更快。

我知道我可以用joblib.dump 腌制整个Pipeline,但是如何腌制各个步骤?

【问题讨论】:

【参考方案1】:

要腌制 TfidfVectorizer,您可以使用:

joblib.dump(pipeline.steps[0][1].transformer_list[0][1], dump_path)

或:

joblib.dump(pipeline.get_params()['features__tfidf'], dump_path)

要加载转储的对象,可以使用:

pipeline.steps[0][1].transformer_list[0][1] = joblib.load(dump_path)

很遗憾,您不能使用get_params 的倒数set_params 按名称插入估计器。如果 PR#1769: enable setting pipeline components as parameters 中的更改被合并,您将能够做到!

【讨论】:

如何从管道中加载它? 这么好用的功能居然不存在,简直难以置信。

以上是关于如何腌制sklearn管道中的各个步骤?的主要内容,如果未能解决你的问题,请参考以下文章

如何为多标签分类器/一对休息分类器腌制 sklearn 管道?

重新加载腌制的 sklearn 管道时出现问题。未导入计数向量分析器功能

如何从 Sklearn 管道中提取特征重要性

如何使用 XGboost 针对不同的“eval_metric”优化 sklearn 管道?

如何从管道中的 sklearn TFIDF Vectorizer 返回数据帧?

将多个预处理步骤应用于 sklearn 管道中的列