使用经验贝叶斯生成预测器时的信息泄漏

数据挖掘 分类 过拟合 贝叶斯 数据泄露
2022-02-12 08:53:54

考虑以下问题:我想预测一组棒球运动员的下一击球棒。我有一个训练数据集,其中包含棒球运动员的历史球拍记录(0-1 编码,这是我们的目标变量)、球员的 id、他们的姓名、薪水等,作为预测变量。我有一个独立的测试数据集。我使用对数损失函数作为模型的评估。我不确定我在下面描述的问题是否特定于日志丢失功能。

请注意,可以只使用仅包含玩家 ID 和他们的蝙蝠记录的所有训练数据集,并使用经验贝叶斯方法来计算每个玩家的击球率,例如,形成一个先验(例如二项式)并使用观察到的蝙蝠记录来计算每个玩家的后验概率。然后用这个概率对测试数据集进行预测。这种方法是合理的,特别是如果你没有其他预测因素,比如球员的年龄、薪水等。

首先,现在有了其他预测器,可以运行一些复杂的机器学习模型。对于特征工程,我有以下问题。我还可以计算我刚刚为每个玩家描述的经验贝叶斯概率,并将这个概率作为预测变量之一。我被告知这会导致信息泄露,因为这个预测器是我想要预测的目标变量的函数。因此,这将导致过度拟合,并使模型的泛化性变差。我隐约明白这一点,但仍然希望有人能清楚地解释这个想法我的困惑是,如果仅使用经验贝叶斯概率(不使用任何机器学习模型)进行预测是一个合理的想法,那么为什么将这个变量放在机器学习模型中会导致信息泄漏问题呢?事实上,我只是将这个经验贝叶斯概率放入我的一组预测变量中,并且该模型在测试数据集上的表现比我将这个预测变量从我的测试预测变量中踢出要差得多。我检查了训练错误率,结果非常好,这表明存在严重的过度拟合问题。我想了解这里为什么会出现过拟合,驱动这种过拟合的底层机制是什么。

其次,我在网上找到了一种解决此问题的方法,该方法没有解释原因,但效果很好。思路如下:

将训练数据集随机分成 5 折(如交叉验证)并将它们标记为文件夹 1、2、3、4、5,然后对于每次迭代(总共 5 次迭代),我们执行以下操作:对于迭代 1,我们使用折叠 2,3,4,5 以计算每个玩家的经验贝叶斯概率,然后将结果映射到文件夹 1 中的玩家比如球员凯文,他在所有训练数据集中的击球概率是 0.23,但使用 2,3,4,5 的折叠,他的击球概率是 0.34。然后,每当 Kevin 出现时,这个 0.34 被分配给弃牌 1(假设我们只有 1 个 Kevin)。如果某个玩家只出现在第 1 次弃牌中,但没有出现在其余弃牌中,那么只需分配 0.5 给这个人。在迭代 2 中,我们使用折叠 1、3、4、5 来计算每个玩家的经验贝叶斯概率,然后将结果映射到文件夹 2 中的玩家。我们对所有迭代都这样做。最终,在这个过程之后,我们将使用这个“奇怪的过程”为训练数据集中所有球员的击球概率生成一个新列。我用我的模型检查了它,它大大提高了测试数据集的性能. 而且我还将这个程序运行了 3 倍和 10 倍,与 (1) 不包括经验贝叶斯概率作为预测因子或 (2) 使用所有训练数据集计算经验贝叶斯概率并将其放入预测变量的集合。但是3折和10折还不如5折。我的问题是为什么这种计算经验贝叶斯概率的“奇怪程序”有效?它似乎通过仅使用部分训练数据集来计算概率来克服训练数据集的过度拟合问题注意,如果你只是想估计每个球员的击球概率,那么使用部分数据肯定会更糟而不是使用整个数据,不是吗?因此,根据我的实验,似乎在将蝙蝠概率作为预测因子来预测蝙蝠概率时,对蝙蝠概率的“更差”(或不太精确)的估计比使用更精确的蝙蝠概率更好。这似乎非常违反直觉。

第三,注意许多机器学习模型在运行模型之前需要设置超参数,例如逻辑回归中的 lambda。现在假设我想使用交叉验证调整逻辑回归中的 lambda。我还想将经验贝叶斯概率作为预测变量。我应该如何进行交叉验证程序?我似乎不能只是将数据随机分成 K 折然后去做。

为简单起见,假设我们只是设置了一小部分训练数据作为验证数据集:那么我认为正确的程序是:先拆分训练数据集,然后构造蝙蝠的经验贝叶斯概率(这个程序不应该是反转)但是,我的问题是:在我第一次拆分数据之后,然后在非验证数据集中,我应该如何构造那个经验贝叶斯概率蝙蝠列?显然根据这篇文章的第二点,我们不能只是去计算它。我们还应该按照非验证数据集的第二点所述运行那个“奇怪的程序”吗?我想我仍然在质疑为什么第二点中的“奇怪程序”有效

0个回答
没有发现任何回复~