sklearn:文本分类交叉验证中的向量化

Posted

技术标签:

【中文标题】sklearn:文本分类交叉验证中的向量化【英文标题】:sklearn: vectorizing in cross validation for text classification 【发布时间】:2014-05-05 12:43:51 【问题描述】:

我有一个关于在 sklearn 的文本分类中使用交叉验证的问题。在交叉验证之前对所有数据进行向量化是有问题的,因为分类器会“看到”测试数据中出现的词汇。 Weka 有过滤分类器来解决这个问题。此功能的 sklearn 等效项是什么?我的意思是对于每个折叠,特征集都会不同,因为训练数据不同。

【问题讨论】:

我认为这个问题在名为“Cross Validated”的 Stack Exchange 机器学习和统计网站上可能会有更好的接受度。 这个问题似乎是题外话,因为它属于stats.stackexchange.com 澄清:这不是题外话,因为这个问题特别针对 CV 用于 sklearn 中的文本分类。数值数据不会有这个问题,因为特征集对于任何折叠都是固定的,但对于文本分类中的每个折叠来说都是不同的。 【参考方案1】:

该问题的 scikit-learn 解决方案是交叉验证估计器的 Pipeline,例如:

>>> from sklearn.cross_validation import cross_val_score
>>> from sklearn.feature_extraction.text import TfidfVectorizer
>>> from sklearn.pipeline import Pipeline
>>> from sklearn.svm import LinearSVC
>>> clf = Pipeline([('vect', TfidfVectorizer()), ('svm', LinearSVC())])

clf 现在是一个复合估计器,可以进行特征提取和 SVM 模型拟合。给定一个文档列表(即普通的 Python list 字符串)documents 及其标签 y,调用

>>> cross_val_score(clf, documents, y)

将在每个折叠中分别进行特征提取,以便每个 SVM 只知道其 (k-1) 折叠训练集的词汇表。

【讨论】:

非常感谢!我测试了您的解决方案,与无管道方法相比,它确实报告了不同的准确度数字。有没有办法打印出每个折叠的词汇量,只是为了验证?我打印了“clf”的特征集大小,这个数字和我从无管道方法得到的一样。 @user3466018 不是开箱即用的,但您可以实现一个打印X.shape[1] 的无操作转换器并将其堆叠到管道中。 (或者实现一个自定义记分器,或者破解矢量化代码来报告这个。)

以上是关于sklearn:文本分类交叉验证中的向量化的主要内容,如果未能解决你的问题,请参考以下文章

Python 中的逻辑回归和交叉验证(使用 sklearn)

在 sklearn 中运行 10 倍交叉验证后如何运行 SVC 分类器?

sklearn中的Kfold交叉验证每次都会给出不同的折叠

使用 Sklearn 进行交叉验证

交叉验证 Python Sklearn

sklearn交叉验证-老鱼学sklearn