如何在不平衡数据上为random-forest设置sampsize

时间:2018-01-07 08:58:19

标签: r random-forest

我想使用随机森林构建物种分布模型:

我的训练数据包括971个物种存在记录(71)/缺失(900)和系统采样点(4 * 4m,随机起点)的三个环境变量。

培训数据:

res.set('Access-Control-Allow-Headers', '*');

模型:

str(train)
'data.frame':   971 obs. of  4 variables:
$ presence: num  0 0 0 0 0 0 0 0 0 0 ...
$ v1     : num  0.18 0.18 0.24 0.24 0.75 0.7 0.27 0 0.29 0.77 ...
$ v2   : num  10 110 19 99 97 71 64 45 54 74 ...
$ v3   : Factor w/ 3 levels "cat1","cat2",..: 1 1 1 1 2 2 2 3 1 2 ...

由于我的数据不平衡(71/900),我尝试在随机森林模型中包含model <- randomForest(presence ~ v1 + v2 + v3, data = train) 。但是,它会导致sampsize=(c(71,71)) - 我做错了什么?

1 个答案:

答案 0 :(得分:0)

您的类/目标变量是数字的,您需要使用as.factor将其转换为因子,推理可以理解,它可以在将列视为列时获得层次数字,但一旦您将其更改为因子,sampsize将了解您想要获取每个staratum的值。

另请注意,如果sampsize值高于频率,则sampsize值必须等于或小于每个类别的频率。它仍会抛出larger than class frequency

的错误

(我假设你想在这里进行分类)

例如,以下赢了

model <- randomForest(am ~ mpg + disp , data = mtcars,sampsize = c(10,10))

这将有效

model <- randomForest(as.factor(am) ~ mpg + disp , data = mtcars,sampsize = c(10,10))

来自randomForest

的文档
  

sampsize要绘制的样本的大小。对于分类,如果是sampsize   是一个长度为向量数的向量,然后是采样   按层次分层,sampsize的元素表示   从阶层中抽取的数字。