Scikit learn 整个数据集的交叉验证和数据矢量化

Scikit learn 整个数据集的交叉验证和数据矢量化,scikit-learn,pipeline,cross-validation,text-classification,Scikit Learn,Pipeline,Cross Validation,Text Classification,我对交叉验证(CV)的方法学存在疑问。我发现一些学术论文报告了在整个数据集上应用CV的结果。那么,假设我想这样做。当我们必须处理文本并首先对数据进行一些转换(如矢量化)时,我产生了怀疑。在这种情况下,我们是否应该在整个数据集上应用矢量化,而不分为训练/测试?我找到的最佳解决方案是使用如下管道,我使用该管道对文本的词性表示进行矢量化: pipe = make_pipeline(ColumnSelector(column='pos'), TfidfVectori

我对交叉验证(CV)的方法学存在疑问。我发现一些学术论文报告了在整个数据集上应用CV的结果。那么,假设我想这样做。当我们必须处理文本并首先对数据进行一些转换(如矢量化)时,我产生了怀疑。在这种情况下,我们是否应该在整个数据集上应用矢量化,而不分为训练/测试?我找到的最佳解决方案是使用如下管道,我使用该管道对文本的词性表示进行矢量化:

pipe = make_pipeline(ColumnSelector(column='pos'), 
                  TfidfVectorizer(binary=True, ngram_range=(1,3), max_features=5000),
                  SVC(kernel='linear', random_state=seed))enter code here
然后,我使用此管道在整个数据集上运行CV:

cv_results = model_selection.cross_val_score(pipe, X, y, cv=skf, scoring=scoring)
我想确保这个方法是正确的和可靠的。
谢谢

我的理解是,您的管道方法将为您处理这种情况。换句话说:TfidfVectorizer将经历CV过程,并在每个训练折叠组合中调用.fit_transform;然后,对于该折叠对应的heldout测试分数,它将调用.transform only。这模拟了一个真实的场景,在这个场景中,您将把预先训练的过程的结果应用于新的看不见的数据(由“测试”数据模拟),因此您必须基于先前的fit Vocab(矢量器)进行转换

我是根据我在这里看到的一个回答来理解sklearn特定的机制的:


响应程序在管道中对StandardScaler类进行子类化,并显示在heldout折叠上,它仅在通过cv类运行时调用.transform。我目前的理解是,任何输入cross_val_score的类都可以接受管道输入,这些类定义了.fit_transform和.transform选项

我的理解是,您的管道方法将为您处理这种情况。换句话说:TfidfVectorizer将经历CV过程,并在每个训练折叠组合中调用.fit_transform;然后,对于该折叠对应的heldout测试分数,它将调用.transform only。这模拟了一个真实的场景,在这个场景中,您将把预先训练的过程的结果应用于新的看不见的数据(由“测试”数据模拟),因此您必须基于先前的fit Vocab(矢量器)进行转换

我是根据我在这里看到的一个回答来理解sklearn特定的机制的:

响应程序在管道中对StandardScaler类进行子类化,并显示在heldout折叠上,它仅在通过cv类运行时调用.transform。我目前的理解是,任何输入cross_val_score的类都可以接受管道输入,这些类定义了.fit_transform和.transform选项