如何使用带有 countVectorizer.fit_transform() 的腌制分类器来标记数据

Posted

技术标签:

【中文标题】如何使用带有 countVectorizer.fit_transform() 的腌制分类器来标记数据【英文标题】:How to use pickled classifier with countVectorizer.fit_transform() for labeling data 【发布时间】:2014-11-18 05:23:45 【问题描述】:

我在一组短文档上训练了一个分类器,并在获得二元分类任务的合理 f1 和准确度分数后对其进行了腌制。

在训练时,我使用 sciki-learn countVectorizer cv 减少了特征数量:

    cv = CountVectorizer(min_df=1, ngram_range=(1, 3), max_features = 15000) 

然后使用fit_transform()transform()方法得到变换后的训练集和测试集:

    transformed_feat_train = numpy.zeros((0,0,))
    transformed_feat_test = numpy.zeros((0,0,))

    transformed_feat_train = cv.fit_transform(trainingTextFeat).toarray()
    transformed_feat_test = cv.transform(testingTextFeat).toarray()

这一切都适用于训练和测试分类器。但是,我不确定如何将 fit_transform()transform() 与经过训练的分类器的腌制版本一起使用,以预测看不见的未标记数据的标签。

我正在以与训练/测试分类器时完全相同的方式提取未标记数据的特征:

## load the pickled classifier for labeling
pickledClassifier = joblib.load(pickledClassifierFile)

## transform data
cv = CountVectorizer(min_df=1, ngram_range=(1, 3), max_features = 15000)
cv.fit_transform(NOT_SURE)

transformed_Feat_unlabeled = numpy.zeros((0,0,))
transformed_Feat_unlabeled = cv.transform(unlabeled_text_feat).toarray()

## predict label on unseen, unlabeled data
l_predLabel = pickledClassifier.predict(transformed_feat_unlabeled)

错误信息:

    Traceback (most recent call last):
      File "../clf.py", line 615, in <module>
        if __name__=="__main__": main()
      File "../clf.py", line 579, in main
        cv.fit_transform(pickledClassifierFile)
      File "../sklearn/feature_extraction/text.py", line 780, in fit_transform
        vocabulary, X = self._count_vocab(raw_documents, self.fixed_vocabulary)
      File "../sklearn/feature_extraction/text.py", line 727, in _count_vocab
        raise ValueError("empty vocabulary; perhaps the documents only"
    ValueError: empty vocabulary; perhaps the documents only contain stop words

【问题讨论】:

【参考方案1】:

您应该使用相同的矢量化器实例来转换训练和测试数据。您可以通过使用矢量化器 + 分类器创建管道、在训练集上训练管道、腌制整个管道来做到这一点。稍后加载腌制管道并对其调用预测。

请参阅此相关问题:Bringing a classifier to production。

【讨论】:

谢谢你,奥利维尔 (@ogrisel)。您的解决方案看起来很整洁。我会试一试。但是,我使用一种简单的方法找到了解决方案:1)我将训练特征、训练标签和分类器与训练数据分开腌制,2)通过使用“腌制训练- features'3) transform() 将看不见的、未标记数据的特征转换为训练数据的维度,4) 将“pickeled-classifier”与转换后的训练特征和“pickled labels”拟合,5) 然后在转换后的 unlabeledData- 上预测标签功能。

以上是关于如何使用带有 countVectorizer.fit_transform() 的腌制分类器来标记数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在本地使用带有 express 的 graphql 和带有 mongoose 的 mongodb 来检索文档?

如何使用带有路径的“开始”和带有空格的命令在 Windows 中创建批处理文件

如何避免在带有 Swift 4 的 iOS 11 中使用带有刷新控件的 @objc?

如何使用带有打字稿的“调试”模块

如何使用 Qt 发送带有图像附件的电子邮件?

如何使用python在sqlplus中插入带有'&'的值