当前位置: 首页 > 知识库问答 >
问题:

XGBoost/CatBoost中具有大量类别的类别变量

谭富
2023-03-14

我有一个关于随机森林的问题。想象一下,我有用户与项目交互的数据。项目数量很大,大约10 000个。我的随机森林输出应该是用户可能与之交互的项目(如推荐系统)。对于任何用户,我想使用一个描述用户过去交互过的项目的功能。然而,将分类产品功能映射为一次热编码似乎非常缺乏内存效率,因为用户最多只能与几百个项目进行交互,有时甚至只有5个。

当其中一个输入特征是一个有大约10 000个可能值的分类变量,而输出是一个有大约10 000个可能值的分类变量时,你将如何构建一个随机森林?我应该使用CatBoost与功能作为分类?或者我应该使用一次编码,如果是这样,你认为XGBoost或CatBoost做得更好吗?

共有3个答案

秦昊穹
2023-03-14

假设您有足够的领域专业知识,您可以从现有列创建一个新的分类列。ex:-如果列具有以下值

A,B,C,D,E,F,G,H

如果你知道A,B,C是相似的,D,E,F是相似的,G,H是相似的,那么你的新列就是

Z,Z,Z,Y,Y,Y,X,X.

在随机林模型中,您应该删除上一列,而只包括此新列。通过像这样变换你的特征,你会失去模式的可解释性。

隆礼骞
2023-03-14

XGBoost不直接支持分类功能,您需要进行预处理才能将其用于catfeatures。例如,您可以进行一次热编码。如果您的cat功能有一些频繁的值,一个热编码通常可以很好地工作。

CatBoost确实支持分类功能,包括一个热编码和分类功能不同统计数据的计算。要使用一个热编码,您需要使用一个\u hot\u max\u size参数启用它,默认情况下会计算统计信息。对于具有多个值的分类特征,统计通常更有效。

仲孙景胜
2023-03-14

您还可以尝试实体嵌入,将数百个布尔特征减少到小维度的向量中。

对于分类特征,它类似于单词嵌入。实际上,您定义了将离散特征空间嵌入低维向量空间。它可以增强结果并节省内存。缺点是您确实需要先训练神经网络模型来定义嵌入。

查看本文以了解更多信息。

 类似资料:
  • 我有一个关于Catboost的问题。在建模之前,我是否要预处理分类? 如果我有86个变量,包括1个目标变量。在这85个变量中,有2个数字变量和83个分类变量(type)。目标变量是二进制因子,1或0。 第1列和第4列至第85列为系数类型 第2列和第3列是数字。 我对

  • 问题内容: 我想这样创建一个别名: 因此,如果有人输入: 它只会显示目录中的最后10个文件。 但似乎对我不起作用。有什么办法可以在bash中引入变量。 问题答案: 我会为此创建一个函数,而不是别名,然后将其导出,如下所示: 注意切换到:它告诉您您正在导出函数。把它放进去,你就很好了。

  • 我想在前端获得所有woocommerce类别的子类别,结果如下: 这是我所拥有的(但不是我想要的): 这段代码显示了类别和子类别,但是子类别不在应该在的地方,子类别就像这样的单独链接:

  • 问题内容: 我已经在Python的Stack Exchange上阅读了很多答案,为什么在类中使用“ self”? 阅读这些答案后,我了解到实例变量对于该类的每个实例都是唯一的,而在所有实例之间共享类变量。 在玩耍时,我发现这段代码给出了输出: 但是,此代码作为输出,在我看来应为: 为什么我运行时类变量没有更新?我没有编程方面的经验,所以请原谅。 问题答案: 类变量 被 实例属性 遮盖 。这意味着在

  • 本文向大家介绍Ruby类实例变量、类实例方法和类变量、类方法的区别,包括了Ruby类实例变量、类实例方法和类变量、类方法的区别的使用技巧和注意事项,需要的朋友参考一下 在Ruby中类实例变量、类实例方法和类变量、类方法的区别比较微妙,而且用法也有相当的区别。本文探讨一下他们的定义和基本的使用场景,以抛砖引玉...   一.类实例变量和类变量   类变量大家都很熟悉了,就是在类定义中用@@开头的变量

  • 我需要定义一个类和大量实例(超过30个,但代码中给出了其中的3个),以便能够在python模块文件之间共享它们。我对以下代码有问题(简化): 它给出了错误: 我试图在类中定义实例,以避免为它们定义实例并使代码变长。 通过一个类定义30多个实例的pythonic方法是什么?定义类中的实例的解决方案是什么? file1.txt的内容: