【问题标题】:Xgboost - Do we have to convert integers to factors if they are only 0 & 1Xgboost - 如果整数只有 0 和 1,我们是否必须将它们转换为因子
【发布时间】:2017-02-19 10:30:14
【问题描述】:

我在一个数据框中有很多列是标志“0”和“1”。当我导入数据框时,它们属于“整数”类。

0 表示不存在,1 表示存在于所有列中。

我需要将它们转换为因子吗?[因子将成为 1 和 2 级,而目前它们几乎是相似的 0 和 1,尽管是整数]

我计划稍后使用 xgboost 来构建预测模型。 Xgboost 仅适用于数字列,因此如果我将列转换为因子,那么我需要对它们进行一次热编码以将它们转换为数字。

(附带问题:如果我们进行一次热编码以消除共线性,我们是否总是需要删除一列?)

【问题讨论】:

  • 不是问这个问题的正确论坛。你可以试试Cross Validated
  • 感谢您告诉我。
  • 我不同意@KarthikArumugham 这是一个属于 SO 范围的编程问题。
  • @abhiieor 我认为这属于推荐类别。
  • 我理解 OP 只是询问我们是否应该在他的 R 程序中使用 as.integer()as.factor() 以使 XGBoost 正常工作。根据我的理解,这比任何建议都更适合编程。

标签: r xgboost one-hot-encoding


【解决方案1】:

简短回答:视情况而定。是的,只是为了更好的变量解释。不,0/1 变量整数和因子都是一样的。

如果您问我的个人意见,那么我更倾向于是;因为您更有可能拥有一些分类变量,这些变量要么具有字符串值,要么具有超过 2 个级别或 2 个除 0 和 1 之外的整数级别。在所有上述情况下,0/1 变量整数和因子都不相同。只有 0/1 二进制级别的特定情况;整数变量和因子相同。因此,您可能希望在编码中保持一致性,甚至希望在 0/1 情况下也采用这种方式。

看到自己:

a <- c(1,2,1,2,1,2,5)
c<-as.character(a)
b<-as.factor(c)
d<-as.integer(b)

这里我只是在玩a 向量,它最终给了我:

> d
[1] 1 2 1 2 1 2 3

因此,如果您不想调试为什么将来值会发生变化,请从一开始就使用as.factor()

侧面回答:是的。搜索 model.matrix()contrasts.arg 以在 R 中完成此操作。

【讨论】:

    【解决方案2】:

    错误指出xgb.DMatrix 采用数值,其中数据是整数。

    将数据转换为数字使用

    train[] <- lapply(train, as.numeric)
    

    然后使用

    xgb.DMatrix(data=data.matrix(train))
    

    【讨论】:

      猜你喜欢
      • 2012-09-14
      • 2011-03-27
      • 2022-08-24
      • 2020-09-02
      • 1970-01-01
      • 2021-01-14
      • 1970-01-01
      相关资源
      最近更新 更多