如何识别 Python 中的过拟合和欠拟合

Posted

技术标签:

【中文标题】如何识别 Python 中的过拟合和欠拟合【英文标题】:How to recognize Overfitting and underfitting in Python 【发布时间】:2019-02-08 17:39:03 【问题描述】:

我有一个回归模型。我写了这个算法的代码:

将训练数据随机分成 10 个,分成训练数据和验证数据。从以下集合中选择最佳 alpha 值:0.1, 1, 3, 10, 33, 100, 333, 1000, 3333, 10000, 33333。

要选择最佳的 alpha 超参数值,您必须执行以下操作:

• 对于每个超参数值,如上所述,将训练数据随机拆分为训练和验证数据 10 次。

• 对于超参数的每个值,使用其 10 次随机分割并找到平均训练和验证准确度。

• 在图表上,绘制平均训练准确度(红色)和平均验证准确度(蓝色)w.r.t。每个超参数设置。通过识别过度拟合和欠拟合的区域来评论此图。

• 打印 alpha 超参数的最佳值。

2- 评估测试数据的预测性能并报告以下内容: • 最终模型中非零特征的总数。 • 混淆矩阵 • 每个类别的精确度、召回率和准确度。

最后,通过适当的推理讨论是否存在欠拟合或过拟合的迹象

我写了这段代码:

print('Accuracy of logistic regression classifier on test set: :.2f'.format(Newclassifier.score(X_test, y_test)))
from sklearn.metrics import classification_report
print(classification_report(y_test, y_pred))        

我的问题是: 1-为什么每次迭代的准确性都会降低? 2- 我的模型是过拟合还是欠拟合? 3- 我的模型工作正常吗?

【问题讨论】:

【参考方案1】:

没有官方/绝对的指标来决定你是欠拟合还是过拟合。在实践中

欠拟合:你的模型太简单了。训练集和验证集之间没有太大区别,但是它们的准确率会很低 过拟合:你的模型太复杂了。它不是学习底层模式,而是记住你的训练集。因此,训练误差会减少,但验证误差会在某个时间点后开始增加

在你的情况下,你的训练和测试错误似乎是并行的,所以你似乎没有过度拟合的问题。您的模型可能欠拟合,因此您可以尝试使用更复杂的模型。然而,这可能是这个算法在这个特定的训练集上的表现。在大多数实际问题中,没有算法可以达到零误差。

至于你的错误增加的原因,我不知道这个特定的算法是如何工作的,但由于它似乎依赖于随机方法,它似乎是合理的行为。它有点上升和下降,但它并没有稳步增加,所以它似乎没有问题。

【讨论】:

以上是关于如何识别 Python 中的过拟合和欠拟合的主要内容,如果未能解决你的问题,请参考以下文章

如何诊断长短期记忆网络模型的过拟合和欠拟合?

数学模型的过拟合和欠拟合

第17章 发现过拟合和欠拟合

在调整参数时识别交叉验证的 SVM 中的过拟合

模型评估之过拟合和欠拟合

识别 SVM 中可能的过拟合