Loading...
墨滴

JerryZ

2021/09/10  阅读:79  主题:橙心

R语言机器学习建模和模型解释——简单的例子

R语言机器学习建模和模型解释——简单的例子

最近学习了一下用R来进行机器学习的建模,把流程简要介绍给大家,主要参考了【Lesson1】R 机器学习流程及案例实现 和Max Kuhn 的Caret文章。为了更让无基础的人快速了解整个流程框架,本文省去机器学习模型的原理及公式部分,如果需要了解,请戳 Here

机器学习建模的流程

Simple process of machine learning
Simple process of machine learning

机器学习建模一般分为以下几个步骤

1.将数据分为“训练集”和“测试集”。

2.用"训练集"训练模型和调参。

3.用模型预测"测试集",评估模型质量。

接下来我们就用一个案例来演示一下上述过程。

案例简介

案例中所使用的数据是来自kaggle的医疗支出数据集,它是一个由7个变量和1338个观察值组成的数据集。变量包括年龄age,性别sexbmi、孩子数量children、是否吸烟smoker、居住区域region以及医疗支出水平charges。我们的目标是通过这些数据拟合模型以预测医疗支出水平charges。由于本文主题是展示建模和解释模型的过程,就略去数据处理的步骤。 viewdata

用到的R包包括以下几个

library(dplyr)
library(tidyverse)
library(caret)
library(DALEX)
library(gbm)

分割数据

加载完R包之后就可以把数据分割成train(训练集)和test(测试集)两个部分了,分割数据用到的函数是caret包里面的createDataPartition()

setwd("C:/Users/Administrator/Desktop/insurance")
insurance=read.csv("insurance.csv")
ins=as.data.frame(insurance)
#分割数据
set.seed(13)
samp = createDataPartition(ins$charges, p = 0.7, list = FALSE)
ins_train = ins[samp,]
ins_test = ins[-samp,]

建模

接着用caret包的train() 建立模型,因变量为charges 自变量默认选择全部,需要提前使用trainControl()设置resampling方法,里面涉及"boot", "cv", "LOOCV", "LGOCV"等一系列方法,这里我们设置为5-fold cross validation--method = "cv", number = 5。 用RMSE来评估模型质量。 本文使用了两种机器学习方法:随机森林(randomforest)&梯度增强算法(Gradient Boosting);以及广义线性模型(Generalize Linear Model)进行建模。

算法名称 name 缩写 模型类别
随机森林算法 Random Forest rf 机器学习
梯度增强算法 Gradient Boosting gbm 机器学习
广义线性模型 Generalize Linear Model glm 线性模型
#用Caret包建立模型
metric <- "RMSE"
myControl <- trainControl(method="cv", number=5)

set.seed(12)
model_rf = train(charges ~.,
                 data=ins_train,
                 tuneLength = 1,
                 method = "rf",
                 num.trees=500,
                 trControl = myControl)

set.seed(12)
model_glm = train(charges ~. ,
                  data=ins_train,
                  method = "glm",
                  trControl = myControl)


set.seed(12)
model_gbm = train(charges ~.,
                  data=ins_train,
                  method = "gbm",
                  trControl = myControl)

模型解释器

评估模型质量之前要先用DALEX包中的explian()生成模型的解释器,以后评价模型质量和解释变量响应性的时候都需要解释器作为媒介。

#对模型进行解释
explainer_rf<-explain(model_rf,label = "rf",
                      data = ins_test,
                      y = ins_test$charges)

explainer_glm<-explain(model_glm,label = "glm",
                       data = ins_test,
                       y = ins_test$charges)

explainer_gbm<-explain(model_gbm,label = "gbm",
                       data = ins_test,
                       y = ins_test$charges)

评估模型质量

绘制累积残差分布图和箱线图分布图

#模型表现
per_rf<-model_performance(explainer_rf)
per_glm<-model_performance(explainer_glm)
per_gbm<-model_performance(explainer_gbm)
#累积残差分布图
plot(per_rf,per_glm,per_gbm)
residual1
residual1
#箱线图分布图
plot(per_rf,per_glm,per_gbm,geom = "boxplot")

residual2 通过这两张图我们可以看出gbm效果是最好的,rf次之。

评估模型变量重要性

#模型变量重要性
plot(varImp(model_rf))

RF模型的变量重要性 RF模型中,吸烟史是影响医疗支出最重要的因素,其次是bmi、年龄、孩子数量和居住地区。性别对医疗支出几乎没有影响。

#模型变量重要性
plot(varImp(model_gbm))

GBM模型的变量重要性GBM模型中各变量对医疗支出的影响与RF模型大致相同,只是bmi较之前稍高一些,居住地区较之前稍低一些。

#模型变量重要性
plot(varImp(model_glm))

GLM模型的变量重要性GLM模型中,年龄比bmi更加重要。我们在稍后的单变量分析中可以看到为什么会出现这种情况。

变量响应性

partial_dependency:用DALEX包的 variable_effect() 解释单个连续性解释变量与响应变量关系

#age
pdp_rf1<-variable_effect(explainer_rf,
                         variable = "age",
                         type = "partial_dependency")
pdp_glm1<-variable_effect(explainer_glm,
                          variable = "age",
                          type = "partial_dependency")

pdp_gbm1<-variable_effect(explainer_gbm,
                          variables = "age",
                          type = "partial_dependency")
plot(pdp_rf1,pdp_glm1,pdp_gbm1)
年龄的响应性
年龄的响应性
#bmi
pdp_rf2<-variable_effect(explainer_rf,
                         variable = "bmi",
                         type = "partial_dependency")
pdp_glm2<-variable_effect(explainer_glm,
                          variable = "bmi",
                          type = "partial_dependency")

pdp_gbm2<-variable_effect(explainer_gbm,
                          variables = "bmi",
                          type = "partial_dependency")
plot(pdp_rf2,pdp_glm2,pdp_gbm2)

bmi的响应性
bmi的响应性

可以看到,在三种模型中,年龄对医疗支出的影响都接近线性相关。但是bmi在两种机器学习模型当中,对医疗支出都呈现非线性的影响,在bmi=30的处有一个台阶样的提升。而GLM模型中连续性变量对于医疗支出的影响都是线性增加的,这就造成了bmi在两类模型中重要程度不一样的现象。同时这也体现出了机器学习模型的优势,它能够拟合线性模型不能拟合的非线性关系。

教师节

今天是教师节,祝辛勤的园丁们节日快乐!

想了解更多关于R语言和流行病学的知识,请扫描下方的二维码关注公众号EpihubEPIHUB

JerryZ

2021/09/10  阅读:79  主题:橙心

作者介绍

JerryZ