2014-03-26 89 views
3

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

+0

我认为这个问题在名为“交叉验证”的堆栈交换机器学习和统计站点上可能会有更好的接收。 – waTeim

+0

这个问题似乎是脱离主题,因为它属于http://stats.stackexchange.com/ –

+0

澄清:它不脱离主题,因为这个问题特别是在sklearn文本分类CV。数值数据不会出现这个问题,因为该特征集对于任何折叠都是固定的,但对于文本分类中的每一次折叠都是不同的。 – user3466018

回答

4

的scikit学习解决这个问题是交叉验证估计的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字符串的listdocuments及其标签y,呼吁

>>> cross_val_score(clf, documents, y) 

会做特征提取每个单独折叠,使每一个支持向量机只知道它(k的词汇-1)折叠训练集。

+0

非常感谢!我测试了您的解决方案,与无管道方法相比,它报告的准确性数字不同。是否有任何方法可以打印出每个关键词的词汇大小,以便验证?我打印出“clf”的特征集大小,并且数字与我从无管线方法中获得的数量相同。 – user3466018

+0

@ user3466018不是开箱即用,但是您可以实现一个无操作的转换器,它可以打印'X.shape [1]'并将其堆叠到管道中。 (或者实现一个自定义记录器,或者破解向量代码来报告这个。) –