如何在二元分类/回归问题中找到最佳样本权重

数据挖掘 回归 阶级失衡 正常化
2022-03-03 16:07:06

我正在训练一个模型(NN),它获取一些数据作为输入并输出范围内的单个值[0,1]. 目前,我的数据集中输出的平均值在 0.5 左右,但我知道未来的数据将主要由 0.0 组成,因此最终会出现向 0.0 的强烈数据不平衡。我希望训练过程是面向未来且可扩展的,因此我试图找到一种自动重新平衡数据集的方法。我的库(Keras)支持训练中的样本权重,这似乎是一种不丢失任何信息的直接方法。

基本上,我认为我正在寻找的是一个功能w(yi)wi给定一个训练例子yi给我一个重量wi, 使得所有训练样例的加权平均Y与权重W0.5. 我知道有许多具有此属性的权重配置,但当然权重应该尽可能接近 1,并且绝对>0. 我也意识到这对于例如所有数字都相同或所有数字都相同的情况是不可能的<0.5. 但是让我们假设我的数据足够多样化。

我确定我不是第一个想到这一点的人,但我找不到任何解决方案/最佳实践。我想我可以把它当作它自己的一个小优化问题,但我希望有更简单的东西。

2个回答

有一些事情不清楚,所以我将不得不做出一些假设。

你说这是二元分类/回归。您是否试图找到每个二元类的概率?

当您说“未来数据”时,您是指未来的训练数据还是未来的测试数据?如果是测试数据,那么你完全不用担心他的影响。如果是未来的训练数据,那么是的,您可能会遇到问题。您不想在与您在生产模型中实际使用的训练集不同的训练集上进行模型构建。我建议您为此案例制作一些验证图。

如果你真的在做二进制分类。python 中的大多数模型都有一个方法(例如predict_proba()),它将产生一个概率,并让您根据该概率决定类别。默认值为 50%。出于这个原因,我认为您不希望加权平均值为 0.5,但“概率”代表真实概率。请参考本教程http://scikit-learn.org/stable/modules/calibration.html

至于你原来的问题。你希望权重是M/Ni在哪里Ni是每个类中的样本数iM样本总数。这是一种进行某种伪上采样并使类按样本数量加权的方法。

这是一个有趣的问题,因为很明显,您想要训练一个在看不见的数据上表现良好的模型,因此您希望在类似于您稍后会遇到的数据上训练它。

如果您已经知道数据的真实分布。我会使用 Keith 在评论中提到的内容。在该数据的直方图上拟合曲线,并将其倒数用作权重。

如果您知道分布的真实均值,您还可以做的是构建某种类型的“鉴别器”,它会猜测数据点是落在均值的“左侧”还是“右侧”。由于您的数据是倾斜的,您还可以使用中位数的鉴别器,它可能会表现更好。

然后,您可以为均值的每个“边”构建模型。由于您的数据严重偏斜,因此您将有很多数据用于其中一个,而另一个则没有那么多。

最后,您可以拥有一个最终模型,该模型将鉴别器(数据点向左或向右移动的确定程度)和两个模型的输出作为输入。最终模型应该消除鉴别器和两个模型所犯的一些错误。