我正在尝试使用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
答案 0 :(得分:8)
除了有关NAs等存在的明显事实之外,此错误几乎总是由数据集中存在字符要素类型引起的。理解这一点的方法是考虑随机森林的真正作用。您正在按功能对数据集功能进行分区。因此,如果其中一个特征是字符向量,您将如何对数据集进行分区?您需要类别来分区数据。有多少男性&#39;与女性的关系 - 类别......
对于年龄或价格等数字功能,您可以通过分段创建类别;大于某个年龄,小于某个价格等。你不能用纯粹的角色特征做到这一点。因此,您需要它们作为数据集中的因子。
答案 1 :(得分:5)
通常,您收到此错误消息有两个主要原因:
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。 最后我的代码工作了。