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

news2025/1/11 21:58:57

变量重要性图 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, # 指定因变量y
  nrounds = 100, # 提升迭代的最大次数
  max_depth = 5, # 树的最大深度为5,默认为6
  verbose = 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.coloradmin.cn/o/2064932.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于鸿蒙Next模拟扫图识物的一个过程

一、功能介绍&#xff08;基础&#xff09; 基于鸿蒙Next模拟扫图识物的一个过程&#xff0c;扫描到图片&#xff0c;提示出相关的图片内容&#xff0c;是一个什么东西。 二、使用场景&#xff08;大类&#xff09; 支付、社交、信息获取、在线调查、教育学习等等。 三、实现…

Vue指令:v-cloak、v-once、v-pre 指令

1、v-cloak 指令 v-cloak 指令可以隐藏未编译的 Mustache 标签直到实例准备完毕&#xff0c;否则在渲染页面时&#xff0c;有可能用户会先看到 Mustache 标签&#xff0c;然后看到编译后的数据。 &#xff08;1&#xff09;设置CSS样式 display:none <style type"te…

别再盲目推广了!用Xinstall,效果翻倍

在移动互联网时代&#xff0c;App的运营推广成为了开发者们最为关注的话题之一。然而&#xff0c;随着市场竞争的加剧&#xff0c;推广难度也越来越大。这时候&#xff0c;一款名为Xinstall的品牌走进了我们的视线&#xff0c;它以其独特的技术和解决方案&#xff0c;为App推广…

【系统架构设计】软件架构设计(2)

【系统架构设计】软件架构设计&#xff08;1&#xff09; 软件架构概述架构需求与软件质量属性软件架构风格层次系统架构风格面向服务的架构SOA概述微服务微服务和SOA差异 软件架构概述 架构需求与软件质量属性 软件架构风格 层次系统架构风格 面向服务的架构 SOA概述 面…

【生日视频制作】教师节中秋节国庆节直升飞机AE模板修改文字软件生成器教程特效素材【AE模板】

飞机生日视频制作教程AE模板改文字特效广软件告生成器玩法素材 怎么如何做的【生日视频制作】教师节中秋节国庆节直升飞机AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤&#xff1a; 安装AE软件 下载AE模板 把AE模板导入AE软件 修改图片或文字 渲染出视频…

一起学Java(3)-Java项目构建工具Gradle和Maven场景定位和优缺点对比

在第一步创建的项目&#xff08;java-all-in-one&#xff09;项目里&#xff0c;我们提到了使用Gradle作为项目构建工具。看到这里&#xff0c;不知道你是否有疑惑&#xff0c;什么是项目构建工具。Java项目常用构建工具有哪些&#xff1f;都有什么特点&#xff1f; 带着疑惑&…

网络安全——基础知识记忆梳理

1. SQL注入攻击 SQL注入攻击是一种常见的网络安全威胁&#xff0c;它利用Web应用程序中对用户输入的数据的不正确处理&#xff0c;攻击者可以在SQL查询中注入恶意代码&#xff0c;从而执行非授权的数据库操作。这种攻击方式可以导致数据泄漏、数据篡改、绕过认证等多种安全问题…

【java计算机毕设】足浴城消费系统小程序MySQL ssm vue uniapp maven项目设计源代码 编程语言 小组课后作业 寒暑假作业

目录 1项目功能 2项目介绍 3项目地址 1项目功能 【java计算机毕设】足浴城消费系统小程序MySQL ssm vue uniapp maven项目设计源代码 编程语言 小组课后作业 寒暑假作业 2项目介绍 系统功能&#xff1a; 足浴城消费系统小程序包括管理员、用户、商家三种角色。 管理员功能&…

Linux基础I/O之文件缓冲区

一、缓冲区的基本概念 缓冲区这个概念&#xff0c;我相信大家或多或少的有听到过&#xff0c;那么其到底是个什么东西呢&#xff1f; 简单地理解一下&#xff0c;其可以被看做一部分的内存&#xff08;可以认为是malloc来的&#xff09;。 那为什么要有缓冲区这个东西呢&#x…

C语言典型例题48

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 习题3.8 有4个圆塔&#xff0c;圆形分别为&#xff08;2,2&#xff09;、&#xff08;-2,2&#xff09;、&#xff08;-2&#xff0c;-2&#xff09;、&#xff08;2&#xff0c;-2&#xff09;&#xff0c;圆半径为…

uni-app 手记集。

1、uni-app 是一个使用 Vue.js 开发的前端应用的框架&#xff0c;所以不会Vue.js的小伙伴可以先去看看Vue.js的基础教学。 2、.vue文件结构 <template><div class"container"></div> </template><script type"text/ecmascript-6&q…

开放式耳机怎么戴?会有伤害?四款开放式蓝牙耳机排行榜前十名

老实说&#xff0c;开放式耳机对耳朵会产生什么伤害&#xff1f;我不太能想出来。我倒是觉得入耳式耳机可能会&#xff0c;因为入耳式耳机需将耳机塞入耳朵耳道&#xff0c;那就会对耳道产生影响。使用者在佩戴入耳式耳机的时候耳道会变成一个接近完全封闭的状态&#xff0c;耳…

【实战篇】Port配置

目录 1 前言1.1 开发板特性1.2 电路原理分析2 步骤2.1 General配置2.2 PortContainer配置3 总结1 前言 本文讲解如何配置Port模块。Port的引脚配置在整个实验中非常的重要,一旦配置错误可能会导致实验失败。引脚如何配置,完全依赖于我们的硬件设计和芯片型号,我们这里以英飞…

PE文件空白区添加代码

1、C源码 #include <iostream> #include<windows.h>int main() {int i 1;std::cin >> i;if (i 100){MessageBoxA(0, 0, 0, 0);}return 0; }2、将上述源码编译成可执行文件PEParase.exe&#xff0c;备用 3、使用010Editor打开该exe文件&#xff0c;查找PE…

git revert操作引起的代码丢失以及解决方案

场景如下&#xff1a; 某项目下有很多开发中的分支&#xff0c;比如分支a&#xff0c;b&#xff0c;c&#xff0c;d都合并到了一个test分支上&#xff1b;某次误操作将test分支内容合到了分支e上&#xff0c;然后紧接着又revert了这次合并&#xff0c;试图撤销合并&#xff1b…

如何解决Windows虚拟机不能安装vmtools的问题?

今天学到个小tips给大家分享一下&#xff01;&#xff01;&#xff01;解决win7安装不了vmtools的问题&#xff0c;以及如何打补丁&#xff01; 大家有没有遇到过下面的问题&#xff0c;就是在再给win7装vmtools的时候无法安装的情况&#xff0c;我这里这个是win7的旗舰版就遇…

Google Ads投放 | 如何分析竞争对手的谷歌广告?

Google Ads广告投放是出海企业的必重要营销动作之一&#xff0c;而分析竞争对手的 Google 广告是优化您自己的广告策略的关键步骤。通过了解竞争对手的动向&#xff0c;您可以发现改进的机会并在竞争中保持领先地位。 今天整理了Google Ads 竞争对手分析的4种方法&#xff1a; …

Linux基础知识学习(五)

1. 用户组管理 每个用户都有一个用户组&#xff0c;系统可以对一个用户组中的所有用户进行集中管理&#xff08;开发、测试、运维、root&#xff09;。不同Linux 系统对用户组的规定有所不同&#xff0c;如Linux下的用户属于与它同名的用户组&#xff0c;这个用户组在创建用户…

技术速递|将 .NET Aspire 添加到您现有的 .NET 应用程序中

作者&#xff1a;Jon Galloway 排版&#xff1a;Alan Wang .NET Aspire 是一个针对 .NET 的新型云就绪堆栈&#xff0c;可帮助开发人员快速轻松地开发分布式应用程序。您可能已经看过一些演示&#xff0c;展示了大型 .NET 解决方案&#xff0c;其中充满了复杂的云依赖项&#x…

租房网站

TOC springboot0762租房网站 JAVA简介 Java主要采用CORBA技术和安全模型&#xff0c;可以在互联网应用的数据保护。它还提供了对EJB&#xff08;Enterprise JavaBeans&#xff09;的全面支持&#xff0c;java servlet API&#xff0c;Java&#xff08;java server pages&…