如何在不平衡数据上设置随机森林的样本大小

How to set sampsize for random-forest on unbalanced data

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

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

训练数据:

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

型号:

model <- randomForest(presence ~ v1 + v2 + v3, data = train)

因为我的数据不平衡 (71/900),所以我尝试将 sampsize=(c(71,71)) 包含在随机森林模型中。但是,它会导致 Error in randomForest.default(m, y, ...) : sampsize should be of length one - 我做错了什么?

你的class/target变量是数值型的,你需要用as.factor把它转换成一个因子,这个道理可以理解为它处理列为数字,但一旦将其更改为因子,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 Size(s) of sample to draw. For classification, if sampsize is a vector of the length the number of strata, then sampling is stratified by strata, and the elements of sampsize indicate the numbers to be drawn from the strata.