【问题标题】:Can not handle categorical predictors with more than 32 categories无法处理超过 32 个类别的分类预测变量
【发布时间】:2013-11-17 02:08:59
【问题描述】:

我正在尝试使用一组 1664(列)x 208(行)的数据运行随机森林。我的因变量是保留时间(秒),我的自变量是 1664 个不同的描述符,所有不同的化合物。所有描述符都给出一个值,而不是分类变量。我正在尝试执行随机森林进行回归。但是,当我尝试使用以下代码运行它时:-

urine.rf <- randomForest(RT..seconds.~., data=urine, importance=TRUE)

我收到消息:-

randomForest.default(m, y, ...) 中的错误: 无法处理超过 32 个类别的类别预测变量。

我在网上看到你可以通过构建某种形式的 model.matrix 来解决这个问题。我对 R 完全陌生,对如何做到这一点一无所知。我已经尝试在我的 csv 文件中格式化我的单元格,以便所有单元格都是数字,但由于某种原因,它仍然会作为分类预测变量出现。我该如何解决这个问题?

RT (seconds)    1_MW    2_AMW   3_Sv    4_Se    5_Sp    6_Ss    
46.58353    155.18  7.76    11.8    20.61   12.21   32.67   0.59
46.79514    145.29  5.01    14.76   28.37   16.11   21  0.51
48.18893    169.21  7.36    13.4    23.49   13.97   34.17   0.58
49.94328    169.21  7.36    13.4    23.49   13.97   34.17   0.58
50.81087    187.33  5.51    17.87   33.59   19.32   30.17   0.53
51.3834 104.2   4.96    10.39   20.67   11.41   16.5    0.49
51.51799    125.17  8.94    7.41    14.81   8.3 27.92   0.53
52.67208    117.13  7.81    8.2 15.73   8.45    29.33   0.55
52.79043    137.18  7.22    11.59   19.12   12.13   26.33   0.61
52.79046    161.23  6.2 13.71   26.27   14.7    33.5    0.53

这就是我使用的数据库的样子。我希望 RT 成为我的 Y 变量,而其他所有内容(1_MW 和之后的所有其他变量)都成为我的自变量(有 1664)

谢谢

【问题讨论】:

  • 什么是table(apply(urine, 2, class))
  • (另外,对于 208 行来说,预测变量的数量非常可笑,但这是另一个问题!)
  • 我应用了该代码并得到:- 字符 1661 所以我猜它没有将我的数据注册为数值?
  • 是的,我知道它有大量的预测因子,这一切都是为了确定代谢物的哪些理化性质在确定保留时间时最重要,并且有很多不同的性质需要考虑哈哈
  • 是的,也就是说你有 1661 个字符向量。你是如何导入这些数据的(你使用了read.csv)?您可能选择了一个有趣的header 设置,这意味着它将您的标题解释为数据,或者您有一行包含非数字的数据。 names(urine)[1:3] 是否等于 [1] RT (seconds) 1_MW 2_AMW

标签: r random-forest


【解决方案1】:

所以,只是为了完成这个。我遇到了完全相同的问题,我花了 10 分钟才发现有隐藏的 cmets。因此:

解决方案可能是将空值解释为字符

尝试使用 na.strings 选项:

read.csv("filename.csv", na.strings=c("", "NA", "NULL"))

【讨论】:

  • 现在我收到错误Error in na.fail.default(data(dependent_variable = c(36L, 57L, 74L, 74L, : missing values in object
【解决方案2】:

请注意,使用 model.matrix 的 one-hot 编码可能会创建非常稀疏的数据集。

另一种选择是实际使用专门为高维/大容量数据集构建的最新软件包。他们使用较低级别的语言(C++ 和/或 Java)运行代码,并且在某些情况下使用并行化来加快处理速度。

我建议看看这三个:

ranger(使用 C++ 编译器)randomForestSRC(使用 C++ 编译器)h2o(Java 编译器 - 需要 Java 版本 8 或更高版本)此外,这里还有一些额外的阅读资料,可以让您更多地了解选择哪个包:https://arxiv.org/pdf/1508.04409.pdf

第 8 页显示了一些基准,显示了 ranger 对 randomForest 的性能改进,以应对不断增长的数据量 - 由于运行时的线性增长,ranger 的速度要快得多,而不是 randomForest 的非线性增长,因为树/样本/拆分/特征大小的增加。

除此之外,使用可变重要性将特征大小减少到具有最多信息的特征大小将提高模型性能/准确性。

祝你好运!

【讨论】:

    猜你喜欢
    • 2016-10-14
    • 2020-10-18
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 2023-03-17
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多