模型中的过拟合问题

数据挖掘 机器学习 Python 回归 过拟合
2022-02-24 06:27:43

鉴于其功能,我正在制作一个预测汽车价格的项目。我能够抓取超过 13000 个示例。在清理和处理数据之后,我留下了超过 11000 个示例,我使用了汽车的 12 个特征,比如里程、年份、品牌和所有其他重要的东西。模型选择后,我决定使用随机森林来预测模型。有几个问题让我很感兴趣:

1)调整模型时,我能在测试集上得到的最好是平均绝对误差超过 2200。R_2 得分为 0.92,训练集误差为 900-1000。R_2 得分为 0.98 我无法消除这种过度拟合,如果是,我认为是这样。我尝试使用不同的参数对 bagging、森林甚至提升进行网格搜索(我知道它减少了偏差,而不是方差,但我很绝望),但是具有最佳参数的测试误差和训练误差始终大致相同。我也使用了简单的估计器,但它们在训练和测试中存在太多偏差。我知道有一种方法可以摆脱这种过度拟合,只要我有更多数据,但这些数据是我可以从我抓取的页面中获得的最大数据。所以第一个问题是:是否存在没有适当的大数据集就无法解决过拟合的情况?我被困在这种情况下吗?

2)第二个可选问题是:数据中的一些特征是分类的,所以在创建虚拟变量之后,我有大约 120 个特征。有趣的是,在我对 PCA 需要的缩放之后,我使用任意 n_components 保留的方差与我从仅在连续特征上而不是在虚拟上缩放的数据中保留的方差完全不同。我知道缩放虚拟变量没有意义,而且不是少数。但是在缩放虚拟变量之后,为了保留 99% 的方差,我需要大约 110 个特征(最初是 120 个),在缩放连续特征之后,为了保留 99% 的方差,我需要不到一半的特征(~55 )。这对我来说很奇怪,我无法理解这种行为,完全可以吗?

2个回答

过度拟合是指测试分数远低于训练分数,而后者很高。在这里你的测试分数是 0.92,这根本不是 bat,所以根据这个分数,这里没有过度拟合。要看到这一点,您可以将数据集的一部分用作验证集。这样,您将能够评估训练分数、测试分数和验证分数。

在同样的想法中,您可以使用交叉验证(如果您在此处使用 scikit ),它将您的数据集分成 k 折叠,其中 k-1 将用于训练,1 用于测试。然后重复此过程,以便将每个折叠用作测试集。

如果每次迭代的分数都不同,这可能意味着您过度拟合,如果不是,那么您可以说您的模型是稳健的

对于第二个问题,连续特征是什么意思?

我只回复第一个:

是的,在所有实际问题中,过度拟合是不可避免的。

原则上,每个模型都可能导致过拟合。过度拟合是你只能限制而永远不能消除的东西。这是因为给定任意数量的参数(在随机森林的情况下为树或迭代),您可以获得约 100% 的训练集匹配。

现在,在训练集包含宇宙中存在的所有样本的假设情况下,您可以使用该模型。

但正如你所知,这是不可能的。

因此,在现实生活中,您只有所有可能的现有数据的一小部分样本,您必须限制您的模型以便仅捕获数据的最重要特征,并留下细节(您的模型无法捕获)在后面。

模型试图在训练数据集中捕获的细节越多,它们就越有可能是训练集中实际存在的模式/结构,但通常不成立,因此模型无法与看不见的数据。

例如:假设您使用数据集训练猫分类器,其中一小部分图片显示沙发上的猫。如果你训练得太深,模型会得出结论,坐在沙发上是猫的特征,这当然是错误的。而如果你更保守,并且你训练模型的深度不够,你的模型将忽略细节“沙发”,专注于影响大多数猫的细节,这将导致你的模型更好地泛化。

在这里数据量有帮助:你拥有的越多,这些细节对模型就越明显。按照上面的例子,如果你的数据集中有很多沙发上不同的东西/动物的图片,它可以更好地解释沙发上的东西,因此可以进行深度训练,或者使用更多参数,从而增加它在训练集上的表现,同时在测试集上也保持良好的表现。