如何pickle sklearn Pipeline 中的各个步骤?

iva*_*lan 5 python pipeline classification machine-learning scikit-learn

我正在使用Pipelinesklearn 对文本进行分类。

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

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.
Run Code Online (Sandbox Code Playgroud)

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

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

joe*_*eln 4

要腌制 TfidfVectorizer,您可以使用:

joblib.dump(pipeline.steps[0][1].transformer_list[0][1], dump_path)
Run Code Online (Sandbox Code Playgroud)

或者:

joblib.dump(pipeline.get_params()['features__tfidf'], dump_path)
Run Code Online (Sandbox Code Playgroud)

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

pipeline.steps[0][1].transformer_list[0][1] = joblib.load(dump_path)
Run Code Online (Sandbox Code Playgroud)

不幸的是,您不能使用 的set_params反函数get_params来按名称插入估算器。如果PR#1769中的更改:启用将管道组件设置为参数,您将能够合并!