如何在 r 中执行 bagging(一步一步)
当我们为给定数据集创建 决策树时,我们仅使用单个训练数据集来构建模型。
然而,使用单个决策树的缺点是它往往会遭受 高方差的影响。也就是说,如果我们将数据集分成两半并将决策树应用于两半,结果可能会非常不同。
我们可以用来减少单个决策树方差的一种方法称为 装袋,有时称为引导聚合。
装袋的工作原理如下:
1.从原始数据集中获取b 个引导样本。
2.为每个引导样本创建决策树。
3.对每棵树的预测进行平均以获得最终模型。
通过构建数百甚至数千个单独的决策树并取所有树的平均预测,我们通常会得到一个拟合袋模型,与单个决策树相比,该模型产生的测试错误率要低得多。
本教程提供了如何在 R 中创建 bagged 模型的分步示例。
第1步:加载必要的包
首先,我们将加载此示例所需的包:
library (dplyr) #for data wrangling library (e1071) #for calculating variable importance library (caret) #for general model fitting library (rpart) #for fitting decision trees library (ipred) #for fitting bagged decision trees
第2步:安装袋装模型
在此示例中,我们将使用名为“空气质量”的内置 R 数据集,其中包含纽约市 153 天的空气质量测量值。
#view structure of air quality dataset
str(airquality)
'data.frame': 153 obs. of 6 variables:
$ Ozone: int 41 36 12 18 NA 28 23 19 8 NA ...
$Solar.R: int 190 118 149 313 NA NA 299 99 19 194 ...
$ Wind: num 7.4 8 12.6 11.5 14.3 14.9 8.6 13.8 20.1 8.6 ...
$ Temp: int 67 72 74 62 56 66 65 59 61 69 ...
$Month: int 5 5 5 5 5 5 5 5 5 5 ...
$Day: int 1 2 3 4 5 6 7 8 9 10 ...
以下代码演示了如何使用ipred库中的bagging()函数在 R 中拟合 bagged 模型。
#make this example reproducible set.seed(1) #fit the bagged model bag <- bagging( formula = Ozone ~ ., data = airquality, nbagg = 150 , coob = TRUE , control = rpart. control (minsplit = 2 , cp = 0 ) ) #display fitted bagged model bag Bagging regression trees with 150 bootstrap replications Call: bagging.data.frame(formula = Ozone ~ ., data = airquality, nbagg = 150, coob = TRUE, control = rpart.control(minsplit = 2, cp = 0)) Out-of-bag estimate of root mean squared error: 17.4973
请注意,我们选择使用150 个引导样本来构建袋装模型,并指定coob为TRUE以获得估计的袋外误差。
我们还在rpart.control()函数中使用了以下规范:
- minsplit = 2:这告诉模型只需要节点中的 2 个观测值即可进行分割。
- cp = 0 。这是复杂性参数。通过将其设置为 0,我们不需要模型能够以任何方式改进整体拟合来执行分割。
本质上,这两个论点允许个体树生长得非常深,从而导致树具有高方差但低偏差。然后,当我们应用装袋时,我们能够减少最终模型的方差,同时保持较低的偏差。
从模型结果中,我们可以看到估计的袋外 RMSE 为17.4973 。这是臭氧预测值与实际观测值之间的平均差异。
第 3 步:可视化预测变量的重要性
尽管袋装模型往往比单个决策树提供更准确的预测,但很难解释和可视化拟合袋装模型的结果。
然而,我们可以通过计算由于给定预测变量的分布(在所有树上平均)而导致的 RSS(残差平方和)的总减少量来可视化预测变量的重要性。值越大,预测变量越重要。
以下代码展示了如何使用caret库中的varImp()函数为拟合袋模型创建变量重要性图:
#calculate variable importance VI <- data.frame(var= names (airquality[,-1]), imp= varImp (bag)) #sort variable importance descending VI_plot <- VI[ order (VI$Overall, decreasing= TRUE ),] #visualize variable importance with horizontal bar plot barplot(VI_plot$Overall, names.arg= rownames (VI_plot), horiz= TRUE , col=' steelblue ', xlab=' Variable Importance ')
我们可以看到Solar.R是模型中最重要的预测变量,而Month是最不重要的。
第 4 步:使用模型进行预测
最后,我们可以使用拟合袋模型对新的观察结果进行预测。
#define new observation new <- data.frame(Solar.R=150, Wind=8, Temp=70, Month=5, Day=5) #use fitted bagged model to predict Ozone value of new observation predict(bag, newdata=new) 24.4866666666667
根据预测变量的值,拟合袋模型预测这一天的臭氧值为24,487 。
此示例中使用的完整 R 代码可以在此处找到。