- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在比较一些模型以获得最佳模型。现在,我想得到一个随机森林模型的 OOB 错误,以将其与其他一些模型的交叉验证错误进行比较。我可以做比较吗?如果可以,如何通过 R 代码获取 OOB 错误?
最佳答案
要在 R 中获取随机森林模型的 OOB,您可以:
library(randomForest)
set.seed(1)
model <- randomForest(Species ~ ., data = iris)
OOB 错误在:
model$err.rate[,1]
其中第 i 个元素是直到第 i 个树的 (OOB) 错误率。
可以绘制它并检查它是否与为 rf 模型定义的绘图方法中的 OOB 相同:
par(mfrow = c(2,1))
plot(model$err.rate[,1], type = "l")
plot(model)
OOB 对于选择超参数 mtry
和 ntree
很有用,并且应该与 k-fold CV 相关,但不应使用它来将 rf 与不同类型的测试模型进行比较通过 k 倍 CV。OOB 很棒,因为它几乎是免费的,而 k-fold CV 则需要运行 k 次。
在 R 中运行 k-fold CV 的一种简单方法是:
定义折叠(将 5 替换为 k(正整数 >1)以运行 k -fold CV:
folds <- sample(1:5, size = nrow(iris), replace = T) #5 fold CV
这种方法不会给出相同大小的折叠(尤其是对于较小的数据集),这通常没什么大不了的。
table(folds)
#output
1 2 3 4 5
30 28 28 33 31
解决这个问题:
folds <- sample(rep(1:5, length.out = nrow(iris)), size = nrow(iris), replace = F)
table(folds)
#output
1 2 3 4 5
30 30 30 30 30
在 4 个折叠中的每一个上训练模型并在第 5 次进行预测。这里我只返回一个包含预测和实际值的数据帧列表,可以自定义调用以返回他想要的任何统计数据。
CV_rf <- lapply(1:5, function(x){ #5 corresponds to the number of folds defined earlier
model <- randomForest(Species ~ ., data = iris[folds != x,])
preds <- predict(model, iris[folds == x,], type="response")
return(data.frame(preds, real = iris$Species[folds == x]))
})
您可以使用相同的代码来获得岭模型的性能。
将数据框列表转换为数据框:
CV_rf <- do.call(rbind, CV_rf)
检查准确性
caret::confusionMatrix(CV_rf$preds, CV_rf$real)
#part of output:
Overall Statistics
Accuracy : 0.9533
95% CI : (0.9062, 0.981)
No Information Rate : 0.3333
P-Value [Acc > NIR] : < 2.2e-16
所以这里的准确度是 0.9533
而第 500 个(500 个默认适合 rf)树的 OOB 是:
model$err.rate[500,1]
#OOB
0.04666667
它们完全一样,完全击败了我的观点,但是例如尝试运行 10 倍 CV 或 3 倍,你会发现它们不一样。
另一种方法是使用 caret
或 mlr
库。我不使用 mlr
但 caret
非常适合这样的任务。这里是 something让您开始使用插入符号和射频。此外插入符号具有出色的documentation .即使您不打算使用该软件包,我也可以推荐它。
关于r - 如何计算随机森林的OOB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47960427/
我们正在运行 MarkLogic 9.0-11 版本 3 节点集群,并且 MarkLogic 安装在“/var/opt/MarkLogic/”目录中,我们创建了“/var/opt/MarkLogic/
我有一片任意高度的森林,大致像这样: let data = [ { "id": 2, "name": "AAA", "parent_id": null, "short_name": "A" },
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 已关闭 7 年前。 Improve
我有一个巨大的深度字典,代表森林(许多非二叉树),我想处理森林并创建一个包含森林所有可能关系的文本文件,例如给定字典: {'a': {'b': {'c': {}, 'd': {}}, 'g': {}}
在我的 Android 应用程序中,我包含了谷歌地图。现在我想获取有关您周围地区的信息。例如,你是在公园/森林/海滩……所以我基本上想要一个用“水”回答输入坐标 53°33'40.9"N 10°00'
如果我有下表: Member_Key Member_Name col1 Mem1 col2 Mem2 col3 Mem3 col4
继续我的老问题: Writing nested dictionary (forest) of a huge depth to a text file 现在我想把森林遍历写成BFS风格:我有一个巨大的深
我有一个多域环境(事件目录林),例如subdomain1.mydomain.com, subdomain2.mydomain.com 其中 mydomain.com 是根 AD 域 (GC) 和 su
我想知道是否有可能在 Google map 或 Bing Mag 2D/3D map 上恢复地形类型(山脉、森林、水域、平原等...) 。为了根据玩家在现实世界中的位置生成 map !我认为可用 AP
我是一名优秀的程序员,十分优秀!