对于如何验证预测模型在新的数据集中是否有较好的拟合性能,除了第四十二讲中介绍的交叉验证外,还有一种更加复杂但稳定的方法,叫做自举重采样验证(boostrap-resampling)。
1. 自举重采样
自举重采样(bootstrap-resampling)验证可用于测量预测模型的准确性,也可用于评价模型的不确定性。该方法为从原始数据集中重复随机选择n个观察值的样本,并评估每个副本的模型性能。然后计算平均标准误差,从而衡量模型性能总体差异。
2. 加载所需的R包
- tidyverse 便于数据操作和可视化
- caret 用于计算交叉验证
library(tidyverse)
library(caret)
3. 数据示例
我们将使用R的内置数据集swiss。
# 加载数据
library(datasets)
data("swiss")
# 查看数据(随机选取3行数据来查看)
sample_n(swiss, 3)
Fertility Agriculture Examination Education Catholic Infant.Mortality
1 77.3 89.7 5 2 100.00 18.3
2 76.1 35.3 9 7 90.57 26.6
3 83.1 45.1 6 9 84.84 22.2
研究问题:根据社会经济相关的多个指标(Agriculture,Examination,Education,Catholic,Infant.Mortality)预测生育力得分(Fertility)。
4. 自举法(bootstrap)
自举法可用于量化评价预测模型的不确定性。
它包括从原始数据集中随机选择n个观测值的样本。然后,将这个称为自举数据集的子集用于评估模型。
重复此过程很多次,然后计算平均标准误差。结果可以显示模型性能的不确定性。
请注意,自举法的采样每次都是是通过替换运行的,即同一观察值在不同自举数据集中可能会出现多次。
4.1 评估预测模型的性能
以下示例将使用100个重采样的自举法来测试线性回归模型:
# 定义预测模型
train.control <- trainControl(method = "boot", number = 100)
# 训练模型
model <- train(Fertility ~., data = swiss, method = "lm",
trControl = train.control)
# 输出结果
print(model)
## Linear Regression
##
## 47 samples
## 5 predictor
##
## No pre-processing
## Resampling: Bootstrapped (100 reps)
## Summary of sample sizes: 47, 47, 47, 47, 47, 47, ...
## Resampling results:
##
## RMSE Rsquared MAE
## 8.4 0.597 6.76
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
结果输出的是100次重采样的平均模型性能:RMSE、R2和MAE。(详细解释请至第四十一讲,插入链接!!!)
RMSE(均方根误差)和MAE(均值绝对误差)代表模型预测误差的两种不同度量。RMSE和MAE越低,模型越好。R2代表模型中包含的预测变量对结果变化的解释百分比。R2越高,模型越好。
4.2 量化预测模型的不确定性和置信区间
自举法可用于量化预测模型各个系数的不确定性(或标准误)。
例如,您可能想使用自举法来估计线性回归beta系数的准确性。
步骤如下:
- 创建一个简单函数,model_coef(),该函数将获取预测函数的截距和每个预测变量的系数(回归系数)。
- 将函数boot()应用于完整数据集的观察值以计算系数
我们首先创建一个返回回归模型系数的函数:
model_coef <- function(data, index){
coef(lm(Fertility ~., data = data, subset = index))
}
model_coef(swiss, 1:47)
## (Intercept) Agriculture Examination Education
## 66.915 -0.172 -0.258 -0.871
## Catholic Infant.Mortality
## 0.104 1.077
接下来,我们使用boot()函数[boot软件包中]来计算500个自举数据集的各个截距和预测变量的系数的标准误差:
library(boot)
boot(swiss, model_coef, 500)
##
## ORDINARY NONPARAMETRIC BOOTSTRAP
##
##
## Call:
## boot(data = swiss, statistic = model_coef, R = 500)
##
##
## Bootstrap Statistics :
## original bias std. error
## t1* 66.915 -2.04e-01 10.9174
## t2* -0.172 -5.62e-03 0.0639
## t3* -0.258 -2.27e-02 0.2524
## t4* -0.871 3.89e-05 0.2203
## t5* 0.104 -7.77e-04 0.0319
## t6* 1.077 4.45e-02 0.4478
在上面的输出中,
- original列对应于回归系数。列中给出了相关的标准误差std.error。
- t1对应于截距,t2对应Agriculture以此类推...
例如,可以看出,Agriculture的回归系数的标准误差(SE)为0.06。
请注意,标准误差衡量的是β系数的变异性/准确性。它可用于计算系数的置信区间。
例如,给定系数b的95%置信区间定义为b +/- 2*SE(b),其中:
- b的下限= b - 2*SE(b) = -0.172 - (2*0.0680) = -0.308(Agriculture的系数)
- b的上限= b + 2*SE(b) = -0.172 + (2*0.0680) = -0.036(Agriculture的系数)
也就是说,[-0.308,-0.036]区间中包含Agriculture的系数的真实值的可能性大约为95%。
使用标准lm()函数会产生稍有不同的标准误差,因为线性模型对数据进行了一些假设:
- Linearity 线性:应变量和每个自变量都是线性关系。
- Indpendence 独立性:对于所有的观测值,它们的误差项相互之间是独立的。
- Normality 正态性:误差项服从正态分布。
- Equal-variance 等方差:所有的误差项具有同样方差。
summary(lm(Fertility ~., data = swiss))$coef
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 66.915 10.7060 6.25 1.91e-07
## Agriculture -0.172 0.0703 -2.45 1.87e-02
## Examination -0.258 0.2539 -1.02 3.15e-01
## Education -0.871 0.1830 -4.76 2.43e-05
## Catholic 0.104 0.0353 2.95 5.19e-03
## Infant.Mortality 1.077 0.3817 2.82 7.34e-03
自举重采样验证法不依赖于线性模型做出的任何假设,因此,它可能提供比summary()函数更准确的系数标准误差估计。
参考内容:
1. Alboukadel Kassambara, Machine Learning Essentials: Practical Guide in R
今晚,9月24日21:00,我们邀请到了美国心脏病学会期刊JACC: Cardiovascular Interventions主编David J. Moliterno博士为大家带来主题为“在JACC期刊上发表论文的技巧”,从期刊编辑的角度为大家解读如何发表论文,欢迎大家来免费看直播,和主编在线交流~参与方式见下方海报~
如果您觉得我说的对您有帮助,请点赞让我感到您的支持,您的支持是我写作最大的动力~
ijournal:高颜值的期刊检索网站,助您快速找到理想目标期刊(weixin小程序也上线了哦)
投必得:全专业中英文论文润色编辑助力您的论文快速发表,点击了解业务详情
专栏传送门:
投必得科研软件安装使用手册;投必得:SCI期刊介绍与选择;投必得,教你写论文;投必得统计分析大讲堂;投必得科研生活解忧杂货店