使用许多分类变量改进分类

机器算法验证 机器学习 分类 分类数据 随机森林 多类
2022-02-08 14:21:27

我正在处理一个包含 200,000 多个样本和每个样本大约 50 个特征的数据集:10 个连续变量,其他约 40 个是分类变量(国家、语言、科学领域等)。对于这些分类变量,您有例如 150 个不同的国家、50 种语言、50 个科学领域等......

到目前为止,我的方法是:

  1. 对于每个具有许多可能值的分类变量,只取具有超过 10000 个样本的那个取该值。这减少到 5-10 个类别而不是 150 个。

  2. 为每个分类变量构建虚拟变量(如果有 10 个国家,则为每个样本添加一个大小为 10 的二进制向量)。

  3. 用这些数据提供一个随机森林分类器(交叉验证参数等)。

目前使用这种方法,我只能获得 65% 的准确率,而且我觉得可以做得更多。特别是我对我的 1) 不满意,因为我觉得我不应该根据他们拥有的样本数量任意删除“最不相关的值”,因为这些较少表示的值可能更具辨别力。另一方面,我的 RAM 无法通过保留所有可能的值来向数据添加 500 列 * 200000 行。

您对处理这么多分类变量有什么建议吗?

4个回答
  1. 随机森林应该能够本地处理分类值,因此请寻找不同的实现,这样您就不必对所有这些特征进行编码并耗尽所有内存。

  2. 高基数分类特征的问题是很容易过度拟合它们。您可能有足够的数据,这不是问题,但要小心。

  3. 我建议使用Breiman 提出的方法或人工对比研究基于随机森林的特征选择人工对比方法 (ACE) 很有趣,因为它将特征的重要性与自身的洗牌版本的重要性进行了比较,从而解决了一些高基数问题。有一篇新论文“Module Guided Random Forests”,如果你有更多特征,它可能会很有趣,因为它使用了一种特征选择方法,它知道高度相关的特征组。

  4. 另一个有时使用的选项是调整算法,以便它使用袋外案例在将拆分拟合到袋内案例后进行最终特征选择,这有时有助于对抗过度拟合。

这里有一个几乎完整的 ace 实现,我有一个内存效率更高/速度更快的 RF 实现,可以在此处本地处理分类变量...... -evaloob 选项支持选项 4 我正在努力添加对 ACE 和其他几个 RF 的支持基于特征选择方法,但还没有完成。

您为什么不简单地为每个类别使用一个数字变量,而不是使您的类别变得愚蠢?在随机森林的背景下,我经常想知道这样做的后果(因为我同意在分类数据中引入序数听起来很可疑,如果通常没有意义),但在实践中(至少使用我一直在使用的 RF 的 scikit-learn 实现),我经常观察到它对结果没有影响(但我不确定为什么)。

我认为你应该考虑一种/更多的变量减少技术它摆脱了不那么有影响力的预测因素。

我已经阅读了很多有关数据预处理的内容,它是减少变量 n° 的绝佳解决方案。

我的建议如下:

  • 对于定性变量,将缺失值替换为“缺失”类别。如果数据没有随机丢失,它可能会引入偏差,但至少你的所有观察结果都会完好无损,并且丢失可能会揭示不同的行为。
  • 消除零方差预测变量接近零方差预测变量(注意不要消除可以有效分离 Y 的高度不平衡类别的虚拟变量。为您认为可能重要的变量制作一些图表)。在 R 中,您可以使用包中的'nzv'函数'caret'这将大大减少您的数据维度。
  • 消除相关的预测因子使用Kendall 的相关矩阵,因为它更适合在存在分类变量的情况下构建。缺点是您必须将所有名义变量转换为分类变量。
  • 有一些特征选择方法可以进一步减少它们的数量(聚类 - 您选择每个聚类的单个代表,LASSO 回归等......)。我还没有机会测试它们,因为其他步骤将我的变量减少到 100 以下。

另外,我建议使用AdaBoost 算法而不是 RF。就个人而言,我所做的研究为这两种方法提供了非常相似的基尼系数。AdaBoost 的优点在于,在 R 中,它可以处理缺失的观察结果。所以你可以跳过这个列表的第一步

我希望它有一点帮助。祝你好运

您可能需要考虑混合效应模型。由于它们在高基数分类数据上的表现,它们在社会科学中很受欢迎,我已经使用它们制作了出色的预测模型,其性能优于流行的机器学习方法,如梯度提升树、随机森林和弹性网络正则化逻辑回归。最著名的实现是 R 的 lme4 包;您用于分类的函数是 glmer,它实现了混合效应逻辑回归。您可能在缩放到数据集时遇到问题,但我已经完成了 80k 行和 15 个特征,没有太多困难。