【问题标题】:Excellent performances on training test, bad on test set在训练测试中表现出色,在测试集上表现不佳
【发布时间】:2020-08-28 10:17:59
【问题描述】:

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

【问题讨论】:

    标签: data-science text-classification tfidfvectorizer


    【解决方案1】:

    您好,欢迎来到论坛!

    我能想到 3 种可能性(实际上有些重叠):

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

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

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

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

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

    • 使用 Kolmogorov-Smirnov 检验 (another tutorial in Python)。 scipy.stats 实现它:见stats.ks_2samp。请注意:此测试必须单独应用于每一列,因此如果您正在使用例如 NLP 的词嵌入,则它不起作用。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-01
      • 2020-02-22
      • 2023-01-20
      • 2017-09-11
      • 2015-01-17
      • 2019-08-15
      • 2013-11-16
      • 2019-04-10
      相关资源
      最近更新 更多