【问题标题】:How to deal with the categorical variable of more than 33 000 cities?33000多个城市的分类变量如何处理?
【发布时间】:2020-09-10 12:20:27
【问题描述】:

我在 Python 中工作。我对分类变量 - “city” 有疑问。

我正在一个大型数据集(超过 100 万行)上构建预测模型。 我有超过 100 个功能。其中之一是“城市”,由 33 000 个不同的城市组成。

我使用例如XGBoost 我需要将分类变量转换为数字。虚拟化会导致特征数量大幅增加。 XGBoost(和我的 20 GB RAM)无法处理。

除了例如,还有其他方法可以处理这个变量吗?一个热编码,假人等? (例如,当使用 One Hot Encoding 时,我遇到了性能问题,我的模型中的特征太多并且内存不足。)

有什么办法可以解决吗?

【问题讨论】:

  • 你能说得更具体点吗?显示一些代码?没有您使用的库的信息。
  • 我使用 xgboost。我在预测公寓的价格。目前我正在跳过包含城市的专栏,所以我不对其进行任何操作。我想将它包含在功能集中,但我不知道如何处理这么多类别。我使用的唯一解决方案是例如LGBM,处理分类变量。

标签: python xgboost forecasting


【解决方案1】:

除了模型之外,您还可以通过按地理区域对要素(城市)进行分组来减少它们的数量。另一种选择是按人口规模对它们进行分组。

另一种选择是使用分位数箱按频率对它们进行分组。目标编码可能是您的另一种选择。

在许多情况下,特征工程涉及大量手动工作,不幸的是,您不能总是自动整理好所有内容。

【讨论】:

    【解决方案2】:

    XGBoost 从 1.3.0 版开始还添加了对分类编码的实验性支持

    another question复制我的答案。

    2020 年 11 月 23 日

    XGBoost 自 1.3.0 版起添加了对分类特征的实验性支持。来自文档:

    1.8.7 分类数据

    除了用户执行编码,XGBoost 有实验性支持 对于使用 gpu_histgpu_predictor 的分类数据。没有特别的 需要对输入的测试数据进行操作,因为信息 about categories 在训练期间被编码到模型中。

    https://buildmedia.readthedocs.org/media/pdf/xgboost/latest/xgboost.pdf

    在 DMatrix 部分,文档还说:

    enable_categorical(布尔值,可选)- 1.3.0 版中的新功能。

    专门针对分类特征的实验性支持。不要 设置为 True 除非您对开发感兴趣。目前是 仅适用于 1 vs rest (one hot) 的 gpu_hist 树方法 分类分裂。此外,JSON 序列化格式、gpu_predictor 和 熊猫输入是必需的。

    其他型号选项:

    如果您不需要使用 XGBoost,您可以使用像 LightGBMCatBoost 这样的模型,它们支持分类编码,而无需使用 one-hot-encoding盒子。

    【讨论】:

      【解决方案3】:

      您可以使用某种嵌入来更好地反映这些城市(并通过直接 OHE 压缩总特征的数量),也许使用一些特征来描述每个城市所属的大陆,然后使用一些其他特征来描述国家/地区等

      请注意,由于您没有提供有关此任务的任何具体细节,因此我在示例中仅使用了地理数据,但您可以使用与每个城市相关的其他一些变量,例如平均温度、人口、区域等,具体取决于您在此处尝试解决的任务。

      另一种方法是用坐标(纬度和经度)替换城市名称。同样,这可能会有所帮助,具体取决于您的模型的任务。

      希望对你有帮助

      【讨论】:

      • @TigerJ 这能回答你的问题吗?
      猜你喜欢
      • 2023-03-14
      • 2021-12-14
      • 1970-01-01
      • 2010-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-06
      • 2014-09-02
      相关资源
      最近更新 更多