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)