二项式响应的随机森林变量重要性和相关方向
Random forest variable importance AND direction of correlation for binomial response
我在 R 中使用 randomForest 包,但不偏爱使用其他包的解决方案。
我的 RF 模型使用各种连续变量和分类变量来预测灭绝风险(受威胁,Non_Threatened)。我希望能够显示我的 RF 模型中使用的预测变量的重要性方向。其他出版物也正是这样做的:https://www.pnas.org/content/pnas/109/9/3395.full.pdf
中的图 1
关于如何做类似的事情有什么想法吗?我读到的一个建议是简单地比较两个部分依赖图之间的差异(下面的示例),但我觉得这可能不是最好的方法。
任何帮助将不胜感激。
partialPlot(final_rf, rf_train, size_mat,"Threatened")
partialPlot(final_rf, rf_train, size_mat,"Non_Threatened")
响应 = 受到威胁
回应=Non_Threatened
您可以使用类似平均边际效应(或类似下面的平均一阶差分)的方法。
首先,我会做一些数据
set.seed(11)
n = 200
p = 5
X = data.frame(matrix(runif(n * p), ncol = p))
yhat = 10 * sin(pi* X[ ,1] * X[,2]) +20 *
(X[,3] -.5)^2 + 10 * -X[ ,4] + 5 * -X[,5]
y = as.numeric((yhat+ rnorm(n)) > mean(yhat))
df <- as.data.frame(cbind(X,y))
接下来,我们将估算 RF 模型:
library(randomForest)
rf <- randomForest(as.factor(y) ~ ., data=df)
Net,我们可以遍历每个变量,在每次循环中,我们都将一个标准偏差添加到所有观察的单个 x
变量中。在您的方法中,您还可以将类别变量从一个类别更改为另一个类别。然后,我们预测两种条件下出现正响应的概率——原始条件和每个变量都添加了标准差的条件。然后我们就可以取差总结了。
nx <- names(df)
nx <- nx[-which(nx == "y")]
res <- NULL
for(i in 1:length(nx)){
p1 <- predict(rf, newdata=df, type="prob")
df2 <- df
df2[[nx[i]]] <- df2[[nx[i]]] + sd(df2[[nx[i]]])
p2 <- predict(rf, newdata=df2, type="prob")
diff <- (p2-p1)[,2]
res <- rbind(res, c(mean(diff), sd(diff)))
}
colnames(res) <- c("effect", "sd")
rownames(res) <- nx
res
# effect sd
# X1 0.11079 0.18491252
# X2 0.10265 0.16552070
# X3 0.02015 0.07951409
# X4 -0.11687 0.16671916
# X5 -0.04704 0.10274836
我在 R 中使用 randomForest 包,但不偏爱使用其他包的解决方案。 我的 RF 模型使用各种连续变量和分类变量来预测灭绝风险(受威胁,Non_Threatened)。我希望能够显示我的 RF 模型中使用的预测变量的重要性方向。其他出版物也正是这样做的:https://www.pnas.org/content/pnas/109/9/3395.full.pdf
中的图 1关于如何做类似的事情有什么想法吗?我读到的一个建议是简单地比较两个部分依赖图之间的差异(下面的示例),但我觉得这可能不是最好的方法。 任何帮助将不胜感激。
partialPlot(final_rf, rf_train, size_mat,"Threatened")
partialPlot(final_rf, rf_train, size_mat,"Non_Threatened")
响应 = 受到威胁
回应=Non_Threatened
您可以使用类似平均边际效应(或类似下面的平均一阶差分)的方法。
首先,我会做一些数据
set.seed(11)
n = 200
p = 5
X = data.frame(matrix(runif(n * p), ncol = p))
yhat = 10 * sin(pi* X[ ,1] * X[,2]) +20 *
(X[,3] -.5)^2 + 10 * -X[ ,4] + 5 * -X[,5]
y = as.numeric((yhat+ rnorm(n)) > mean(yhat))
df <- as.data.frame(cbind(X,y))
接下来,我们将估算 RF 模型:
library(randomForest)
rf <- randomForest(as.factor(y) ~ ., data=df)
Net,我们可以遍历每个变量,在每次循环中,我们都将一个标准偏差添加到所有观察的单个 x
变量中。在您的方法中,您还可以将类别变量从一个类别更改为另一个类别。然后,我们预测两种条件下出现正响应的概率——原始条件和每个变量都添加了标准差的条件。然后我们就可以取差总结了。
nx <- names(df)
nx <- nx[-which(nx == "y")]
res <- NULL
for(i in 1:length(nx)){
p1 <- predict(rf, newdata=df, type="prob")
df2 <- df
df2[[nx[i]]] <- df2[[nx[i]]] + sd(df2[[nx[i]]])
p2 <- predict(rf, newdata=df2, type="prob")
diff <- (p2-p1)[,2]
res <- rbind(res, c(mean(diff), sd(diff)))
}
colnames(res) <- c("effect", "sd")
rownames(res) <- nx
res
# effect sd
# X1 0.11079 0.18491252
# X2 0.10265 0.16552070
# X3 0.02015 0.07951409
# X4 -0.11687 0.16671916
# X5 -0.04704 0.10274836