在本教程中,我们将学习覆盖决策树和随机森林。这些是可用于分类或回归的监督学习算法。
下面的代码将加载本教程所需的包和数据集。
library(tidyverse) # 电信客户流失率数据 churn <- read_rds(chuata.rds))
可下载资源
数据
花点时间探索下面的这个数据集。
此数据框中的一行代表一家电信公司的客户。每个客户都从该公司购买了电话和互联网服务。
此数据中的因变量变量 canceled
指示客户是否终止了他们的服务。
决策树
为了演示拟合决策树,我们将使用 churn
数据集并使用所有可用的预测变量进行预测。
数据拆分
我们将数据分成训练集和测试集。训练数据将进一步分为 5 折进行超参数调优。
# 记住一定要设置你的随机数种子。 chuit <- iniplit(cdf) chining <- chulit %>% trang() chuest <- chuplit %>% tesg() #在训练数据集上创建交叉验证的 ##这些将被用于调整模型的超参数 chds <- vfcv(chung, v = 5)
特征工程
我们将在我们的训练数据上训练以下转换。
- 消除数值预测变量的偏度
- 标准化所有数字预测变量
- 为所有名义预测变量创建虚拟变量
chu\_rep <- recipe(cace\_srce ~ ., data = chutann) %>% stepYeonon(al\_nmeric(), -al\_utcoms()) %>% ste\_nomaze(all\_umic(), -al_oucoes()) %>% ste\_dumy(all\_inal(), -al_otcomes())
让我们检查一下特征工程步骤是否正确执行。
模型规格
接下来,我们指定具有以下超参数的决策树分类器:
- 成本复杂度参数(又名 Cp 或 λ)
- 树的最大深度
- 节点中进一步拆分所需的最小数据点数。
工作流程
接下来,我们将我们的模型组合到一个工作流中,以轻松管理模型构建过程。
treow <- workflow()
超参数调优
我们将对决策树超参数进行网格搜索,并在交叉验证期间根据 ROC 曲线下的面积选择性能最佳的模型。
请参见下面的示例,我们在其中创建 tree_grid
对象。
## 创建一个超参数值的网格来测试 tr_gid <- girular(cotolty(), teedeth(), mnn(), lvs = 2)
调整超参数 tune_grid()
为了从我们的调整网格中找到超参数的最佳组合,我们将使用该 tune_grid()
函数。
在我们的 KNN 示例中,此函数将模型对象或工作流作为第一个参数,将交叉验证折叠作为第二个参数,将调整网格数据框作为第三个参数。
随时关注您喜欢的主题
## 调整决策树工作流程 set.seed(314) tre_tig <- trewolow %>% tue_rid(rsampes = chrnols, grid = reegid)
查看我们的超参数调整的结果。
从下面的结果中,我们看到对于我们网格中的每个超参数组合。
下面 mean
结果中的列表示获得的性能指标的平均值。
我们可以使用该 select_best()
模型从我们的调优结果中选择具有最佳整体性能的模型。在下面的代码中,我们指定根据 roc_auc
指标选择性能最佳的模型。
我们看到成本复杂度为 1-10、树深度为 15、最小 n 为 40 的模型产生了最佳模型。
## 根据roc_auc选择最佳模型 besree <- te_uin %>%
完成工作流程
超参数调整的最后一步是 将我们的最佳模型添加到我们的工作流对象中。
可视化结果
为了可视化我们的决策树模型,我们需要使用该 fit()
函数手动训练我们的工作流对象。
此步骤是可选的,因为并非所有应用程序都需要可视化模型。但是,如果目标是了解 模型预测某些值的原因 ,那么建议这样做。
下一节将展示如何拟合模型以 自动获得测试集的性能。
拟合模型
接下来,我们将工作流程与训练数据相匹配。这是通过将我们的工作流对象传递给 fit()
函数来完成的。
fit(data = chning)
探索我们的训练模型变量的重要性
一旦我们在训练数据上训练了我们的模型,我们就可以使用该 vip
函数研究变量的重要性。
teeit <- tree__it %>% pull_orfowit()
变量重要性
接下来我们传递 tree_fit
给 vip()
函数。
我们从下面的结果中看到最重要的预测因子。
vip(teeit)
决策树图
我们可以可视化训练好的决策树。
这种可视化是一种工具,用于传达经过训练的决策树的预测规则。
很多时候,决策树图会很大并且难以阅读。有专门的软件包 R
用于放大决策树图的区域。
训练和评估
接下来,我们将最终模型工作流程拟合到训练数据并评估测试数据的性能。
该 函数将使我们的工作流程适合训练数据,并根据我们的 chuplit
对象定义的测试数据生成预测。
tre\_latit <- fil\_tewklow %>% last_fit(chnpit)
我们可以在测试数据上查看我们的性能指标
tre\_lft %>% collect\_metrics()
ROC曲线
我们可以绘制 ROC 曲线来可视化我们调整的决策树的测试集性能
treatft %>% collect_predictions() %>%
混淆矩阵
我们看到我们的模型在我们的测试数据集上产生了 80 个假阴性和 57 个假阳性。
tre\_pcis <- tre\_s\_t %>% collect\_predictions()
随机森林
在本节中,我们将为 chudf
数据拟合一个随机森林模型。随机森林采用决策树并在预测准确性方面构建更强大的模型。支持该算法的主要机制是对训练数据进行重复采样(替换)以生成一系列决策树模型。然后对这些模型进行平均以获得预测空间中给定值的单个预测。
随机森林模型选择预测变量的随机子集,用于在树构建过程中分割预测空间。算法的每次迭代都会这样做,通常是 100 到 2,000 次。
数据特征工程
我们已经将我们的数据分成训练、测试和交叉验证集,并训练了我们的特征工程, chucipe
. 这些可以在我们的随机森林工作流程中重复使用。
模型
接下来,我们指定具有以下超参数的随机森林分类器:
mtry
:创建树模型时在每次拆分时随机抽样的预测变量的数量trees
:要拟合并最终平均的决策树的数量min_n
: 节点进一步分裂所需的最小数据点数
要指定具有 的随机森林模型 ,我们需要该 ranorest()
函数。
工作流程
接下来,我们将我们的模型和配方组合到一个工作流中,以轻松管理模型构建过程。
f_orkflw <- workflow() %>%
超参数调优
随机网格搜索
我们将对随机森林超参数进行网格搜索,并在交叉验证期间根据 ROC 曲线下的面积选择性能最佳的模型。
在上一节中,我们曾经 gridlar()
创建一个超参数值网格。这创建了推荐默认值的常规网格。
另一种进行超参数调整的方法是创建一个 随机 的值网格。许多研究表明,这种方法比常规网格方法做得更好。
在下面的代码中,我们将范围设置为 4 到 12。
## 创建一个超参数值的网格来测试 set.sd(314) rf\_gd <- grid\_random(mry() %>% range_set
调整超参
为了从我们的调整网格中找到超参数的最佳组合,我们将使用该 tugid()
函数。
## 调整随机森林工作流程 set.seed(314) rftin <- rfwoflow %>% tune\_grid(resamples = cu\_olds, grid = r_id)
查看我们的超参数调整的结果。
我们可以使用模型从我们的调优结果中选择具有最佳整体性能的模型。在下面的代码中,我们指定根据 rocauc
指标选择性能最佳的模型。
## 根据roc_auc选择最佳模型 berf <- rftunng %>% select_best
完成工作流程
超参数调整的最后一步是 将我们的最佳模型添加到我们的工作流对象中。
fina_rkflow <- rfow %>% finaflow(betrf)
变量重要性
为了可视化随机森林模型的可变重要性分数。
拟合模型
接下来,我们将工作流程与训练数据相匹配。这是通过将我们的工作流对象传递给 fit()
函数来完成的。
rf_it <- fnalrfrlow %>% fit(data = crnranng)
一旦我们在训练数据上训练了我们的模型,我们就可以研究变量的重要性。
第一步是从我们的工作流拟合中提取训练好的模型。
rf <- ft %>% pll\_orfow\_fit()
变量重要性
从我们的模型返回一个 ggplot
具有可变重要性分数的对象。重要性分数基于通过超参数随机选择的具有最大预测能力的预测变量。
训练和评估
接下来,我们将最终模型工作流程拟合到训练数据并评估测试数据的性能。
使我们的工作流程拟合训练数据,并根据测试数据生成预测。
我们可以在测试数据上查看我们的性能指标
rf\_tfit %>% cole\_trcs()
ROC曲线
我们可以绘制 ROC 曲线来可视化随机森林模型的测试集性能。
rflafit %>% collepedions() %>% roc\_ve(trth = cncele\_srice, estimate = .rd_es) %>% autplot()
混淆矩阵
我们看到我们的模型在我们的测试数据集上产生了 61 个假阴性和 48 个假阳性,优于我们的决策树模型。
conf\_mat(predis, truth = cncervice, estimate = .prd\_las)
可下载资源
关于作者
Kaizong Ye是拓端研究室(TRL)的研究员。在此对他对本文所作的贡献表示诚挚感谢,他在上海财经大学完成了统计学专业的硕士学位,专注人工智能领域。擅长Python.Matlab仿真、视觉处理、神经网络、数据分析。
本文借鉴了作者最近为《R语言数据分析挖掘必知必会 》课堂做的准备。
非常感谢您阅读本文,如需帮助请联系我们!