用R中的随机森林进行分类

7

我正在尝试使用randomForest进行分类,但是我一直收到错误消息,似乎没有明显的解决方案(在过去做回归时,randomForest对我非常有效)。 我已经粘贴了我的代码。 'success'是一个因子,所有的自变量都是数字。 有什么建议可以正确运行这个分类?

> rf_model<-randomForest(success~.,data=data.train,xtest=data.test[,2:9],ytest=data.test[,1],importance=TRUE,proximity=TRUE)

Error in randomForest.default(m, y, ...) : 
  NA/NaN/Inf in foreign function call (arg 1)

另外,这是数据集的一个样例:

head(data)

success duration  goal reward_count updates_count comments_count backers_count     min_reward_level max_reward_level
True 20.00000  1500           10            14              2            68                1             1000
True 30.00000  3000           10             4              3            48                5             1000
True 24.40323 14000           23             6             10           540                5             1250
True 31.95833 30000            9            17              7           173                1            10000
True 28.13211  4000           10            23             97          2936               10              550
True 30.00000  6000           16            16            130          2043               25              500

没有一个完全可重现的示例,是无法确定问题所在的。至少你应该(1)检查数据中是否有NA值,以及(2)运行traceback()来获取有关错误位置的更详细信息。 - joran
尝试将“成功”值更改为物种名称,而不是“True”。您能否展示一下srt(data)的输出? - Gago-Silva
1
看起来你已经接受了一个答案;我遇到了这个问题,发现对于分类问题,是因为我的响应变量属于 chr 类。要么执行 data$var <- as.factor(data$var),要么使用 randomForest(as.factor(data$var) ~ ., ...) 进行预测可以解决这个问题。 - Hendy
使用 lapply(your_data, class) 并检查是否存在类别为 "character" 的观测数据。 - Enrique Pérez Herrero
5个回答

9
除了显而易见的缺失值等问题,这种错误几乎总是由于数据集中存在字符性特征类型所致。理解这一点的方法是考虑随机森林的实际作用。您正在按特征对数据集进行分区。因此,如果其中一个特征是字符向量,您将如何划分数据集?您需要对数据进行分类。有多少个'male' vs. 'female' - 类别...

对于诸如年龄或价格之类的数值特征,可以通过分桶来创建类别;大于某个年龄,小于某个价格等。但是你无法只使用纯字符特征创建类别。因此,您需要将它们作为因子放入数据集中。

5

通常情况下,出现此错误信息有两个主要原因:

  1. 如果数据框包含字符向量列而不是因子列,请将您的字符列转换为因子列。

2.如果数据包含不良值,则应用随机森林也会生成此错误。头部不会显示异常值。例如:

x = rep( x = sample(c(0,1)), times = 24 )

y = c(sample.int(n=50,size = 40),Inf,Inf)

df = data.frame(col1 = x , col2 = y )

head(df)
    col1 col2
>  1    1   26
>  2    0   33
>  3    1   23
>  4    0   21
>  5    1   45
>  6    0   27

现在对df应用randomForest会导致相同的错误:
model = randomForest(data = df , col2 ~ col1 , ntree = 10) Error in randomForest.default(m, y, ...) : 在外部函数调用中出现NA/NaN/Inf(第二个参数)
解决方案:让我们识别df中的坏值。如上所述,is.finite()方法检查输入向量是否包含适当的有限值。例如:
is.finite(c(5,6,1000000,NaN,Inf)) [1] TRUE TRUE TRUE FALSE FALSE
现在让我们识别数据框中包含坏值的列并计数。
sum(!is.finite(as.vector(df[,names(df) %in% c("col2")]))) [1] 4 sum(!is.finite(as.vector(df[,names(df) %in% c("col1")]))) [1] 0
让我们删除这些记录并仅取好记录:
df1 =df[is.finite(as.vector(df[,names(df) %in% c("col2")])) & is.finite(as.vector(df[,names(df) %in% c("col1")])) , ]
然后再次运行randomForest:
model1 = randomForest(data = df1 , col2 ~ col1 , ntree = 10) Call: randomForest(formula = col2 ~ col1, data = df1, ntree = 10)

3

你是否尝试在相同的数据上进行回归分析?如果没有,请检查数据中的“Inf”值,并尝试删除它们(如果有的话),在删除NAs和NaNs之后。您可以在以下位置找到有关删除Inf的有用信息,

R有没有办法找到Inf / -Inf值?

例如,

Class V1    V2  V3  V4  V5  V6  V7  V8  V9
1   11  Inf 4   232 23  2   2   34  0.205567767
1   11  123 4   232 23  1   2   34  0.162357601
1   13  123 4   232 23  1   2   34  -0.002739357
1   13  123 4   232 23  1   2   34  0.186989878
2   67  14  4   232 67  1   2   34  0.109398677
2   67  14  4   232 67  2   2   34  0.18491187
2   67  14  4   232 34  2   2   34  0.098728256
2   44  769.03  4   21  34  2   2   34  0.204405869
2   44  34  4   11  34  1   2   34  0.218426408

# When Classification was performed, following error pops out.
rf_model<-randomForest(as.factor(Class)~.,data=data,importance=TRUE,proximity=TRUE)
Error in randomForest.default(m, y, ...) : 
NA/NaN/Inf in foreign function call (arg 1)

# Regression was performed, following error pops out.
rf_model<-randomForest(Class~.,data=data,importance=TRUE,proximity=TRUE)
Error in randomForest.default(m, y, ...) : 
NA/NaN/Inf in foreign function call (arg 1)

因此,请仔细检查您的数据。 此外:警告消息: 在randomForest.default(m, y, ...)中: 响应具有五个或更少的唯一值。您确定要进行回归吗?


1

只需将所有列转换为因子,即可避免此错误。 甚至我也面临着这个错误。 特别是某些列无法转换为因子。 我专门使用了as.factor进行转换。 最终我的代码成功运行。


0

这是因为您的一个变量有超过32个级别。 级别指一个变量的不同值。 删除该变量并重试。


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