我正在使用sklearn的Pipeline
来进行文本分类。
在这个Pipeline
的例子中,我有一个TfidfVectorizer
和一些用FeatureUnion
包装的自定义特征,以及作为Pipeline
步骤的分类器,然后我对训练数据进行拟合并进行预测:
from sklearn.pipeline import FeatureUnion, Pipelinefrom sklearn.feature_extraction.text import TfidfVectorizerfrom sklearn.svm import LinearSVCX = ['I am a sentence', 'an example']Y = [1, 2]X_dev = ['another sentence']# classifierLinearSVC1 = 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.
在这里,我需要pickleTfidfVectorizer
步骤,而不picklecustom_features
,因为我还在对它们进行实验。这个想法是通过pickle tfidf步骤来加快pipeline的速度。
我知道我可以用joblib.dump
来pickle整个Pipeline
,但如何pickle各个步骤呢?
回答:
要pickle TfidfVectorizer,可以使用:
joblib.dump(pipeline.steps[0][1].transformer_list[0][1], dump_path)
或者:
joblib.dump(pipeline.get_params()['features__tfidf'], dump_path)
要加载已dump的对象,可以使用:
pipeline.steps[0][1].transformer_list[0][1] = joblib.load(dump_path)
遗憾的是,你不能使用set_params
(get_params
的逆操作)来按名称插入估计器。如果PR#1769: 启用将pipeline组件设置为参数的更改被合并,你将能够这样做!