区分过度拟合与良好预测
machine-learning
numpy
python
regression
6
0

这些是关于如何计算和减少机器学习过度拟合的问题。我认为许多机器学习的新手都会有相同的问题,因此我尝试通过示例和问题弄清楚,希望这里的答案可以帮助其他人。

我有非常少量的文本样本,正在尝试预测与它们相关的值。我已经使用sklearn计算tf-idf,并将其插入回归模型中进行预测。这为我提供了26个具有6323个功能的示例-不多。.我知道:

>> count_vectorizer = CountVectorizer(min_n=1, max_n=1)
>> term_freq = count_vectorizer.fit_transform(texts)
>> transformer = TfidfTransformer()
>> X = transformer.fit_transform(term_freq) 
>> print X.shape

(26, 6323)

将这26个6323个特征(X)和相关分数(y)的样本插入LinearRegression模型,可以得出良好的预测。这些是通过使用cross-validation.LeaveOneOut cross_validation.LeaveOneOut(X.shape[0], indices=True)留一法交叉验证获得的:

using ngrams (n=1):
     human  machine  points-off  %error
      8.67    8.27    0.40       1.98
      8.00    7.33    0.67       3.34
      ...     ...     ...        ...
      5.00    6.61    1.61       8.06
      9.00    7.50    1.50       7.50
mean: 7.59    7.64    1.29       6.47
std : 1.94    0.56    1.38       6.91

非常好!使用ngram(n = 300)而不是unigram(n = 1),会发生类似的结果,这显然是不正确的。任何文本中都不会出现300个单词,因此预测应该会失败,但不会:

using ngrams (n=300):
      human  machine  points-off  %error
       8.67    7.55    1.12       5.60
       8.00    7.57    0.43       2.13
       ...     ...     ...        ...
mean:  7.59    7.59    1.52       7.59
std :  1.94    0.08    1.32       6.61

问题1:这可能意味着预测模型过度拟合了数据。我只知道这一点,因为我为ngram选择了一个极高的值(n = 300),我知道它不能产生很好的结果。但是,如果我不具备该知识,那么您通常如何判断模型过度拟合?换句话说,如果使用合理的度量(n = 1),您如何知道良好的预测是过拟合而模型运行良好的结果?

问题2:在这种情况下,要确保预测结果是否良好,防止过度拟合的最佳方法是什么?

问题3:如果使用LeaveOneOut交叉验证,该模型如何过LeaveOneOut获得良好结果?过度拟合意味着预测准确性会受到影响-那么为什么在预测文本遗漏时不会受到影响呢?我能想到的唯一原因是:在主要为0的tf-idf稀疏矩阵中,文本之间存在很强的重叠,因为有太多的项为0-回归则认为文本高度相关。

即使您不是全部,也请回答任何问题。谢谢!

参考资料:
Stack Overflow
收藏
评论
共 1 个回答
高赞 时间 活跃

您通常如何判断模型过度拟合?

一条有用的经验法则是,当模型在其自身的训练集上的性能比在其坚持的验证集或交叉验证设置下的性能好得多时,您可能会过度拟合。但是,这还不是全部。

我链接到的博客条目描述了过拟合测试的过程:绘制训练集和验证集错误,作为训练集大小的函数。如果它们在图的右端显示出稳定的间隙,则可能是过拟合。

防止过度拟合(在这种情况下)以确保预测结果是否良好的最佳方法是什么?

使用保留的测试集 。仅当您完全完成模型选择(超参数调整)后,才对此集合进行评估。不要训练它,不要在(交叉)验证中使用它。您在测试集上获得的分数是模型的最终评估。这应该表明您是否意外地使验证集过大。

[机器学习会议有时会像比赛一样进行,在他们将最终模型交付给组织者之前不会将测试集提供给研究人员。同时,他们可以随意使用训练集,例如通过使用交叉验证测试模型。 Kaggle做类似的事情。]

如果使用LeaveOneOut交叉验证,该模型如何过LeaveOneOut获得良好结果?

因为您可以在此交叉验证设置中尽可能多地调整模型,所以在CV中几乎可以完美表现为止。

举一个极端的例子,假设您实现了一个估算器,该估算器本质上是一个随机数生成器。您可以继续尝试随机种子,直到您遇到“模型”,该模型在交叉验证中产生的错误率非常低,但是那并不是您选择了正确的模型。这意味着您已经过度适合交叉验证。

另请参阅此有趣的Warstory

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号