整个数据集的交叉验证和数据的矢量化
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 选项的类的管道输入,就可以处理这个问题。
【讨论】:
以上是关于整个数据集的交叉验证和数据的矢量化的主要内容,如果未能解决你的问题,请参考以下文章