我对交叉验证(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)
我想确保此方法正确无误。 谢谢!
答案 0 :(得分:0)
我的理解是,您的管道方法将为您处理这种情况。换句话说:TfidfVectorizer将经历CV流程,并且在训练折叠的每个组合中都将调用.fit_transform;。然后针对该折的相应保持测试分数,它将仅调用.transform。这模拟了一个真实的场景,在该场景中,您会将预先训练的过程的结果应用于新的看不见的数据(由“测试”数据模拟),因此您必须基于事先拟合的Vocab(向量化器)进行转换
我基于对sklearn特定机制的理解,是基于我在这里看到的回复:
响应器在管道中将StandardScaler类子类化,并显示在保留的折叠中,它仅在通过cv类运行时才调用.transform。我目前的理解是,任何传入cross_val_score的类都可以使用定义了.fit_transform和.transform选项的类接受管道输入。