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

Posted

技术标签:

【中文标题】XGBoost/CatBoost中具有大量类别的分类变量【英文标题】:Categorical variables with large amounts of categories in XGBoost/CatBoost 【发布时间】:2018-03-08 14:39:24 【问题描述】:

我有一个关于随机森林的问题。想象一下,我有关于用户与项目交互的数据。项目的数量很大,大约 10 000 个。我的随机森林输出应该是用户可能与之交互的项目(如推荐系统)。对于任何用户,我都想使用一个功能来描述用户过去与之交互的项目。但是,将分类产品特征映射为 one-hot 编码似乎非常低效,因为用户最多与不超过几百个项目进行交互,有时只有 5 个。

当输入特征之一是具有约 10 000 个可能值的分类变量而输出是具有约 10 000 个可能值的分类变量时,您将如何构建随机森林?我应该使用具有分类功能的 CatBoost 吗?或者我应该使用 one-hot 编码,如果是,你认为 XGBoost 还是 CatBoost 做得更好?

【问题讨论】:

这可能会在datascience.stackexchange.com 上问得更好——这似乎比代码更具理论性? 好的,我去那里试试,谢谢 【参考方案1】:

您还可以尝试使用实体嵌入来将数百个布尔特征简化为小维度的向量。

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

查看this article了解更多信息。

【讨论】:

是的,我很久没有写这个问题了,从那以后学到了很多东西,但我认为如果我回到这个问题,这将是我的方法。在我的书中嵌入真的很棒【参考方案2】:

XGBoost 不直接支持分类特征,您需要进行预处理才能将其与 catfeatures 一起使用。例如,您可以进行 one-hot 编码。如果你的 cat 特征有一些频繁的值,one-hot 编码通常效果很好。

CatBoost 确实支持分类特征 - 包括单热编码和计算分类特征的不同统计信息。要使用 one-hot 编码,您需要使用 one_hot_max_size 参数启用它,默认情况下会计算统计信息。统计数据通常更适用于具有许多值的分类特征。

【讨论】:

【参考方案3】:

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

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

如果您知道 A,B,C 相似 D,E,F 相似并且 G,H 相似 您的新专栏将是

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

在您的随机森林模型中,您应该删除前一列并仅包含此新列。通过像这样转换您的功能,您将失去对模式的可解释性。

【讨论】:

以上是关于XGBoost/CatBoost中具有大量类别的分类变量的主要内容,如果未能解决你的问题,请参考以下文章

NGBoost美国斯坦福大学团队算法介绍-作者亲测性能对比LightGBM,XGBoost,catboost

GBDT家族:GBDT家族成员的演进路劲xgboost模型lightGBMLightGBM 相对于 XGBoost 的优点catboostxgboostcatboostlightGBM对

Elasticsearch:运用scroll接口对大量数据实现更好的分页

有没有办法在不为类别制作不同的分页组件的情况下根据特定类别对产品进行计数?

如何在Django项目中组织大量页面的分页?

链接 2 UIScrollView 与不同的分页大小