【问题标题】:How can I voluntarily overfit my model for text classification我怎样才能自愿过度拟合我的模型以进行文本分类
【发布时间】:2018-08-22 06:54:10
【问题描述】:

我想展示一个模型的示例,该模型过度拟合了一个测试集并且不能很好地概括未来的数据。

我将新闻数据集分成 3 组:

train set length: 11314
test set length: 5500
future set length: 2031

我正在使用一个文本数据集并构建一个CountVectorizer。 我正在创建一个网格搜索(没有交叉验证),每个循环都将测试矢量化器上的一些参数('min_df'、'max_df')和我的模型LogisticRegression 上的一些参数('C'、'fit_intercept'、'托尔',...)。 我得到的最好结果是:

({'binary': False, 'max_df': 1.0, 'min_df': 1},
{'C': 0.1, 'fit_intercept': True, 'tol': 0.0001},
 test set score: 0.64018181818181819,
 training set score: 0.92902598550468451)

但现在如果我在未来的集合上运行它,我将得到与测试集相似的分数:

clf.score(X_future, y_future): 0.6509108813392418

我如何证明我过拟合了我的测试集,因此它不能很好地推广到未来的数据?

【问题讨论】:

    标签: machine-learning classification logistic-regression


    【解决方案1】:

    您有一个在某些数据“训练集”上训练的模型。

    对这些数据执行分类任务,您将获得 92% 的分数。

    然后您获取在训练期间未见的新数据,例如“测试集”或“未来集”。

    对任何这些看不见的数据集执行分类任务,您将获得 65% 的分数。

    这正是过度拟合模型的定义:它具有非常高的方差,可见数据和不可见数据之间的性能差异很大。

    顺便说一下,考虑到您的具体情况,一些可能导致过拟合的参数选择如下:

    • min_df = 0
    • 逻辑回归的高 C 值(意味着低正则化)

    【讨论】:

    • 谢谢,很清楚。我知道可以建立一个过度拟合测试集而不是训练集的模型。你能想出一个策略来生成这样的模型吗?因为我是用测试集上的分数来调整参数的,理论上这可能会发生,但这很难做到。
    • 没有办法“过度拟合”测试集,因为过度拟合意味着负面的东西。适合测试集 92% 但仅适合训练集 65% 的理论模型确实是一个非常好的模型(假设您的集合是平衡的)。也不要使用测试集来调整参数。编辑:我认为您所说的“测试集”实际上可能是验证集,而您的“未来集”实际上是测试集。
    • 是的,你是对的。为了向您提供我试图理解我看到的这个视频的所有信息 youtube.com/watch?v=Sombn6OSvZU 。我正在尝试模拟 Kaggle 用户在使用私有数据集时发生的情况。似乎他们在公共测试数据集上做得很好,但在私有测试数据集上做得很好所以我猜他们使用公共测试数据集作为验证测试​​(并且他们过度拟合)并且没有很好地推广到未来的数据(私有测试数据集)
    【解决方案2】:

    我对alsora 的回答写了评论,但我认为我真的应该将其扩展为实际答案。

    正如我所说,没有办法“过度拟合”测试集,因为过度拟合意味着负面的东西。适合测试集 92% 但仅适合训练集 65% 的理论模型确实是一个非常好的模型(假设您的集合是平衡的)。

    我认为您所说的“测试集”实际上可能是验证集,而您的“未来集”实际上是测试集。让我们澄清一下。

    您有一组 18,845 个示例。您将它们分成 3 组。

    训练集:模型可以查看和学习的示例。每次您的模型从该集合中进行猜测时,您都会告诉它它是对还是错,然后它会相应地进行调整。

    验证集:在每个 epoch(通过训练集的时间)之后,您检查这些示例上的模型,这是以前从未见过的。您将训练损失和训练准确度与验证损失和验证准确度进行比较。如果训练准确率 > 验证准确率或训练损失 不根据验证集中的示例向您的模型提供反馈。只要您遵循上述规则,并且只要您的验证集混合良好,就不能过度拟合这些数据。

    测试集:用于在训练完成后评估模型的准确性。这是最重要的,因为它基于您的模型从未见过的示例。同样,您不能过度拟合这些数据。

    在您的 18,845 个示例中,您有 11314 个在训练集,5500 个在验证集,2031 个在测试集。 p>

    【讨论】:

    • 谢谢 Tryer,你是对的。我试图模拟一些 Kaggle 用户在此视频 youtube.com/watch?v=Sombn6OSvZU 中犯的错误,他们基本上过度拟合了公共测试数据集并且无法在私有数据集上进行泛化。我试图用一个简单的例子来模拟他们发生了什么。
    • 如果我真的要解决这个问题,我会使用 kfold 对训练集进行交叉验证以创建许多不同的验证集,然后使用测试集来检查它是否能够很好地泛化,但我我试图做的是模拟一些人犯的错误(正如你在我之前的评论中看到的那样)
    • @rolele 好的,我明白了。一个模型在验证集上表现良好但在测试集上表现不佳的一种情况是,如果验证集与测试集相比没有很好地混合。例如,考虑一个具有 3 个类的任务。如果测试集被平均划分(每类 33% 的示例),但验证集划分不佳(比如 80% 的类 1、10% 的类 2、10% 的类),那么这将导致相同的现象。我不确定如何为您的问题设计这种情况,但也许故意不平衡验证集可能会实现。
    • 是的,我明白了。现在我正在开箱即用地思考,这些用户有可能将公共测试集混合到训练集中并训练整个东西。这样做你会在公共测试集上做得很好,因为它会过拟合。
    猜你喜欢
    • 2015-04-22
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    相关资源
    最近更新 更多