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

Posted

技术标签:

【中文标题】整个数据集的交叉验证和数据的矢量化【英文标题】:Cross validation on the whole dataset and vectorisation of data 【发布时间】:2020-02-20 17:03:29 【问题描述】:

我对交叉验证 (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)

我想确保此方法正确且可靠。 谢谢!

【问题讨论】:

【参考方案1】:

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

我基于我在此处看到的回复对 sklearn 特定机制的理解:

Are the k-fold cross-validation scores from scikit-learn's `cross_val_score` and `GridsearchCV` biased if we include transformers in the pipeline?

响应者在 Pipeline 中继承了 StandardScaler 类,并显示在保留折叠上它仅在运行 cv 类时调用 .transform。我目前的理解是,任何输入到 cross_val_score 的类,只要它可以接受带有定义 .fit_transform 和 .transform 选项的类的管道输入,就可以处理这个问题。

【讨论】:

以上是关于整个数据集的交叉验证和数据的矢量化的主要内容,如果未能解决你的问题,请参考以下文章

如何计算分层 K 折交叉验证的不平衡数据集的误报率?

如何使用交叉验证来确定使用训练、验证和测试集的最终模型

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

交叉验证iris数据集

交叉验证iris数据集

libsvm交叉验证与网格搜索(参数选择)