【问题标题】:R - Random Forest and more than 53 categoriesR - 随机森林和超过 53 个类别
【发布时间】:2018-04-05 11:38:27
【问题描述】:

我知道。 RandomForest 不能处理超过 53 个类别。可悲的是,我必须分析数据,一列有 165 个级别。因此,我想使用 RandomForest 进行分类。

我的问题是我无法删除此列,因为此预测器非常重要并且被称为有价值的预测器。

此预测变量有 165 个级别,是一个因子。

有什么技巧可以解决这个问题吗?因为我们在谈论电影类型,所以我不知道。

是否有用于大数据的替代包?特殊的解决方法?像这样的..

切换到 Python 是没有选择的。我们这里有太多的 R 脚本。

非常感谢,一切顺利

str(data) 看起来像这样:

'data.frame':   481696 obs. of  18 variables:
 $ SENDERNR          : int  432 1612 735 721 436 436 1321 721 721 434 ...
 $ SENDER            : Factor w/ 14 levels "ARD Das Erste",..: 6 3 4 9 12 12 10 9 9 7 ...
 $ GEPLANTE_SENDUNG_N: Factor w/ 12563 levels "-- nicht bekannt --",..: 7070 808 5579 9584 4922 4922 12492 1933 9584 4533 ...
 $ U_N_PROGRAMMCODE  : Factor w/ 14 levels "Bühne/Aufführung",..: 9 4 8 4 8 8 12 8 4 2 ...
 $ U_N_PROGRAMMSPARTE: Factor w/ 6 levels "Anderes","Fiction",..: 5 3 2 3 2 2 5 2 3 3 ...
 $ U_N_SENDUNGSFORMAT: Factor w/ 29 levels "Bühne / Aufführung",..: 20 9 19 4 19 19 24 19 4 16 ...
 $ U_N_GENRE         : Factor w/ 163 levels "Action / Abenteuer",..: 119 147 115 4 158 158 163 61 4 84 ...
 $ U_N_PRODUKTIONSART: Factor w/ 5 levels "Eigen-, Co-, Auftragsproduktion, Cofinanzierung",..: 1 1 3 1 3 3 1 3 1 1 ...
 $ U_N_HERKUNFTSLAND : Factor w/ 25 levels "afrikanische Länder",..: 16 16 25 16 15 15 16 25 16 16 ...
 $ GEPLANTE_SENDUNG_V: Factor w/ 12191 levels "-- nicht bekannt --",..: 6932 800 5470 9382 1518 9318 12119 1829 9382 4432 ...
 $ U_V_PROGRAMMCODE  : Factor w/ 13 levels "Bühne/Aufführung",..: 9 4 8 4 8 8 12 8 4 2 ...
 $ U_V_PROGRAMMSPARTE: Factor w/ 6 levels "Anderes","Fiction",..: 5 3 2 3 2 2 5 2 3 3 ...
 $ U_V_SENDUNGSFORMAT: Factor w/ 28 levels "Bühne / Aufführung",..: 20 9 19 4 19 19 24 19 4 16 ...
 $ U_V_GENRE         : Factor w/ 165 levels "Action / Abenteuer",..: 119 148 115 4 160 19 165 61 4 84 ...
 $ U_V_PRODUKTIONSART: Factor w/ 5 levels "Eigen-, Co-, Auftragsproduktion, Cofinanzierung",..: 1 1 3 1 3 3 1 3 1 1 ...
 $ U_V_HERKUNFTSLAND : Factor w/ 25 levels "afrikanische Länder",..: 16 16 25 16 15 9 16 25 16 16 ...
 $ ABGELEHNT         : int  0 0 0 0 0 0 0 0 0 0 ...
 $ AKZEPTIERT        : Factor w/ 2 levels "0","1": 2 1 2 2 2 2 1 2 2 2 ...

【问题讨论】:

标签: r random-forest


【解决方案1】:

遇到同样的问题,这里有一些我可以列出的提示。

  1. 切换到另一种算法,例如梯度提升 gbm 包。您最多可以处理 1024 个分类级别。如果您的预测器具有相当判别性的参数,您还应该考虑概率方法,例如naiveBayes
  2. 将您的预测变量转换为虚拟变量,这可以通过使用matrix.model 来完成。然后,您可以在此矩阵上执行随机森林。
  3. 减少因子中的级别数。好吧,这听起来可能是个愚蠢的建议,但是查看具有如此“纤薄度”的因素真的相关吗?您是否可以在更广泛的层面上汇总一些模式?

编辑以添加 MODEL.MATRIX 示例

如前所述,这里有一个关于如何使用 model.matrix 将列转换为虚拟变量的示例。

mydf <- data.frame(var1 = factor(c("A", "A", "A", "B", "B", "C")),
                   var2 = factor(c("X", "Y", "X", "Y", "X", "Z")),
                   target = c(1,1,1,2,2,2))
dummyMat <- model.matrix(target ~ var1 + var2, mydf, # set contrasts.arg to keep all levels
                         contrasts.arg = list(var1 = contrasts(mydf$var1, contrasts = F), 
                                             var2 = contrasts(mydf$var2, contrasts = F))) 
mydf2 <- cbind(mydf, dummyMat[,c(2:ncol(dummyMat)]) # just removing intercept column

【讨论】:

  • 感谢@AshOfFire 遗憾的是,第 3 点是不可能的。提示 2:我检查了 model.matrix 方法,但我想我对此很愚蠢。目前我们正在谈论一个 data.frame 和一个超过 53 个级别的列。当我提取此列并将值转换为矩阵时,如何将这个新生成的矩阵与初始数据结合使用?我会检查 gbm 包。
  • 将因子列转换为虚拟变量后,只需将其列组合到初始数据框(如果使用model.matrix,您将保持相同的行数)。我将编辑我的帖子,向您展示如何使用它的示例。
  • 啊,我明白了。如您的示例所示,我将获得一个名为 mydf2 的 data.frame,其中包含一些附加列。所以我可以使用这个新生成的 data.frame 并提取我需要的列。在这种情况下,只需删除名为“var1”和“var2”的列。说得通。但是你认为 RandomForest 对运行时的许多因素有帮助吗?你有经验吗?您提到了 GBM 包...非常感谢!
  • 您可能确实面临运行时问题(考虑到您正在处理的体积)。根据您分类的目的,您可能不得不放弃 RF 并考虑替代方案。就我而言,我有 5 个预测变量,其中一个具有约 800 个因子,一个具有约 60 个因子(无法减少它们)+ 10 万个观察值。我在单核笔记本电脑上使用了gbm,脚本大约耗时 10-15 分钟。不过,naiveBayes 在几秒钟内就给出了更快(更好)的结果(具有讽刺意味的是,这两个预测变量的组合非常具有区分性),所以我坚持使用这种方法。
  • @AshOfFire :您在答案中提供的代码是否适用于连续变量和分类变量?
【解决方案2】:

使用插入符号包:

random_forest <- train("***dependent variable name***" ~ ., 
                 data = "***your training data set***", 
                 method = "ranger")
 This can handle 53 + categories.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-18
    • 2019-05-04
    • 1970-01-01
    • 2012-10-27
    • 2017-03-15
    • 2018-07-10
    • 2017-05-03
    • 2014-09-19
    相关资源
    最近更新 更多