如何将 TfidfVectorizer 的输出馈送到 Sklearn 中的 LinearSVC 分类器?

Posted

技术标签:

【中文标题】如何将 TfidfVectorizer 的输出馈送到 Sklearn 中的 LinearSVC 分类器?【英文标题】:How to feed the output of TfidfVectorizer to the LinearSVC classifier in Sklearn? 【发布时间】:2019-08-07 22:50:16 【问题描述】:

我正在尝试在 Scikit learn 中使用 LinearSVC 构建一个线性分类器。我决定使用 tf-idf 矢量化来矢量化文本输入。我写的代码是:

review_corpus = list(train_data_df['text'])
vectorizer = TfidfVectorizer(max_df = 0.9,stop_words = 'english')
%timeit tfidf_matrix = vectorizer.fit_transform(review_corpus)

我现在想使用这个 tfidf_matrix 训练一个 SVM 模型,并用它来预测相应测试集的类/标签:test_data_df['text']。 我遇到的问题:

    仅使用训练数据来构建 TfIdfVectorizer 是否正确,还是应该同时使用训练和测试文本数据来构建向量器?

    主要问题是:如何获得测试数据的矩阵表示?目前,我不确定如何从矢量化器中获取测试集中不同文档的 tfidf 分数。我尝试的是遍历 Pandas 系列 test_data_df['text'] 然后执行:

    tfidf_matrix.todense(list(text)
    

对于系列中的每个文本,将结果放入列表中,最后从中创建一个 numpy 数组,但出现内存错误。

【问题讨论】:

【参考方案1】:

    您应该只使用训练数据来构建TfIdfVectorizer()。这将确保您在训练过程中不会泄露有关测试数据的任何信息。

    使用

    tfidf_matrix_test = vectorizer.transform(test_data_df['text'])
    

现在您可以将tfidf_matrix_test 提供给分类器。

PS:

尽量避免将 Vectorizer 的 sparse_matrix 输出转换为列表或密集数组。因为它是内存密集型的,而且分类器在训练/预测时也会花费更多的计算时间。

【讨论】:

以上是关于如何将 TfidfVectorizer 的输出馈送到 Sklearn 中的 LinearSVC 分类器?的主要内容,如果未能解决你的问题,请参考以下文章

在 TfidfVectorizer 中如何计算词频?

如何使用 TfIdfVectorizer 查找重要单词?

了解 TfidfVectorizer 输出

如何从TfidfVectorizer计算余弦相似度?

Tfidfvectorizer - 如何查看已处理的令牌?

在实践中如何使用 TfidfVectorizer 和元数据进行分类?