我正在尝试了解randomForest
包中和caret
包中的随机林实现之间的区别。
例如,这会在mtry = 2
中指定randomForest
的2000棵树,并显示每个预测变量的基尼系数:
library(randomForest)
library(tidyr)
rf1 <- randomForest(Species ~ ., data = iris,
ntree = 2000, mtry = 2,
importance = TRUE)
data.frame(RF = sort(importance(rf1)[, "MeanDecreaseGini"], decreasing = TRUE)) %>% add_rownames() %>% rename(Predictor = rowname)
# Predictor RF
# 1 Petal.Width 45.57974
# 2 Petal.Length 41.61171
# 3 Sepal.Length 9.59369
# 4 Sepal.Width 2.47010
我试图在caret
中获取相同的信息,但我不知道如何指定树的数量,或者如何获得基尼系数:
rf2 <- train(Species ~ ., data = iris, method = "rf",
metric = "Kappa",
tuneGrid = data.frame(mtry = 2))
varImp(rf2) # not the Gini coefficient
# Overall
# Petal.Length 100.000
# Petal.Width 99.307
# Sepal.Width 0.431
# qSepal.Length 0.000
此外,rf1
的混淆矩阵有一些错误而rf2
的混淆矩阵没有。导致这种差异的参数是什么?:
# rf1 Confusion matrix:
# setosa versicolor virginica class.error
# setosa 50 0 0 0.00
# versicolor 0 47 3 0.06
# virginica 0 4 46 0.08
table(predict(rf2, iris), iris$Species)
# setosa versicolor virginica
# setosa 50 0 0
# versicolor 0 50 0
# virginica 0 0 50
这很快又脏。我知道这不是测试分类器性能的正确方法,但我不理解结果的差异。
答案 0 :(得分:1)
这可能有助于回答这个问题 - 请参阅第二篇文章:
caret: using random forest and include cross-validation
randomforest是替换样本。如果在插入符号中使用“rf”,则需要在train :: caret()中指定trControl;您希望在插入符号中使用相同的重采样方法,即引导程序,因此您需要设置trControl =“oob”。 TrControl是一个定义函数行为方式的值列表;这可以设置为“cv”用于交叉验证,“repeatedcv”用于重复交叉验证等。有关详细信息,请参阅插入符号包文档。
你应该得到与使用randomForest相同的结果,但要记得正确设置种子。
答案 1 :(得分:0)
我最近也在寻找一种从MeanDecreasingGini
的{{1}}实现中获取caret
变量的解决方案。我意识到这是很久以前发布的,所以也许插入符号已更新,并且不再需要我的建议,但是我一直在努力寻找解决方案,因此希望有人觉得这很有用。
要设置插入符中的树数,您可以在训练过程中使用randomForest
参数,就像使用ntrees=xx
一样。然后,要输出randomForest
中的MeanDecreasingGini
,请指定caret
(1 = type=2
[默认],2 = MeanDecreasingAccuracy
)和MeanDecreasingGini
。完整的代码,其结果如下(经过几次运行后,我预测结果的大小会有微小的波动,这是随机的机会,但变量的等级是一致的):
scale=FALSE
那么就混淆矩阵混淆而言(混淆措词?),这似乎是您计算混淆矩阵的方式的副产品。当我将预测函数用于两个模型时,与使用其他方法相比,我的精度提高到100%:
library(randomForest)
library(tidyr)
library(caret)
##randomForest
rf1 <- randomForest(Species ~ ., data = iris,
ntree = 2000, mtry = 2,
importance = TRUE)
data.frame(Gini=sort(importance(rf1, type=2)[,], decreasing=T))
# Gini
# Petal.Width 43.924705
# Petal.Length 43.293731
# Sepal.Length 9.717544
# Sepal.Width 2.320682
##caret
rf2 <- train(Species ~ .,
data = iris,
method = "rf",
ntrees=2000, ##same as randomForest
importance=TRUE, ##same as randomForest
metric = "Kappa",
tuneGrid = data.frame(mtry = 2),
trControl = trainControl(method = "none")) ##Stop the default bootstrap=25
varImp(rf2, type=2, scale=FALSE)
# rf variable importance
#
# Overall
# Petal.Width 44.475
# Petal.Length 43.401
# Sepal.Length 9.140
# Sepal.Width 2.267
但是,我不确定rf1$confusion
# setosa versicolor virginica class.error
# setosa 50 0 0 0.00
# versicolor 0 47 3 0.06
# virginica 0 3 47 0.06
table(predict(rf1, iris), iris$Species)
# setosa versicolor virginica
# setosa 50 0 0
# versicolor 0 50 0
# virginica 0 0 50
rf2$finalModel$confusion
# setosa versicolor virginica class.error
# setosa 50 0 0 0.00
# versicolor 0 47 3 0.06
# virginica 0 5 45 0.10
table(predict(rf2, iris), iris$Species)
# setosa versicolor virginica
# setosa 50 0 0
# versicolor 0 50 0
# virginica 0 0 50
和rf1$confusion
是否都代表了最后一棵树的预测。也许对此有更好了解的人可以帮忙。