我有一个关于如何处理一些有趣数据的问题。
我目前有一些数据(计数是真的,但情况是假的)我们预测人们今天在网上购买的T恤的数量。我们对每个人的功能属性都有很多了解,而且每天都在变化。我们也知道前几天每个人购买了多少件T恤。
我想要的是拥有一种能够生成连续变量的算法,该变量是该人今天要购买的T恤数量的排名或“得分”。我的最终目标是,如果我可以将这个分数附加到每个人,我可以根据分数对它们进行排序,并在特定的UI中使用它们。目前我一直在使用sci-kit进行随机森林回归,其中我的目标类别是昨天每个人购买T恤的数量。除了我的数据有点困难之外,有很多人购买了0件T恤,这一点已经很好了。这是一个问题,因为我的随机森林给了我很多预测的0级,我无法有效地对它们进行排序。我知道为什么会发生这种情况,但我不确定解决问题的最佳方法。
我想要的是一个非零分数(即使它是一个接近0的非常小的数字),它告诉我有关功能和预测类的更多信息。我觉得我的一些功能必须能够告诉我一些事情并给我一个比0更好的预测。
我认为固有的问题是使用随机森林回归量作为算法。每棵树都在投票;然而,有很多零,有很多森林,所有的树都投票给0.我想尝试另一种算法,但我不知道哪种算法效果最好。目前,我正在训练整个数据集并使用scikit提供的袋外估计。
以下是数据类的计数(使用python的Counter([目标类])。这是设置如下:{predict_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特征 - 这有很好的效果,并使用袋外估计 - 这似乎也有很好的结果。
总而言之,我有一组数据,其中一个类的数据量不成比例。我想有一些方法来生成一个连续值,它是预测数据集中每个值的“得分”,所以我可以对它们进行排序。
感谢您的帮助!
答案 0 :(得分:4)
这是一个不平衡的阶级问题。你可以做的一件事是过采样/欠采样。欠采样意味着您从多数类中删除实例。过度抽样意味着您使用少数类的替换实例进行抽样。或者你可以使用两者的组合。你可以尝试的一件事是SMOTE [1],这是一种过采样算法,但它不是仅仅从少数类中抽取实例,而是创建合成实例,避免过度拟合,理论上可以更好地推广。
[1] Chawla,Nitesh V.,et al。 “SMOTE:合成少数过采样技术。”人工智能研究杂志(2002):321-357。