为什么连续变量桶过拟合模型

数据挖掘 机器学习 分类 数据挖掘 xgboost 过拟合
2022-02-27 14:17:31

在训练模型期间,我的数据集中有一个连续(高基数离散)变量 'numInteractionPoints' - 我将此功能分箱以避免过度使用,第一个顶部条形图来自训练,第二个条形图来自测试此分箱功能。两个数据集的分布与以下条形图相同

在此处输入图像描述

这就是我为此功能创建 bin 的方式

我使用基于视觉分析的简单 bin 方法将变量“numInteractionPoints”转换为 bin

bins = [0, 6, 12, np.inf]
names = ['0-6', '6-12','12+']

train_data['numInteractionPointsRange'] = pd.cut(train_data['numInteractionPoints'], bins, labels=names)
train_data['numInteractionPointsRange']=train_data['numInteractionPointsRange'].astype('object')

在这两种情况下,当我包含不带 bin 的原始变量 numInteractionPoints 并且使用上述定义的存储桶时,模型的总体 F1 分数在测试数据上从 0.47 下降到 0.33,对于 1 类。在验证数据集上它给出 0.47,而在测试中它给出 0.33 或没有垃圾箱

在此处输入图像描述

知道我缺少什么吗?这种行为在算法 Xgboost 和 catboost 中都有,目标类高度不平衡,我正在控制它 Xgboost 参数 scale_pos_weight。为什么由于定义的存储桶而导致模型过拟合,正如您在上面看到的两个数据集的条形图分布相同

1个回答

当您使用存储桶时,您会丢失一些信息。基本上,您假设变量和目标之间的关系在区间内是平坦的。当情况可能并非如此。这是弗兰克·哈雷尔(Frank Harell)列出的您通常根本不应该分类的原因列表中的第 3 点。

更具体地说,您 80% 的实例似乎都在一个存储桶中。这意味着您的算法无法了解此存储桶内发生的情况。作为一个起点,您可以使用更多的桶来检查这是否是问题所在更复杂的技术将包括样条曲线来平滑响应(去除噪声有助于不从中学习)。老实说,考虑到您使用像算法(Xgboost)这样的树,您可能应该让它选择最佳拆分,而不是通过变量分类强制执行一些拆分。那就是:根本不使用先验变量分类,通过其他参数(至少树深度)强制不存在过度拟合,如果你真的需要分类,请使用算法找到的那些。

编辑:重新阅读您的问题,您似乎在这两种情况下都过拟合了......解决方案可能更多的是关于调整您的 xgboost 参数。