将条件变量添加到 R 中的随机森林模型

Posted

技术标签:

【中文标题】将条件变量添加到 R 中的随机森林模型【英文标题】:Add conditioning variables to a random forest model in R 【发布时间】:2021-04-26 08:14:21 【问题描述】:

我想训练一个随机森林来进行分类预测。如果我想在预测模型中包含一组固定的自变量(例如Y~.+x1+x2+x3 中的 x1、x2 和 x3),但将它们从可以使用的自变量集(在示例中以 . 表示)中排除要在森林中对数据进行分区/创建分支/树,有没有一种简单的方法可以使用 caretgrf 或 R 中的其他包来执行此操作?

这是一个示例:如果我想预测鸢尾花数据集中哪些花的萼片宽度超过 3.2,但我想在决定是否创建新分支时以花种为条件,同时排除花种作为可能的分裂变量在。想象一下,我知道花种可以很好地预测萼片宽度,但我想知道还有哪些其他因素可以预测萼片宽度,这取决于物种:

data(iris)
d <- iris

d$sepal_width_over3point2<-as.factor(d$Sepal.Width>3.2)
d$Type1<-as.numeric(d$Species=='versicolor')
d$Type2<-as.numeric(d$Species=='virginica')
d$Type3<-as.numeric(d$Species=='setosa')

d<-subset(d,select=-c(Species,Sepal.Width))


## Set parameters to train models
# Run algorithms using 10-fold cross validation
control <- trainControl(method="cv", number=10)
metric <- "Accuracy"

# Random Forest
set.seed(11)
rf <- train(sepal_width_over3point2~.+Type1+Type2+Type3, data=d, method="rf", metric=metric, trControl=control)
print(rf)

example_varImp_rf<-varImp(rf)

当我查看此模型中的变量重要性时,我想知道其他参数(Sepal.length、Petal.length 和 Petal.width)的估计值取决于花 Type1、Type2 和Type3,但排除这些变量作为分支的可能变量。有没有办法告诉随机森林忽略这三个变量作为可能的分裂?

【问题讨论】:

如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。 “包含在预测模型中”和“包含它们以在森林中创建分支”有什么区别? 感谢@MrFlick -- 我添加了一个示例,希望能澄清我的问题 -- 如有任何混淆,请见谅;我仍在学习这些工具的工作原理。 @BenReiniger 我正在尝试使用随机森林来预测在变量子集 (x_1....x_n) 上分支的二元特征 Y,但会考虑其中每个变量的预测能力x 变量以 z 变量的另一个子集为条件(例如 z1、z2、z3)。我想知道哪些 x 是重要的预测变量,但以 z 为条件(但我不希望森林在 z 上分裂)。我试图在我的问题中添加一个示例,以阐明我要完成的工作。感谢您提供的任何见解或建议! 【参考方案1】:

这将要求您的节点拆分为每个花卉种类设置一个阈值,这将比大多数树学习器的计算成本更高。我不知道有什么包可以实现这个。

一种可能的解决方法是进行一些特征工程。在这种情况下,如果您的条件是一个较小的分类,您可以将每个特征相对于它们的花种进行标准化,以便分裂类似于“萼片长度至少比物种平均值高 20%”或“萼片长度是至少比物种平均值高一个(物种)标准差。”

【讨论】:

以上是关于将条件变量添加到 R 中的随机森林模型的主要内容,如果未能解决你的问题,请参考以下文章

R语言 | randomForest包的随机森林回归模型以及对重要变量的选择

R中的随机森林交叉验证

r 随机森林错误 - 新数据中的预测变量类型不匹配

笔记+R︱风控模型中变量粗筛(随机森林party包)+细筛(woe包)

R - 具有两个结果变量的随机森林

笔记+R︱风控模型中变量粗筛(随机森林party包)+细筛(woe包)