使用大量数据偏向一个 class 预测 classes

Predicting classes with a lot of data skewed towards one class

我对如何处理一些有趣的数据有疑问。

我目前有一些数据(计数是真实的,但情况是假的)我们可以预测人们今天将在网上购买的 T 恤数量。我们对每个人都了解很多,因为我们的特征属性每天都在变化。我们还知道前几天每个人购买了多少件 T 恤。

我想要的是一种算法,能够产生一个连续变量,即人们今天要购买的 T 恤数量的排名或“分数”。我的最终目标是,如果我能把这个分数附加到每个人身上,我就可以根据分数对他们进行排序,并在特定的UI中使用它们。目前,我一直在使用 sci-kit 的随机森林回归,其中我的目标 classes 是昨天每个人购买 T 恤的数量。效果很好,只是我的数据有点困难,因为有很多人购买了 0 件 T 恤。这是一个问题,因为我的随机森林给了我很多 0 的预测 classes,我无法有效地对它们进行排序。我明白为什么会这样,但我不确定解决它的最佳方法。

我想要的是一个非零分数(即使它是一个接近 0 的非常小的数字),它告诉我更多关于特征和预测的 class。我觉得我的一些特征一定能告诉我一些东西,给我比0更好的预测。

我认为固有的问题是使用随机森林回归作为算法。每棵树都在投票;然而,有太多的零,以至于有很多森林,其中所有的树都投票给 0。我想尝试另一种算法,但我不知道哪种算法效果最好。目前,我正在对整个数据集进行训练,并使用 scikit 提供的袋外估计。

这是数据 classes 的计数(使用 python 的计数器([target classes])。设置如下:{predicted_class_value: counts_of_that_value_in_the_target_class_list} {0: 3560426, 1: 121256, 2: 10582, 3: 1029, 4: 412, 5: 88, 6: 66, 7: 35, 8: 21, 9: 17, 10: 17, 11: 10, 12 : 2, 13: 2, 15: 2, 21: 2, 17: 1, 18: 1, 52: 1, 25: 1}

我已经尝试了一些操作训练数据的方法,但我真的在猜测要做的事情。

我尝试的一件事是根据其他数据将训练集中零的数量缩放为线性缩放的数量。因此,我没有向算法传递 350 万个 0-class 行,而是将其缩小到 250,000。所以我的训练集看起来像:{0: 250,000, 1: 121256, 2: 10582, 3: 1029, …}。这对从算法返回的 0 的数量有很大的影响。我已经从算法猜测 99% 的数据为 0 到大约只有 50%。但是,我不知道这是否是一件有效的事情,或者它是否有意义。

我尝试过的其他事情包括增加森林的大小 - 但这并没有太大的影响,告诉随机森林只对每棵树使用 sqrt 特征 - 这已经很好了效果,并使用袋外估计 - 这似乎也有很好的效果。

总而言之,我有一组数据,其中有一个 class 的数据量不成比例。我想有一些方法来生成一个连续值,该值是预测数据集中每个值的“分数”,因此我可以对它们进行排序。

感谢您的帮助!

这是一个不平衡的class问题。您可以做的一件事是 over/undersampling。欠采样意味着您从大多数 class 中随机删除实例。过度采样意味着您使用少数 class 中的替换实例进行采样。或者您可以结合使用两者。您可以尝试的一件事是 SMOTE[1],它是一种过采样算法,但它不只是从少数 class 中采样现有实例,而是创建合成实例,这将避免过度拟合,理论上会更好地概括。

[1] Chawla, Nitesh V., 等人。 "SMOTE: synthetic minority over-sampling technique."人工智能研究杂志(2002):321-357.