【R语言】基于多模型的变量重要性图 (Variable Importance Plots)

变量重要性图 Variable Importance Plots

  • 1. 写在前面
  • 2.1数据导入
  • 2.2 模型训练
  • 2.3 变量重要性
  • 2.4 变量重要性图
  • 2.5 模型模拟验证
  • 3.基于caret包计算变量重要性

1. 写在前面

  好久没有更新博客了,正好最近在帮老师做一个项目,里面涉及到了不同环境变量的重要性制图,所以在这里把我的理解进行分享,这应该是大家都可能遇到的问题。笔者水平有限,大家发现什么问题可以给我指出。
  变量重要度图(Variable importance plots) 可以非常直观的展示各个变量在模型中的重要度,从而可以更好的理解和解释所建立的模型。

2.1数据导入

  这里我随机生成了一个数据集,包含了10个x变量

## 基于树模型的变量重要度图(Variable Importance Plots)-------------------------
library(vip) # 制作变量重要度图
library(rpart) # 决策树
library(randomForest) # 随机森林
library(xgboost) # 梯度提升决策树
library(mgcv)
library(caret)
library(ggplot2) # 作图mydata <- gen_friedman( # 创建数据n_samples = 100, # 行数sigma = 1,       # 标准差seed = 123       # 让数据可以重复
)
nrow(mydata)
head(mydata)

数据集结构:
在这里插入图片描述

2.2 模型训练

  这里包括了四个模型:决策树(Decision trees)、随机森林(Random forests)、梯度提升决策树(GBMs)、广义可加模型(GAM)

# 1、拟合回归决策树模型-------------------------------------------
model_tree <- rpart(y ~ ., data = mydata)# 2、拟合随机森林模型---------------------------------------------
model_rf <- randomForest(y ~ .,data = mydata,importance = TRUE)  # 计算变量的重要度   # 3、拟合梯度提升决策树模型(GBMs)---------------------------------
model_gbm <- xgboost(data = data.matrix(subset(mydata, select = -y)), # 剔除y后将数据转化为矩阵格式label = mydata$y, # 指定因变量ynrounds = 100, # 提升迭代的最大次数max_depth = 5, # 树的最大深度为5,默认为6verbose = 0  # 不输出模型的运行信息
)# 4、拟合广义可加模型 (GAM)----------------------------------------
# 自动创建公式字符串:将所有自变量包裹在平滑函数 s() 中
gam_formula <- as.formula(paste("y ~", paste0("s(", names(mydata)[-1], ")", collapse = " + ")))
model_gam <- gam(gam_formula, data = mydata)
# # 拟合广义可加模型 (GAM)
# model_gam <- gam(y ~ s(x1) + s(x2) + s(x3) + s(x4) + s(x5)
#                  + s(x6) + s(x7) + s(x8) + s(x9) + s(x10),
#                  data = mydata)

2.3 变量重要性

  使用vi()函数可以得到不同模型模拟的变量的重要性值

# 决策树
vi(model_tree)
# 随机森林
vi(model_rf)
# GBMs
vi(model_gbm)
# 计算GAM模型的变量重要度
vi_gam <- vi(model_gam, method = "permute", target = "y", metric = "rmse", pred_wrapper = predict)

简单列出其中一个模型的结果:
在这里插入图片描述

2.4 变量重要性图

  这可能是大家最关心的地方

# 制作变量重要度图
p1 <- vip(model_tree) + ggtitle("Single tree")
p2 <- vip(model_rf) + ggtitle("Random forest")
p3 <- vip(model_gbm) + ggtitle("Gradient boosting")
p4 <- vip(vi_gam) + ggtitle("GAM (Generalized Additive Model)")# 将图片合并成1行3列
grid.arrange(p1, p2, p3, p4, nrow = 2)

结果展示:
在这里插入图片描述
可以看出,不同模型模拟的结果基本上是一致的。

2.5 模型模拟验证

  这里用到了三个指标:R2、MAE和RMSE,具体公式如下,这里我没有使用Adjusted R2:
在这里插入图片描述

## 模型模拟效果----------------------------------------------------------------
# 定义计算 R2的函数
calc_r2 <- function(actual, predicted) {ss_res <- sum((actual - predicted) ^ 2)ss_tot <- sum((actual - mean(actual)) ^ 2)1 - (ss_res / ss_tot)
}# 定义计算 MAE 的函数
calc_mae <- function(actual, predicted) {mean(abs(actual - predicted))
}# 定义计算 RMSE 的函数
calc_rmse <- function(actual, predicted) {sqrt(mean((actual - predicted) ^ 2))
}# 获取实际值
actual_values <- mydata$y# 计算每个模型的预测值
pred_tree <- predict(model_tree, mydata)
pred_rf <- predict(model_rf, mydata)
pred_gbm <- predict(model_gbm, data.matrix(subset(mydata, select = -y)))
pred_gam <- predict(model_gam, mydata)# 计算 R2
r2_tree <- calc_r2(actual_values, pred_tree)
r2_rf <- calc_r2(actual_values, pred_rf)
r2_gbm <- calc_r2(actual_values, pred_gbm)
r2_gam <- calc_r2(actual_values, pred_gam)# 计算 MAE
mae_tree <- calc_mae(actual_values, pred_tree)
mae_rf <- calc_mae(actual_values, pred_rf)
mae_gbm <- calc_mae(actual_values, pred_gbm)
mae_gam <- calc_mae(actual_values, pred_gam)# 计算 RMSE
rmse_tree <- calc_rmse(actual_values, pred_tree)
rmse_rf <- calc_rmse(actual_values, pred_rf)
rmse_gbm <- calc_rmse(actual_values, pred_gbm)
rmse_gam <- calc_rmse(actual_values, pred_gam)# 输出结果
cat("Decision Tree:               R2 =", r2_tree,  "MAE =", mae_tree, "RMSE =", rmse_tree, "\n","Random Forest:              R2 =", r2_rf,  "MAE =", mae_rf, "RMSE =", rmse_rf, "\n","Gradient Boosting:          R2 =", r2_gbm,  "MAE =", mae_gbm, "RMSE =", rmse_gbm, "\n","Generalized Additive Model: R2 =", r2_gam,  "MAE =", mae_gam, "RMSE =", rmse_gam, "\n"
)

结果展示:
在这里插入图片描述

3.基于caret包计算变量重要性

  以上内容没有涉及到交叉验证,并且所有的模型评价指标都是手动计算的,现在我将使用caret包提供的函数进行计算。
  caret(Classification and Regression Ensemble Training)包 是 R 语言中一个非常强大的工具,用于分类和回归模型的训练和评估。它提供了一个统一的接口来实现不同的机器学习算法,并支持模型的调参、训练、预测和评估。
主要功能和特点

  • 统一的接口 : caret 提供了一个统一的接口来训练和评估各种机器学习模型,无论是分类模型还是回归模型。这样,你可以在不同的算法之间进行比较和选择。
  • 模型训练 : 使用 train() 函数可以训练模型,支持多种模型算法,如决策树、随机森林、支持向量机(SVM)、梯度提升、线性回归、广义可加模型(GAM)等。
  • 调参(Tuning): caret 允许你通过网格搜索(grid search)和随机搜索(random search)来调节模型的超参数,以找到最佳的参数组合。使用 train() 函数时,可以通过 tuneGrid 或 tuneLength 参数来指定需要调节的参数范围。
  • 交叉验证(Cross-Validation): 提供了多种交叉验证方法,如 k 折交叉验证(k-fold cross-validation)来评估模型的性能。你可以通过 trainControl() 函数设置交叉验证的参数。
  • 性能评估 : caret 可以计算模型的性能指标,如准确率(accuracy)、均方根误差(RMSE)、均方误差(MSE)、调整后的 R²(Adjusted R²)等。可以通过 postResample() 函数来提取模型的性能度量。
  • 数据预处理 : 支持数据预处理操作,如数据标准化(standardization)、归一化(normalization)、特征选择(feature selection)等。这些操作可以通过 preProcess() 函数实现。
  • 模型集成 : 支持多种模型集成方法,如堆叠(stacking)和集成(ensembling),以提高模型的预测性能。
## caret ----------------------------------------------------------------------
# Set up 10-fold cross-validation
train_control <- trainControl(method = "cv", number = 10)# glm with 10-fold cross-validation
model_glm_cv <- train(y ~ .,data = mydata,method = "glm",trControl = train_control,metric = "RMSE"
)# GAM with 10-fold cross-validation
model_gam_cv <- train(y ~ .,data = mydata,method = "gamSpline",trControl = train_control,metric = "RMSE"
)# Random Forest with 10-fold cross-validation
model_rf_cv <- train(y ~ .,data = mydata,method = "rf",trControl = train_control,metric = "RMSE"
)# Gradient Boosting with 10-fold cross-validation
model_gbm_cv <- train(y ~ .,data = mydata,method = "xgbTree",trControl = train_control,metric = "RMSE"
)# 计算并绘制变量重要性
vip(model_glm_cv)
vip(model_gam_cv)
vip(model_rf_cv)
vip(model_gbm_cv)# make Variable Importance Plots
p11 <- vip(model_glm_cv) + ggtitle("Generalized linear Model")
p21 <- vip(model_gam_cv) + ggtitle("Random forest")
p31 <- vip(model_rf_cv) + ggtitle("Gradient boosting")
p41 <- vip(model_gbm_cv) + ggtitle("Generalized Additive Model")grid.arrange(p11, p21, p31, p41, nrow = 2)# Extract the results
results_glm <- model_glm_cv$results
results_rf <- model_rf_cv$results
results_gbm <- model_gbm_cv$results
results_gam <- model_gam_cv$results# Print results
cat("Generalized linear Model (GLM):   R2 =", max(results_glm$Rsquared), "MAE =", min(results_tree$MAE), "RMSE =", min(results_tree$RMSE), "\n","Random Forest (RF):              R2 =", max(results_rf$Rsquared), "MAE =", min(results_rf$MAE), "RMSE =", min(results_rf$RMSE), "\n","Gradient Boosting (GBM):         R2 =", max(results_gbm$Rsquared), "MAE =", min(results_gbm$MAE), "RMSE =", min(results_gbm$RMSE), "\n","Generalized Additive Model(GAM): R2 =", max(results_gam$Rsquared), "MAE =", min(results_gam$MAE), "RMSE =", min(results_gam$RMSE), "\n"
)

结果展示:
在这里插入图片描述

模型模拟精度验证:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/406615.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

动态规划篇-代码随想录算法训练营第三十七天| 打家劫舍Ⅰ,打家劫舍Ⅱ,打家劫舍Ⅲ

打家劫舍Ⅰ 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 讲解视频&#xff1a; 动态规划&#xff0c;偷不偷这个房间呢&#xff1f;| LeetCode&#xff1a;198.打家劫舍 题目描述&#xff1a; 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间…

2024年8月22日嵌入式学习

今日主要学习网络知识 udp recvfrom ssize_t recvfrom(int sockfd, //socket的fd void *buf, //保存数据的一块空间的地址 size_t len, //这块空间的大小 int flags, // 0 默认的接收方式 --- 阻塞方式…

10 Java数据结构:包装类、数组(Array工具类)、ArrayList

文章目录 前言一、包装类1、Integer&#xff08;1&#xff09;基本用法&#xff08;2&#xff09;JDK5前的包装类用法&#xff08;了解即可&#xff0c;能更好帮助我们理解下面的自动装箱和自动拆箱机制&#xff09;&#xff08;3&#xff09;自动装箱与自动拆箱机制 --- 导致&…

基于HarmonyOS的宠物收养系统的设计与实现(一)

基于HarmonyOS的宠物收养系统的设计与实现&#xff08;一&#xff09; 本系统是简易的宠物收养系统&#xff0c;为了更加熟练地掌握HarmonyOS相关技术的使用。 项目创建 创建一个空项目取名为PetApp 首页实现&#xff08;组件导航使用&#xff09; 官方文档&#xff1a;组…

redis实战——go-redis的使用与redis基础数据类型的使用场景(一)

一.go-redis的安装与快速开始 这里操作redis数据库&#xff0c;我们选用go-redis这一第三方库来操作&#xff0c;首先是三方库的下载&#xff0c;我们可以执行下面这个命令&#xff1a; go get github.com/redis/go-redis/v9最后我们尝试一下连接本机的redis数据库&#xff0…

黑神话孙悟空:自媒体小白的流量密码!

当下&#xff0c;黑神话孙悟空的热度如熊熊烈火&#xff0c;席卷了整个游戏世界。 只要与这个话题沾边&#xff0c;似乎就能轻松吸引大量关注。 那么&#xff0c;对于不怎么懂自媒体运营的小伙伴来说&#xff0c;该如何抓住这个机遇呢&#xff1f; 别担心&#xff0c;我们用以…

授权cleanmymac访问全部磁盘 Mac授权访问权限 cleanmymac缺少权限

CleanMyMac是Mac系统下的一款专业的苹果电脑清理软件&#xff0c;同时也是一款优秀的电脑系统管理软件。它能有效清理系统垃圾&#xff0c;快速释放磁盘内存&#xff0c;缓解卡顿现象&#xff0c;保障系统顺畅地运行。 全磁盘访问权限&#xff0c;就好比机场内进行的安全检查。…

微软AI人工智能认证有哪些?

微软提供的人工智能认证主要包括以下几个方面&#xff1a; Azure AI Fundamentals&#xff08;AI900认证&#xff09;&#xff1a;这是一个基础认证&#xff0c;旨在展示与Microsoft Azure软件和服务开发相关的基本AI概念&#xff0c;以创建AI解决方案。它面向具有技术和非技术…

Vue 导航条+滑块效果

目录 前言代码效果展示导航实现代码导航实现代码导航应用代码前言 总结一个最近开发的需求。设计稿里面有一个置顶的导航条,要求在激活的项目下面展示个下划线。我最先开始尝试的是使用 after 的伪类选择器,直接效果一样,但是展示的时候就会闪现变化,感觉不够自然,参考了一…

ES6解构赋值详解;全面掌握:JavaScript解构赋值的终极指南

目录 全面掌握&#xff1a;JavaScript解构赋值的终极指南 一、数组解构赋值 1、基本用法 2、跳过元素 3、剩余元素 4、默认值 二、对象解构赋值 1、基本用法 2、变量重命名 3、默认值 4、嵌套解构 三、复杂的嵌套结构解构 四、函数参数解构赋值 1、对象解构作为函…

ARM——驱动——Linux启动流程和Linux启动

一、flash存储器 lash存储器&#xff0c;全称为Flash EEPROM Memory&#xff0c;又名闪存&#xff0c;是一种长寿命的非易失性存储器。它能够在断电情况下保持所存储的数据信息&#xff0c;因此非常适合用于存储需要持久保存的数据。Flash存储器的数据删除不是以单个的字节为单…

单细胞组学大模型(1)--- iSEEEK

–https://doi.org/10.1093/bib/bbab573 A universal approach for integrating super large-scale single-cell transcriptomes by exploring gene rankings 打算深挖单细胞大模型的一系列文章、算法和代码&#xff0c;按时间线来去学习也许会好一些&#xff0c;所以第一篇带…

Spring Cloud Consul面试题

​ ​ 您好&#xff0c;我是程序员小羊&#xff01; 前言 Spring Cloud Consul 是微服务架构中的一个重要组件&#xff0c;用于服务发现、配置管理以及健康检查。了解 Spring Cloud Consul 的工作原理和应用场景&#xff0c;对于微服务开发者和架构师来说至关重要。以下是一些常…

思特科技:国家宝藏数字体验馆展现东方美学 让“文物活起来”

01      思特科技为“国家宝藏数字体验展”提供“数字技术”支持&#xff0c;带来国宝的数字化演绎。以《国家宝藏》顶级IP为基础&#xff0c;打造的全新沉浸文化项目“国宝数字体验展“&#xff0c;借由文物的视角、站在历史的星河中&#xff0c;探寻时间长河中不变的智慧…

CART决策树-基尼指数(全网最详解)

文章目录 一、基尼指数的定义二、基尼指数在CART决策树中的应用三、基尼指数与CART决策树的构建1.计算每个子集的基尼系数&#xff1a;2.计算基尼指数3.选择最优特征4.其余基尼指数5.构建决策树 四、总结 CART决策树基尼指数是CART&#xff08;Classification And Regression T…

8-9月强化速成|30天带刷《严选题》《660》

如果你的目标是90-100分&#xff0c;肯定是够了&#xff0c;但是像下面这样微调一下更好 你的基础阶段做的是辅导讲义上的题目&#xff0c;那么你的基础阶段的题量肯定是够了。 但是强化阶段如果只做660题和严选题&#xff0c;这个题量还有有一些薄弱的&#xff0c;建议可以把…

四、4 逻辑操作符

按位与、按位或关注二进制位 逻辑与、逻辑或只关注真假 1、&&逻辑与&#xff08;并且&#xff09; 左边和右边都为真&#xff0c;结果为真&#xff08;为1&#xff09; 有一个为假&#xff0c;结果为假&#xff08;为0&#xff09; 2、|| 逻辑或&#xff08;或者&a…

NumExpr加速计算(numpy表达式)

文章目录 一、简介二、安装三、函数详解四、性能评估 Python 性能优化&#xff1a;NumExpr Numba CuPy 一、简介 numexpr&#xff08;全称&#xff1a;numpy expression&#xff09;&#xff1a;用于在 NumPy 表达式上快速执行元素级运算的 Python 加速库。 优势&#xff1…

python非交互连接mysql+mycat读写分离实现

python非交互连接mysql >>>import pymysql >>>connpymysql.connect(host"192.168.118.57",port3306,database"test",user"root",password"root") >>> cursorconn.cursor() >>> cursor.execut…

Element-ui table进阶使用

最近项目有多个报表开发的需求&#xff0c;我采用的是凤翎前端组件框架&#xff08;基于element-ui开发&#xff09;&#xff0c;大伙可以直接参考element-ui组件库文档&#xff0c;把标签中的fks替换为el即可。下面我会按顺序一一展开细说这些需求&#xff1a; 1、有多级表头…