【问题标题】:Scikit-learn how to check if model (e.g. TfidfVectorizer) has been already fitScikit-learn 如何检查模型(例如 TfidfVectorizer)是否已经适合
【发布时间】:2018-12-24 11:12:04
【问题描述】:

对于从文本中提取特征,如何检查向量器(例如 TfIdfVectorizer 或 CountVectorizer)是否已经适合训练数据?
特别是,我希望代码能够自动确定矢量化器是否已经适合。

from sklearn.feature_extraction.text import TfidfVectorizer

vectorizer = TfidfVectorizer()

def vectorize_data(texts):
  # if vectorizer has not been already fit
  vectorizer.fit_transform(texts)
  # else
  vectorizer.transform(texts)

【问题讨论】:

  • 查看我的答案并告诉我

标签: python numpy machine-learning scikit-learn


【解决方案1】:

您可以使用check_is_fitted,它基本上是为此而设计的。

source of TfidfVectorizer.transform()你可以查看它的用法:

def transform(self, raw_documents, copy=True):

    # This is what you need.
    check_is_fitted(self, '_tfidf', 'The tfidf vector is not fitted')

    X = super(TfidfVectorizer, self).transform(raw_documents)
    return self._tfidf.transform(X, copy=False)

所以在你的情况下,你可以这样做:

from sklearn.utils.validation import check_is_fitted

def vectorize_data(texts):

    try:
        check_is_fitted(vectorizer, '_tfidf', 'The tfidf vector is not fitted')
    except NotFittedError:
        vectorizer.fit(texts)

    # In all cases vectorizer if fit here, so just call transform()
    vectorizer.transform(texts)

【讨论】:

    【解决方案2】:

    我提出了两种检查方法:

    涵盖所有 scikit-learn 模型的个人代码:

    import inspect
    
    def my_inspector(model):
        return 0 < len( [k for k,v in inspect.getmembers(model) if k.endswith('_') and not k.startswith('__')] )
    

    现在让我们测试一下这段代码:

    from sklearn.feature_extraction.text import TfidfVectorizer
    import inspect
    
    vectorizer = TfidfVectorizer()
    
    def my_inspector(model):
            return 0 < len( [k for k,v in inspect.getmembers(model) if k.endswith('_') and not k.startswith('__')] )
    
    my_inspector(vectorizer)
    # False
    

    第二种方式使用check_is_fitted

    from sklearn.utils.validation import check_is_fitted
    
    check_is_fitted(vectorizer, '_tfidf', 'The tfidf vector is not fitted')
    

    【讨论】:

    • 知道了。我认为更好的方法是检查self.vocabulary_ 的存在而不是所有类属性。
    • 正确。我发布了一个涵盖所有 sklearn 功能的答案,并且适用于您的情况。请考虑支持并接受我的回答。欢呼
    猜你喜欢
    • 2018-01-23
    • 2014-11-12
    • 2016-03-13
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 2015-12-01
    相关资源
    最近更新 更多