【问题标题】:how to pickle customized vectorizer?如何腌制定制的矢量化器?
【发布时间】:2014-03-10 03:18:15
【问题描述】:

自定义矢量化器后,我无法对其进行酸洗。

from sklearn.feature_extraction.text import TfidfVectorizer
import pickle
tfidf_vectorizer = TfidfVectorizer(analyzer=str.split)
pickle.dump(tfidf_vectorizer, open('test.pkl', "wb"))

这会导致 “TypeError:无法腌制 method_descriptor 对象”

但是,如果我不自定义分析器,它会正常工作。关于如何解决这个问题的任何想法?如果我要更广泛地使用它,我需要保留矢量化器。

顺便说一句,我发现对分析器使用简单的字符串拆分并预处理语料库以删除非词汇和停用词对于获得良好的运行速度至关重要。否则,大部分矢量化程序运行时间都花在“text.py:114(_word_ngrams)”中。 HashingVectorizer 也是如此

这与Persisting data in sklearnhttp://scikit-learn.org/0.10/tutorial.html#model-persistence 有关 (顺便说一句,sklearn.externals.joblib.dump 也无济于事)

谢谢!

【问题讨论】:

    标签: python scikit-learn pickle


    【解决方案1】:

    这与其说是一个 scikit-learn 问题,不如说是一个一般的 Python 问题:

    >>> pickle.dumps(str.split)
    Traceback (most recent call last):
      File "<ipython-input-7-7d3648c78b22>", line 1, in <module>
        pickle.dumps(str.split)
      File "/usr/lib/python2.7/pickle.py", line 1374, in dumps
        Pickler(file, protocol).dump(obj)
      File "/usr/lib/python2.7/pickle.py", line 224, in dump
        self.save(obj)
      File "/usr/lib/python2.7/pickle.py", line 306, in save
        rv = reduce(self.proto)
      File "/usr/lib/python2.7/copy_reg.py", line 70, in _reduce_ex
        raise TypeError, "can't pickle %s objects" % base.__name__
    TypeError: can't pickle method_descriptor objects
    

    解决方案是使用可腌制分析仪:

    >>> def split(s):
    ...     return s.split()
    ... 
    >>> pickle.dumps(split)
    'c__main__\nsplit\np0\n.'
    >>> tfidf_vectorizer = TfidfVectorizer(analyzer=split)
    >>> type(pickle.dumps(tfidf_vectorizer))
    <type 'str'>
    

    【讨论】:

    • 这是否给了我一个错误:Traceback(最近一次调用最后一次):文件“”,第 1 行,在 文件“C:\Python27\lib\pickle.py”中,第 1374 行,转储 Pickler(file, protocol).dump(obj) 文件“C:\Python27\lib\pickle.py”,第 224 行,转储 self.save(obj) 文件“C:\Python27\lib \pickle.py", line 286, in save f(self, obj) # Call unbound method with explicit self File "C:\Python27\lib\pickle.py", line 748, in save_global (obj, module, name) ) PicklingError: Can't pickle : it's not found as main.split
    • 您可以设置vectorizer.stop_words_=None,因为序列化需要很长时间,而且将来使用也不需要,因此清空它需要一些时间。 scikit-learn.org/stable/modules/generated/…
    猜你喜欢
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多