如何知道模型是过拟合还是欠拟合?

机器算法验证 机器学习 交叉验证 模型 过拟合
2022-04-03 03:25:14

我知道使用交叉验证可以验证我们的模型,但也有可能我们的模型拟合不足;因此,提供错误的结果。我能想到的一种可能性是,即使在使我们的模型变得不那么复杂之后,结果也不正确,那么我们的模型可能会欠拟合,这只是一种猜测!
请写下我是否遗漏了什么或任何其他方式来确定我们的模型是过拟合还是欠拟合?

2个回答

您可以通过将拟合模型与训练数据和测试数据进行比较来确定欠拟合和过拟合之间的差异。

典型图表:

一个

b

C

d


这些图将向您展示模型的准确性,作为某些参数(例如“复杂性”)的函数,对于两个

  • 训练数据(用于拟合的数据)
  • 测试数据(数据与训练阶段分开)

人们通常会选择在test-data上表现最好的模型。如果你偏离了,那么...

  • 对于欠拟合模型,您会做得更糟,因为它们没有充分捕捉真实趋势。

    如果你得到更多的欠拟合,那么你对训练和测试数据的拟合都会更差

  • 对于过拟合模型,你会做得更糟,因为它们对噪音的反应太多,而不是真实的趋势。

    如果你得到更多的过度拟合,那么你会更好地拟合训练数据(捕获噪声,但它是无用的,甚至是有害的),但对于测试数据来说仍然更糟

执行这些步骤后,您应该清楚地看到,虽然您可能从您的选项中选择了最少欠拟合/过拟合的模型,但这并不意味着不会有其他更好的模型。

特别是:真实模型在高噪声信号比的情况下可能是过拟合模型(请参阅 https://stats.stackexchange.com/a/299523/164061

当测试和训练的准确性非常相似时,可能是欠拟合的迹象。“修复”它并通过“调整”的方式。

如果您正在训练 NN,则可以增加训练周期数,另一方面,如果您正在使用传统机器学习,例如 Logistic 回归,您可以尝试调整算法的某些参数(默认情况下)为了更好地实现这一点,在逻辑回归的情况下,它将改变 C 的不同值

IE

欠拟合的信号,然后我调整我的模型

# default
logreg = LogisticRegression(solver='liblinear', random_state=0)

性能最差,放弃

# instantiate the model
logreg001 = LogisticRegression(C=0.01, solver='liblinear', random_state=0)

它提高了性能,所以我保留它。

# instantiate the model
logreg100 = LogisticRegression(C=100, solver='liblinear', random_state=0)