在 R 中使用 randomForest 预测/估计值

Posted

技术标签:

【中文标题】在 R 中使用 randomForest 预测/估计值【英文标题】:Predict/estimate values using randomForest in R 【发布时间】:2016-04-24 04:22:16 【问题描述】:

我想根据已调查区域预测未调查区域中 Pop_avg 字段的值。我正在根据我之前的问题的建议使用 randomForest。

我的调查区域:

> surveyed <- read.csv("summer_surveyed.csv", header = T)
> surveyed_1 <- surveyed[, -c(1,2,3,5,6,7,9,10,11,12,13,15)]
> head(surveyed_1, n=1)
  VEGETATION                                        Pop_avg    Acres_1
1 Acer rubrum-Vaccinium corymbosum-Amelanchier spp.       0   27.68884

我未调查的地区:

> unsurveyed <- read.csv("summer_unsurveyed.csv", header = T)
> unsurveyed_1 <- unsurveyed[, -c(2,3,5,6,7,9,10,11,12,13,15)]
> head(unsurveyed_1, n=1)
OBJECTID                                       VEGETATION  Pop_avg   Acres_1
      13 Acer rubrum-Vaccinium corymbosum-Amelanchier spp.       0  4.787381

然后,我从 unsurveyed_1 中删除了包含 surveyed_1 中未找到的植被类型的行,并删除了未使用的特征级别。

> setdiff(unsurveyed_1$VEGETATION, surveyed_1$VEGETATION) 

> unsurveyed_1 <- unsurveyed_1[!unsurveyed_1$VEGETATION == "Typha (angustifolia, latifolia) - (Schoenoplectus spp.) Eastern Herbaceous Vegetation", ]
> unsurveyed_1 <- unsurveyed_1[!unsurveyed_1$VEGETATION == "Acer rubrum- Nyssa sylvatica saturated forest alliance",]
> unsurveyed_1 <- unsurveyed_1[!unsurveyed_1$VEGETATION == "Prunus serotina",]

> unsurveyed_drop <- droplevels(unsurveyed_1)

接下来我运行 randomForest 并预测并将输出添加到unsurveyed_drop

> surveyed_pred <- randomForest(Pop_avg ~ 
+ VEGETATION+Acres_1,
+ data = surveyed_1,
+ importance = TRUE)

> summer_results <- predict(surveyed_pred, unsurveyed_drop,type="response",
+ norm.votes=TRUE, predict.all=F, proximity=FALSE, nodes=FALSE)

> summer_all <- cbind(unsurveyed_drop, summer_results)
> head(summer_all, n=1)
OBJECTID                                        VEGETATION Pop_avg   Acres_1 summer_results
      13 Acer rubrum-Vaccinium corymbosum-Amelanchier spp.       0  4.787381       0.120077

我想估计summer_allPop_avg 列的值。我假设我需要使用summer_results 中生成的比例,但我不确定我会如何做到这一点。感谢您的任何帮助或进一步的建议。

更多信息: 我正在寻找基于VegetationAcres_1Pop_avg 的预测计数数据。我不确定是否/如何使用我的输出summer_results 中的概率来实现这一点,或者我是否需要更改我的模型或尝试不同的方法。

E2 我认为输出不正确的原因是因为Pop_avg 的范围从 0.333 及以上(看到鹿的地方),即Population 除以 3。Population 的范围从 1 及以上(即10、20...)。当我运行模型试图预测其中一个时,我得到了从 .9xx 到 2 或 3.xxx 的相似数字,尤其是当我使用 Population 运行它时。这似乎不对。

数据:summer_surveyed_sample

summer_unsurveyed_sample

【问题讨论】:

你尝试了什么,为什么它会让你觉得你做错了什么? @AndyClifton 我还是 R 新手,这是我第一次使用 randomForest。但从我在summer_results 中看到的输出来看,是预测的概率。不过我可能是错的。我正试图找出下一步以获得Pop_avg 的估计值。 不幸的是,你的问题是这样写的,很难理解;你有统计和编程的混合体你可能想专注于一个或另一个问题并整理问题。此外,一些示例数据会有所帮助。 随机森林将返回与训练数据单位完全相同的值。因此,如果您的“pop_avg”数据是数字(不是比例),则无需进行更正。如果您的预测站点的区域与您的训练站点不同,则您必须相应地对数据进行加权。 @AndyClifton 我为我的示例数据添加了链接,并简要解释了为什么我认为我的输出看起来不正确。我还尝试仅使用 Vegetation 作为预测参数运行,结果相似。 【参考方案1】:

我的问题在于我的训练模型。我发现我需要使用我的调查数据的一个子集,其中Population > 0 来获得更准确的预测。

> surveyed_1 <- surveyed_1[c(surveyed_1$Population > 0),]
> surveyed_drop <- droplevels(surveyed_1)
> surveyed_pred <- randomForest(Population ~ 
                VEGETATION+Acres_1,
                data = surveyed_drop,
                importance = TRUE)

【讨论】:

所以你的问题不在于编程,而更多地与模型开发有关。这并不罕见!

以上是关于在 R 中使用 randomForest 预测/估计值的主要内容,如果未能解决你的问题,请参考以下文章

在 R 中将 predict() 与 randomForest 一起使用时出错

在 R 中使用 randomForest 包,如何从分类模型中获取概率?

R 中 h2o 包中的 predict.H2OModel() 是不是为 h2o.randomForest() 模型提供 OOB 预测?

R ranger 包中的预测概率

R语言randomForest包做回归预测需要交叉验证么

R语言随机森林RandomForest逻辑回归Logisitc预测心脏病数据和可视化分析|附代码数据