无法保存 TF-IDF 矢量化器

数据挖掘 机器学习 Python nlp 多标签分类 tfidf
2022-02-23 06:57:06

我正在研究多标签分类问题。我在保存 TF-IDf verctorizer 以及同时使用 pickle 和 joblib 包的模型时遇到了问题。

下面是代码:

vectorizer = TfidfVectorizer(min_df=0.00009, max_features=200000, smooth_idf=True, norm="l2", \
                         tokenizer = lambda x: x.split(), sublinear_tf=False, ngram_range=(1,3))
x_train_multilabel = vectorizer.fit_transform(x_train)
x_test_multilabel = vectorizer.transform(x_test)

classifier = OneVsRestClassifier(SGDClassifier(loss='log', alpha=0.00001, penalty='l1'), n_jobs=-1)
classifier.fit(x_train_multilabel, y_train)
predictions = classifier.predict(x_test_multilabel)

保存 TF-IDF vectozier 时出现错误消息。

在此处输入图像描述 在此处输入图像描述

有什么建议么 ?提前致谢。

1个回答

问题是由于您的lamda函数带有tokenizer关键字参数。

>>> from sklearn.feature_extraction.text import TfidfVectorizer
>>> from joblib import dump
>>> t = TfidfVectorizer()
>>> dump(t, 'tfidf.pkl')
['tfidf.pkl']

没有问题。现在让我们将一个lambda函数传递给tokenizer

>>> t = TfidfVectorizer(tokenizer=lambda x: x.split())
>>> dump(t, 'tfidf.pkl')

这会引发以下错误:

_pickle.PicklingError: Can't pickle at 0x100e18b90>: it's not found as main

为了解决这个问题,创建一个分割文本的函数:

>>> def text_splitter(text):
...     return text.split()

再次尝试转储:

>>> t = TfidfVectorizer(tokenizer=text_splitter)
>>> dump(t, 'tfidf.pkl')
['tfidf.pkl']

现在您可以保存矢量化器了。