gpt4 book ai didi

r - 随机森林的 varImp(插入符号)和重要性(randomForest)之间的差异

转载 作者:行者123 更新时间:2023-12-01 16:41:57 24 4
gpt4 key购买 nike

我不明白 varImp 函数(caret 包)和 importance 函数(randomForest > 包)用于随机森林模型:

我计算了一个简单的 RF 分类模型,在计算变量重要性时,我发现两个函数的预测变量“排名”不同:

这是我的代码:

rfImp <- randomForest(Origin ~ ., data = TAll_CS,
ntree = 2000,
importance = TRUE)

importance(rfImp)

BREAST LUNG MeanDecreaseAccuracy MeanDecreaseGini
Energy_GLCM_R1SC4NG3 -1.44116806 2.8918537 1.0929302 0.3712622
Contrast_GLCM_R1SC4NG3 -2.61146974 1.5848150 -0.4455327 0.2446930
Entropy_GLCM_R1SC4NG3 -3.42017102 3.8839464 0.9779201 0.4170445
...

varImp(rfImp)
BREAST LUNG
Energy_GLCM_R1SC4NG3 0.72534283 0.72534283
Contrast_GLCM_R1SC4NG3 -0.51332737 -0.51332737
Entropy_GLCM_R1SC4NG3 0.23188771 0.23188771
...

我认为他们使用相同的“算法”,但我现在不确定。

编辑

为了重现该问题,可以使用ionosphere数据集(kknn包):

library(kknn)
data(ionosphere)
rfImp <- randomForest(class ~ ., data = ionosphere[,3:35],
ntree = 2000,
importance = TRUE)
importance(rfImp)
b g MeanDecreaseAccuracy MeanDecreaseGini
V3 21.3106205 42.23040 42.16524 15.770711
V4 10.9819574 28.55418 29.28955 6.431929
V5 30.8473944 44.99180 46.64411 22.868543
V6 11.1880372 33.01009 33.18346 6.999027
V7 13.3511887 32.22212 32.66688 14.100210
V8 11.8883317 32.41844 33.03005 7.243705
V9 -0.5020035 19.69505 19.54399 2.501567
V10 -2.9051578 22.24136 20.91442 2.953552
V11 -3.9585608 14.68528 14.11102 1.217768
V12 0.8254453 21.17199 20.75337 3.298964
...

varImp(rfImp)
b g
V3 31.770511 31.770511
V4 19.768070 19.768070
V5 37.919596 37.919596
V6 22.099063 22.099063
V7 22.786656 22.786656
V8 22.153388 22.153388
V9 9.596522 9.596522
V10 9.668101 9.668101
V11 5.363359 5.363359
V12 10.998718 10.998718
...

我想我错过了一些东西......

编辑2

我发现,如果对 importance(rfImp) 的前两列的每一行求平均值,就会得到 varImp(rfImp) 的结果:

impRF <- importance(rfImp)[,1:2]
apply(impRF, 1, function(x) mean(x))
V3 V4 V5 V6 V7 V8 V9
31.770511 19.768070 37.919596 22.099063 22.786656 22.153388 9.596522
V10 V11 V12
9.668101 5.363359 10.998718 ...

# Same result as in both columns of varImp(rfImp)

我不知道为什么会发生这种情况,但必须对此有一个解释。

最佳答案

如果我们遍历 varImp 的方法:

检查对象:

> getFromNamespace('varImp','caret')
function (object, ...)
{
UseMethod("varImp")
}

获取S3方法:

> getS3method('varImp','randomForest')
function (object, ...)
{
code <- varImpDependencies("rf")
code$varImp(object, ...)
}
<environment: namespace:caret>


code <- caret:::varImpDependencies('rf')

> code$varImp
function(object, ...){
varImp <- randomForest::importance(object, ...)
if(object$type == "regression")
varImp <- data.frame(Overall = varImp[,"%IncMSE"])
else {
retainNames <- levels(object$y)
if(all(retainNames %in% colnames(varImp))) {
varImp <- varImp[, retainNames]
} else {
varImp <- data.frame(Overall = varImp[,1])
}
}

out <- as.data.frame(varImp)
if(dim(out)[2] == 2) {
tmp <- apply(out, 1, mean)
out[,1] <- out[,2] <- tmp
}
out
}

所以这并不是严格返回 randomForest::importance,

它首先进行计算,然后仅选择数据集中的分类值。

然后它做了一些有趣的事情,它检查我们是否只有两列:

if(dim(out)[2] == 2) {
tmp <- apply(out, 1, mean)
out[,1] <- out[,2] <- tmp
}
<小时/>

根据 varImp 手册页:

Random Forest: varImp.randomForest and varImp.RandomForest are wrappers around the importance functions from the randomForest and party packages, respectively.

事实显然并非如此。

<小时/>

至于为什么...

如果我们只有两个值,则变量作为预测变量的重要性可以用一个值表示。

如果变量是 g 的预测变量,那么它也必须是 b 的预测变量

这确实有道理,但这与他们关于该函数功能的文档不符,所以我可能会将此报告为意外行为。当您希望自己进行相对计算时,该函数会尝试提供帮助。

关于r - 随机森林的 varImp(插入符号)和重要性(randomForest)之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37888619/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com