预测具有大量数据偏向一类的类

Posted

技术标签:

【中文标题】预测具有大量数据偏向一类的类【英文标题】:Predicting classes with a lot of data skewed towards one class 【发布时间】:2015-11-18 06:58:09 【问题描述】:

我有一个关于如何处理一些有趣数据的问题。

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

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

我想要的是一个非零分数(即使它是一个接近 0 的非常小的数字),它可以告诉我更多关于特征和预测类别的信息。我觉得我的一些特征一定能告诉我一些事情,给我比0更好的预测。

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

以下是数据类的计数(使用 python 的 Counter([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 类行,而是将其缩小到 250,000 个。所以我的训练集看起来像:0: 250,000, 1: 121256, 2: 10582, 3: 1029, ... 。这对从算法返回的 0 的数量有很大的影响。我已经从算法猜测 99% 的数据为 0 到只有大约 50%。但是,我不知道这样做是否有效,或者是否有意义。

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

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

感谢您的帮助!

【问题讨论】:

【参考方案1】:

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

[1] Chawla,Nitesh V.,等人。 “SMOTE:合成少数过采样技术。”人工智能研究杂志(2002):321-357。

【讨论】:

感谢您的洞察力。这真的很有帮助,它让我找到了一些很棒的文档。

以上是关于预测具有大量数据偏向一类的类的主要内容,如果未能解决你的问题,请参考以下文章

具有分类数据的一类支持向量机

可能过度拟合的分类树,但具有稳定的预测误差

初步学习Scikit-learn(sklearn)

利用多元线性回归法,从大量数据中提取五个因变量来预测一个自变量—Jason niu

具有大量数据的数据网格使用啥?

聚类分析