如何使用随机森林制作决策树图并按类别过滤

Aeg*_*gis 5 r machine-learning random-forest rpart

我正在 R 中学习机器学习,并在 R 中制作过期产品的决策树,其中我有以下数据:

Product, Category, Temperature, Expire_Day, Rotation_Day, Weight, State
Tapa, Pulpa, 0, 30, 21, 4.21, No
Tapa, Pulpa, 0, 30, 21, 3.82, Expire
Nalga, Pulpa, 0, 30, 25, 6.10, No
Nalga, Pulpa, 0, 30, 25, 5, Expire
Costeleta, Bife, 7, 5, 3, 1.10, No
Costeleta, Bife, 7, 5, 3, 2.25, No
Costeleta, Bife, 7, 5, 3, 0.9, Expire
Brazuelo, Bife, 7, 5, 3, 2.5, No
Run Code Online (Sandbox Code Playgroud)

这样,我通过使用 dummyVars 将产品和类别系列传递到向量并使用 MinMaxScalar 标准化权重来创建数据模型,对于温度、Expire_Day 和 Rotation_Day 存在邻近关系,因此我没有进行任何转换,最后将状态转换为因素

最终模型是:

Product.Tapa, Product.Nalga, Product.Costeleta, Product.Brazuelo, Category.Pulpa, Category.Bife, Temperature, Expire_Day, Rotation_Day, Weight, State
1, 0, 0, 0, 1, 0, 0, 30, 21, 0.9, No
1, 0, 0, 0, 1, 0, 0, 30, 21, 0.78, Expire
0, 1, 0, 0, 1, 0, 0, 30, 25, 0.99, No
0, 1, 0, 0, 1, 0, 0, 30, 25, 0.72, Expire
0, 0, 1, 0, 0, 1, 7, 5, 3, 0.12, No
0, 0, 1, 0, 0, 1, 7, 5, 3, 0.22, No
0, 0, 1, 0, 0, 1, 7, 5, 3, 0.88, Expire
0, 0, 0, 1, 0, 1, 7, 5, 3, 0.5, No
Run Code Online (Sandbox Code Playgroud)

通过这个模型,我使用随机森林创建树,代码如下:

mtry <- 6
ntree <- 24

rf_model <- randomForest(result ~ .,
       data = trainData,
       mtry = mtry,
       ntree = ntree,
       trControl = control,
       varimp = TRUE,
       importance = TRUE,
       weight = data_weights,
       oob_score = FALSE)
Run Code Online (Sandbox Code Playgroud)

到目前为止,如果我预测我的精度为 0.90 并且工作得很好,但我无法制作决策树图,其中我需要满足 2 个条件:

a-决策树必须以 Expire_Day 和 Rotation_Day 列开始,这是该系列中最重要的列

b-能够按类别过滤或分类树,例如,我必须能够仅看到“ Pulpa ”的树,而不显示与“ Bife ”相对应的内容,然后进行更改并只能看到“ Bife ”或如果他们问我,整棵树

我还没有找到让它发挥作用的方法,我该怎么做?

sta*_*007 5

我猜你遇到了一些误解。我读过您安装了一个randomForest模型,现在您想绘制该模型的实际决策树

一般来说,这里要注意的是,randomForest是一个集成模型。这意味着,不存在一棵树,为了获得最佳输出(例如您的 0.9 精度),需要组合多个模型结果。所以你得到的结果是多个单个决策树的组合结果。组合多少个决策树由超参数定义ntree。该包的默认值randomForest是 500。

因此,您的rf_model树是 500 棵单树的组合。这是数据集的示例iris,因为我没有您的数据集。

library("randomForest")
iris_model <- randomForest(Species ~., data = iris) 
getTree(iris_model, k = 2)
Run Code Online (Sandbox Code Playgroud)

getTree()可以查看随机森林模型中使用的单个决策树。由k您指定要查看 500 棵树中的哪一棵。输出为文本形式。但对此进行过多研究并没有太大意义。

这些树的问题是,根据设计(最好阅读有关随机森林的更多信息),其中一棵树不会为您提供非常好的精度。与单棵树(例如您要拟合的 CART 树)相比,随机森林的单棵树的复杂性降低了,但正是它们的组合,使它们变得强大并且能够抵抗过度拟合。

有一些研究可以从这些 randomForest 集合中获取一棵“代表性”树,例如您可以使用该reprtree

reprtree 是一个包,用于实现 Banerjee 等人于 2012 年引入的基于树的机器集合中的代表性树的概念。

使用我们iris_model上面创建的代码将如下所示:

# Must be installed from github
devtools::install_github("araastat/reprtree")

library("reprtree")
reprtree:::plot.getTree(iris_model)
Run Code Online (Sandbox Code Playgroud)

这会给你一棵像这样的树:

在此输入图像描述

但总的来说,听起来,你只是想要一个漂亮的决策树,你可以告诉别人做出决定。在这种情况下,您也可以只安装一棵 CART 树并绘制该树。(随机森林本身作为模型可能具有更高的精度,但单个 CART 树很可能比组合到随机森林的 500 棵树中的单个树具有更高的精度)

为此,您可以使用rpartR 中的包。与 rpart.plot 包结合使用,您可以创建非常漂亮的树图。

library("rpart")
library("rpart.plot")

#fit new model with rpart
iris_model2 <- rpart(Species ~., data = iris)

# plot the tree
rpart.plot(iris_model2)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

关于您的特殊要求:

a- 决策树必须以 Expire_Day 和 Rotation_Day 列开始,这是该系列中最重要的列

实际上,独立的,您实际使用的基于树的模型 - rpart、randomForest 或其他决策树变体(有很多) - 分割实际上是从您用于训练模型的数据派生的。拆分旨在为您提供最佳模型。因此,这可能只是您的直觉,这Rotation_DayExpire_Day最重要的因素 - 如果它们没有显着地包含在模型中,则数据会另有说明(或者出现其他问题)。

b- 能够按类别过滤或分类树,例如,我必须能够仅看到“Pulpa”的树,而不显示与“Bife”相对应的内容,然后进行更改并只能看到“Bife”或如果他们问我,整棵树

您可以过滤用于构建模型的输入数据,仅包含“Pulpa”,然后构建并绘制树。给出了“Pulpa”如何分类的很好的见解。(但可能不是组合模型中使用的确切树)