在对测试数据进行最终评估后删除特征

数据挖掘 机器学习 特征选择 随机森林 过拟合
2021-10-07 13:47:33

如果我在此过程中犯了统计或机器学习方面的不当行为,请告诉我?

我想从 x1,...,x10变量。我使用来自不同气象站的数据。我保留一些气象站作为测试站点/数据。

我通过对训练数据的交叉验证进行特征选择和超参数调整。我的模型是随机森林 (RF) 和另外两个基于树的模型。

在我在测试站点上评估我的模型之前,我对保留其中一项功能持怀疑态度:气象站的高程x10. 这是一个静态特征,在与站点相关的所有数据行中都存在/相同。对 RF 有一点了解让我担心模型会将其用作一种“site_id”,并可能过度拟合此功能。如果我使用线性/非线性回归模型,我不会担心。

所以我训练我的模型一次有一次没有x10作为一个特点。

然后我在测试站点上评估我的模型,结果发现模型没有x10在测试站点上做得更好。

甚至在测试这个关于静态特性的假设之前,我也想做类似的测试,同时删除其他特性,比如x9.

现在我的问题是:现在我知道了x10伤害了我的模型,我喜欢重新训练我的模型x10并在有和没有的情况下测试模型性能x9在过滤的特征集中。

对我来说,我似乎在使用我的测试数据来过滤掉我的功能,所以这是不对的。但是,我有这些信息,如果x10最终伤害了我的模型,我为什么要继续测试假设并准备我的模型x10在他们里面?

2个回答

您正在做的是基于测试集的手动特征选择。你是对的,这样做是不正确的:理论上,特征选择应该只使用训练集和验证集,而不是最终的测试集。风险在于数据泄漏:您正在使用来自测试集的信息修改模型。如果在测试集上没有这些特性,性能可能会更好,因为它们碰巧对这个特定的当前测试集不利。结果,模型可能会过拟合,并且您将无法在此测试集上检测到此问题,因为它是过拟合的根源。

所以原则上最好先分离数据,将测试放在一边,直到最终评估,并使用验证集进行中间评估,直到确定最终模型(包括特征集)。

在实践中,有时我们会意识到在将模型应用于最终测试集之后我们应该做一些不同的事情。这是一个错误,但这不是世界末日,通常偏见的风险很低。正如您所说,显然我们不必忽略对模型性能很重要的信息。但是,如果您知道要使用多个功能重复此过程,则绝对应该使用单独的验证集(取自训练数据)而不是测试集来执行此操作:像这样使用测试集的次数越多,数据泄露和偏差的风险越高。

这是通常被称为“数据泄漏”的一个很好的例子——你正在将测试集的信息流回你的模型集。一定程度的这种情况是不可避免的,这就是为什么(尤其是对于深度学习)问题数据科学家经常将数据集拆分为训练、验证和保持集的原因。验证/测试集用于在使用最终保持集评估准确性之前进行您正在谈论的那种简约模型调整。

顺便说一句,听起来你是对的,海拔可能是一个过拟合的特征。在不完全丢失实际高程信息值的情况下解决该问题的一种方法是将要素转换为箱,每个箱中可能包括多个观察值。