如何在 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 个引导样本来构建袋装模型,并指定coobTRUE以获得估计的袋外误差。

我们还在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 ')

R 中的变量重要性图

我们可以看到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 代码可以在此处找到。

添加评论

您的电子邮箱地址不会被公开。 必填项已用*标注