如何确定ML模型是否过度拟合了数据集?

时间:2019-04-25 07:15:19

标签: python machine-learning machine-learning-model

我一直在比较sklearn的不同回归模型。这样做时,我对我得到的模型的得分值感到困惑。 在代码下面,您可以看到我同时使用了线性回归和岭回归,但是训练和测试数据集的得分值差异相差很大。

using Linear Regression

from sklearn.linear_model import LinearRegression as lr
model = lr()
model.fit(X_train, y_train)
model.predict(X_test)
print("LINEAR REGRESSION")
print("Training Score", end = "\t")
print(model.score(X_train, y_train))
print("Test Score", end = "\t")
print(model.score(X_test, y_test))

------------------------------------------------------------
O/P
LINEAR REGRESSION
Training Score  0.7147120015665793
Test Score  0.4242120003778227


Using Ridge Regression

from sklearn.linear_model import Ridge as r
model = r(alpha = 20).fit(X_train, y_train)
model.predict(X_test)
print("RIDGE REGRESSION")
print("Training Score", end = "\t")
print(model.score(X_train, y_train))
print("Test Score", end = "\t")
print(model.score(X_test, y_test))

-----------------------------------------------------------
O/P
RIDGE REGRESSION
Training Score  0.4991610348613835
Test Score  0.32642156452579363

我的问题是,训练和测试数据集的得分值之间的较小差异是否意味着我的模型是通用化的,并且对于测试和训练数据均适用(不是过拟合),还是意味着其他东西。 如果确实有其他问题,请解释。

“ alpha”值如何影响岭回归模型? 我是初学者,所以请尽一切可能做简单的解释。

谢谢。

2 个答案:

答案 0 :(得分:0)

也许您可以为您model.fit添加一个单独的验证集,或者像keras docs of the fit method中那样设置validation_split参数,但我不知道sklearn中是否存在类似的内容工具包。

但是通常来说,验证集或测试集与训练集的分数应几乎相等,否则模型可能会过度拟合。

还有许多指标可用于评估模型。我建议使用book Oreilly Deep Learning Page 39。有一个很好的解释。

或者看看herehere

或者看看here chapter 5.2

随时问其他问题。

答案 1 :(得分:0)

扩展Max的答案,当训练模型对训练数据建模得太好时,过度拟合是一个建模错误。现在,这通常发生在模型足够复杂(高VC维度)以至于它学习到非常复杂的细节和噪声时,会对最终性能产生负面影响。 VC Dimension Caltech Lecture on VC Overfitting观察过度拟合的一种简单方法是查看训练结果与测试结果之间的差异。

回到您的示例,线性回归的测试数据与训练数据之间的得分差为0.290。而岭回归的差异为0.179。仅凭这一个实验,就很难判断模型是否过拟合,因为通常在实践中总会存在一些差异。但是在这里,我们可以说,脊回归对于该数据集的拟合度较小。

现在,在决定选择哪种模型时,除了过度拟合自身之外,我们还必须考虑其他因素。在这种情况下,线性回归在测试数据集上的性能要比Ridge回归高10%,因此您也必须考虑到这一点。下一步应该是使用不同的验证技术并微调不同的超参数进行进一步的实验。