如何保存 sklearn 管道/特征转换器

Posted

技术标签:

【中文标题】如何保存 sklearn 管道/特征转换器【英文标题】:How to save sklearn pipeline/feature-transformer 【发布时间】:2016-03-26 09:32:01 【问题描述】:

我有一个管道只包含一个特征联合,它具有三组不同的特征,包括 tfidf:

A_vec = AVectorizer()
B_vec = BVectorizer()
tfidf_vec = TfidfVectorizer(ngram_range=(1,2), analyzer='word', binary=False, stop_words=stopWords, min_df=0.01, use_idf=True)
all_features = FeatureUnion([('A_feature', A_vec), ('V_feature', B_vec), ('tfidf_feature', tfidf_vec)])
pipeline = Pipeline([('all_feature', all_features)])

我想为我的测试数据保存这个流水线特征转换器(我正在使用 LibSVM 进行分类),这是我尝试过的:

我已经使用 joblib.dump 来保存这个管道,但是它生成了太多的 .npy 文件,所以我不得不停止写入过程。这是一个相当愚蠢的尝试!

我已经保存了 tfidf_vec.vocabulary_,因此

tfidf_vec2 = TfidfVectorizer(ngram_range=(1,3), analyzer='word', binary=False, stop_words=stopWords, min_df=0.01, use_idf=True,vocabulary=pickle.load(open("../vocab .pkl", "rb"))

... ...

feat_test = pipeline2.transform(X_test)

它说“NotFittedError:没有拟合 idf 向量”。然后我使用了 fit_transform 而不是 transform 但它生成了一个包含不同值的特征向量(与正确的特征向量相比)。然后我关注了http://thiagomarzagao.com/2015/12/08/saving-TfidfVectorizer-without-pickles/,仍然在努力让它工作。

有没有更简单的方法来实现这一点?谢谢!

【问题讨论】:

【参考方案1】:

目前尚不清楚您想要实现什么以及您面临什么问题。 据我了解,你试过这个

我已经使用 joblib.dump 来保存这个管道,但是它生成了太多的 .npy 文件,所以我不得不停止写入过程。这是一个相当愚蠢的尝试!

由于您对此不满意,因此您尝试了其他一些替代方法。好吧,如果你只想生成一个文件,你可以这样做:

joblib.dump(pipeline, 'filename.pkl', compress = 1)

另外,我强烈建议您下次插入一个最小可行示例!

【讨论】:

【参考方案2】:

我会像你在第一个选项中那样使用 joblib.dump。它生成了多少个 *.npy 文件?拥有大量 *.npy 文件有什么问题?

【讨论】:

以上是关于如何保存 sklearn 管道/特征转换器的主要内容,如果未能解决你的问题,请参考以下文章

SKLEARN // 将 GridsearchCV 与列变换和管道相结合

如何将 sklearn 管道转换为 pyspark 管道?

在 sklearn 管道中对分类变量实施 KNN 插补

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

如何将 sklearn 管道转换为普通代码?

如何在具有多个数据帧列输入的 sklearn 管道中编写转换器