R randomForest用于分类

时间:2013-01-03 16:56:04

标签: r classification data-analysis random-forest

我正在尝试使用randomForest进行分类,但我反复收到一条似乎没有明显解决方案的错误消息(randomForest在过去做回归的过程中效果很好)。我在下面粘贴了我的代码。 “成功”是一个因素,所有因变量都是数字。有关如何正确运行此分类的任何建议?

> 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)

此外,这是一个数据集示例:

  

头(数据)

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

5 个答案:

答案 0 :(得分:8)

除了有关NAs等存在的明显事实之外,此错误几乎总是由数据集中存在字符要素类型引起的。理解这一点的方法是考虑随机森林的真正作用。您正在按功能对数据集功能进行分区。因此,如果其中一个特征是字符向量,您将如何对数据集进行分区?您需要类别来分区数据。有多少男性&#39;与女性的关系 - 类别......

对于年龄或价格等数字功能,您可以通过分段创建类别;大于某个年龄,小于某个价格等。你不能用纯粹的角色特征做到这一点。因此,您需要它们作为数据集中的因子。

答案 1 :(得分:5)

通常,您收到此错误消息有两个主要原因:

  1. 如果数据框包含字符向量列而不是因子。只需将您的字符列转换为因子
  2. 即可

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

      

    x = rep(x =样本(c(0,1)),次数= 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)

         

    randomForest.default(m,y,...)中的错误:     外国函数调用中的NA / NaN / Inf(arg 2)

    解决方案:让我们识别df中的错误值。如上所述,is.finite()方法检查输入向量是否包含适当的有限值。例如:

      

    is.finite(C(5,6,1000000,NaN时,Inf文件))
      [1] TRUE TRUE FUE FALSE FALSE

    现在让我们在数据框中识别包含错误值的列并计算它们。

      

    总和(!is.finite(as.vector(df [,%c中的名称(df)%(“col2”)])))
      [1] 4
      sum(!is.finite(as.vector(df [,name(df)%in%c(“col1”)])))
      [1] 0

    让我们删除这些记录,并采取良好的记录:

      

    df1 = df [is.finite(as.vector(df [,%c中的名称(df)%(“col2”)]))&amp;
                is.finite(as.vector(df [,%c中的名称(df)%(“col1”)])),]

    再次运行randomForest:

      

    model1 = randomForest(data = df1,col2~col1,ntree = 10)
      来电:
      randomForest(formula = col2~col1,data = df1,ntree = 10)

答案 2 :(得分:2)

您是否尝试过回归相同的数据?如果没有,那么检查数据中的“Inf”值,并在删除NA和NaN后尝试删除它(如果有的话)。 您可以找到有关从下方删除Inf的有用信息,

R is there a way to find Inf/-Inf values?

实施例,

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,...)中:     响应具有五个或更少的唯一值。你确定要做回归吗?

答案 3 :(得分:0)

这是因为你的一个变量有超过32个级别。 级别表示一个变量的不同值。 删除该变量,然后重试。

答案 4 :(得分:0)

只需将所有列转换为factor,即可避免此错误。 即使我面临这个错误。 该列,特别是未被转换为因子的列。我专门写了as.factor。 最后我的代码工作了。