在训练测试中表现出色,在测试集上表现不佳

Excellent performances on training test, bad on test set

我正在做文本分类,我正在处理奇怪的结果。我有两个数据集,一个已标记,另一个未标记。当我在标记的分类器上使用一些分类器(SVM、朴素贝叶斯、knn、随机森林、梯度提升)时,我有出色的性能,即使没有调整,所有分类器(超过 98% 的 BAC),但是当我尝试在未标记的数据集上预测结果 我对每个分类器都有非常不同的预测。我使用 TF-IDF 作为矢量化器,我也尝试使用二元组和三元组,但没有任何改变。我还尝试使用 SMOTE 创建不同的新观察结果(即使我对不平衡数据集没有问题)只是为了看看通过新的观察结果,算法是否可以更好地概括新数据,但即使在这种情况下,也没有什么变了。我该怎么做才能解决这个问题?为什么会这样?你有什么想法吗?

您好,欢迎来到论坛!

我能想到3种可能(其实有些重叠):

  1. 您是否将标记数据集拆分为训练集和验证集?也许你正在为听起来可怕的事情而苦恼data leakage。基本上,来自验证集的数据以某种方式泄漏到训练数据中,因此模型知道的比它应该知道的更多。它比你想象的更常见。

  2. 也许你就是overfitting训练集。基本上,该模型会记住训练数据并且不能很好地泛化。您可以尝试在较早的阶段停止训练。

  3. 训练数据和测试数据的分布与模型不够相似,无法很好地泛化。您可以尝试重新洗牌并再次分离。您还可以尝试了解数据集相似性的基本方法是检查 类 在训练和测试数据中的分布,但存在更复杂和有用的技术。

比较训练数据和测试数据的一些更复杂的技术是:

  • 检查分类器能否正确判断数据点属于训练集还是测试集。如果分布足够相似,这是不可能的。 Here 是 Python 中的教程。

  • 使用 Kolmogorov-Smirnov 检验(another tutorial in Python). scipy.stats implements it: see stats.ks_2samp。请注意:此检验必须分别应用于每一列,因此如果您使用的是,则它不起作用,例如, NLP的词嵌入。

  • 如果您确实在使用词嵌入,则应使用第一个要点中描述的分类器或转换数据,使其成为一维数据。一个简单的例子是计算词嵌入的范数,但这并不能完全完成工作。 Mahalonobis(也由 SciPy 实现)距离效果更好一些 - 有关详细信息,请参阅最后一个要点 tutorial 的底部。