R - 随机森林和超过53个类别

3

我知道,随机森林无法处理超过53个类别。可悲的是,我需要分析数据,其中一个列有165个级别。因此,我想使用随机森林进行分类。

我的问题是,我不能删除这些列,因为这个预测因子真的很重要,被认为是有价值的预测因子。

这个预测因子有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 ...

{btsdaf} - Imran Ali
{btsdaf} - Peter
2个回答

6

我曾经也遇到过同样的问题,以下是我能列举出来的一些技巧:

  1. 切换到另一个算法,例如使用gbm包中的梯度提升算法。您可以处理高达1024个分类级别。如果您的预测变量具有相当有区分度的参数,则还应考虑使用朴素贝叶斯等概率方法。
  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。遗憾的是,第三点不可能实现。提示2:我检查了model.matrix方法,但我想我太笨了。目前我们正在讨论一个数据框和一个具有超过53个级别的列。当我提取此列并将值转换为矩阵时,如何将此新生成的矩阵与初始数据结合使用?我将查看gbm包。 - Peter
2
一旦您将因子列转换为虚拟变量,您只需要将其列与初始数据框组合即可(如果使用model.matrix,则保持相同的行数)。我将编辑我的帖子以向您展示如何使用它的示例。 - AshOfFire
啊,我明白了。根据你的示例,我将得到一个名为mydf2的数据框,其中包含一些附加列。因此,我可以使用这个新生成的数据框并提取我需要的列。在这种情况下,只需删除名为“var1”和“var2”的列即可。有道理。但是您认为随机森林对于运行时间方面的许多因素有帮助吗?您有经验吗?您提到了GBM软件包...非常感谢! - Peter
考虑到您正在处理的数据量,您可能确实会遇到运行时问题。根据分类的目的,您可能需要放弃随机森林并考虑其他选择。在我的情况下,我有5个预测变量,包括一个具有约800个因子和一个具有约60个因子(无法减少)+ 100k观察值。我在单核笔记本电脑上使用了gbm,脚本大约花费了10-15分钟。然而,事实证明,naiveBayes提供了更快(且更好)的结果,因为在几秒钟内(具有讽刺意味的是,这两个预测变量的组合非常有区分度),所以我坚持使用这种方法。 - AshOfFire
@AshOfFire:您提供的代码是否可同时处理连续和分类变量? - stats_noob
@Noob 不,这是针对分类变量的。如果你有连续变量,我建议你事先进行桶分组。 - AshOfFire

3

使用caret包:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接