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

欢乐狗  金牌会员 | 2024-8-27 04:01:06 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 546|帖子 546|积分 1638

1. 写在前面

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

  这里我随机生成了一个数据集,包含了10个x变量
  1. ## 基于树模型的变量重要度图(Variable Importance Plots)-------------------------
  2. library(vip) # 制作变量重要度图
  3. library(rpart) # 决策树
  4. library(randomForest) # 随机森林
  5. library(xgboost) # 梯度提升决策树
  6. library(mgcv)
  7. library(caret)
  8. library(ggplot2) # 作图
  9. mydata <- gen_friedman( # 创建数据
  10.   n_samples = 100, # 行数
  11.   sigma = 1,       # 标准差
  12.   seed = 123       # 让数据可以重复
  13. )
  14. nrow(mydata)
  15. head(mydata)
复制代码
数据集结构:

2.2 模型训练

  这里包括了四个模型:决策树(Decision trees)、随机森林(Random forests)、梯度提拔决策树(GBMs)、广义可加模型(GAM)
  1. # 1、拟合回归决策树模型-------------------------------------------
  2. model_tree <- rpart(y ~ ., data = mydata)
  3. # 2、拟合随机森林模型---------------------------------------------
  4. model_rf <- randomForest(y ~ .,
  5.                          data = mydata,
  6.                          importance = TRUE)  # 计算变量的重要度   
  7. # 3、拟合梯度提升决策树模型(GBMs)---------------------------------
  8. model_gbm <- xgboost(
  9.   data = data.matrix(subset(mydata, select = -y)), # 剔除y后将数据转化为矩阵格式
  10.   label = mydata$y, # 指定因变量y
  11.   nrounds = 100, # 提升迭代的最大次数
  12.   max_depth = 5, # 树的最大深度为5,默认为6
  13.   verbose = 0  # 不输出模型的运行信息
  14. )
  15. # 4、拟合广义可加模型 (GAM)----------------------------------------
  16. # 自动创建公式字符串:将所有自变量包裹在平滑函数 s() 中
  17. gam_formula <- as.formula(paste("y ~", paste0("s(", names(mydata)[-1], ")"
  18.                                               , collapse = " + ")))
  19. model_gam <- gam(gam_formula, data = mydata)
  20. # # 拟合广义可加模型 (GAM)
  21. # model_gam <- gam(y ~ s(x1) + s(x2) + s(x3) + s(x4) + s(x5)
  22. #                  + s(x6) + s(x7) + s(x8) + s(x9) + s(x10),
  23. #                  data = mydata)
复制代码
2.3 变量重要性

  利用vi()函数可以得到不同模型模拟的变量的重要性值
  1. # 决策树
  2. vi(model_tree)
  3. # 随机森林
  4. vi(model_rf)
  5. # GBMs
  6. vi(model_gbm)
  7. # 计算GAM模型的变量重要度
  8. vi_gam <- vi(model_gam, method = "permute", target = "y",
  9.              metric = "rmse", pred_wrapper = predict)
复制代码
简朴列出其中一个模型的结果:

2.4 变量重要性图

  这大概是大家最关心的地方
  1. # 制作变量重要度图
  2. p1 <- vip(model_tree) + ggtitle("Single tree")
  3. p2 <- vip(model_rf) + ggtitle("Random forest")
  4. p3 <- vip(model_gbm) + ggtitle("Gradient boosting")
  5. p4 <- vip(vi_gam) + ggtitle("GAM (Generalized Additive Model)")
  6. # 将图片合并成1行3列
  7. grid.arrange(p1, p2, p3, p4, nrow = 2)
复制代码
结果展示:

可以看出,不同模型模拟的结果根本上是一致的。
2.5 模型模拟验证

  这里用到了三个指标:R2、MAE和RMSE,详细公式如下,这里我没有利用Adjusted R2:

  1. ## 模型模拟效果----------------------------------------------------------------
  2. # 定义计算 R2的函数
  3. calc_r2 <- function(actual, predicted) {
  4.   ss_res <- sum((actual - predicted) ^ 2)
  5.   ss_tot <- sum((actual - mean(actual)) ^ 2)
  6.   1 - (ss_res / ss_tot)
  7. }
  8. # 定义计算 MAE 的函数
  9. calc_mae <- function(actual, predicted) {
  10.   mean(abs(actual - predicted))
  11. }
  12. # 定义计算 RMSE 的函数
  13. calc_rmse <- function(actual, predicted) {
  14.   sqrt(mean((actual - predicted) ^ 2))
  15. }
  16. # 获取实际值
  17. actual_values <- mydata$y
  18. # 计算每个模型的预测值
  19. pred_tree <- predict(model_tree, mydata)
  20. pred_rf <- predict(model_rf, mydata)
  21. pred_gbm <- predict(model_gbm, data.matrix(subset(mydata, select = -y)))
  22. pred_gam <- predict(model_gam, mydata)
  23. # 计算 R2
  24. r2_tree <- calc_r2(actual_values, pred_tree)
  25. r2_rf <- calc_r2(actual_values, pred_rf)
  26. r2_gbm <- calc_r2(actual_values, pred_gbm)
  27. r2_gam <- calc_r2(actual_values, pred_gam)
  28. # 计算 MAE
  29. mae_tree <- calc_mae(actual_values, pred_tree)
  30. mae_rf <- calc_mae(actual_values, pred_rf)
  31. mae_gbm <- calc_mae(actual_values, pred_gbm)
  32. mae_gam <- calc_mae(actual_values, pred_gam)
  33. # 计算 RMSE
  34. rmse_tree <- calc_rmse(actual_values, pred_tree)
  35. rmse_rf <- calc_rmse(actual_values, pred_rf)
  36. rmse_gbm <- calc_rmse(actual_values, pred_gbm)
  37. rmse_gam <- calc_rmse(actual_values, pred_gam)
  38. # 输出结果
  39. cat(
  40.   "Decision Tree:               R2 =", r2_tree,  "MAE =", mae_tree, "RMSE =", rmse_tree, "\n",
  41.   "Random Forest:              R2 =", r2_rf,  "MAE =", mae_rf, "RMSE =", rmse_rf, "\n",
  42.   "Gradient Boosting:          R2 =", r2_gbm,  "MAE =", mae_gbm, "RMSE =", rmse_gbm, "\n",
  43.   "Generalized Additive Model: R2 =", r2_gam,  "MAE =", mae_gam, "RMSE =", rmse_gam, "\n"
  44. )
复制代码
结果展示:

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),以提高模型的预测性能。
  1. ## caret ----------------------------------------------------------------------
  2. # Set up 10-fold cross-validation
  3. train_control <- trainControl(method = "cv", number = 10)
  4. # glm with 10-fold cross-validation
  5. model_glm_cv <- train(
  6.   y ~ .,
  7.   data = mydata,
  8.   method = "glm",
  9.   trControl = train_control,
  10.   metric = "RMSE"
  11. )
  12. # GAM with 10-fold cross-validation
  13. model_gam_cv <- train(
  14.   y ~ .,
  15.   data = mydata,
  16.   method = "gamSpline",
  17.   trControl = train_control,
  18.   metric = "RMSE"
  19. )
  20. # Random Forest with 10-fold cross-validation
  21. model_rf_cv <- train(
  22.   y ~ .,
  23.   data = mydata,
  24.   method = "rf",
  25.   trControl = train_control,
  26.   metric = "RMSE"
  27. )
  28. # Gradient Boosting with 10-fold cross-validation
  29. model_gbm_cv <- train(
  30.   y ~ .,
  31.   data = mydata,
  32.   method = "xgbTree",
  33.   trControl = train_control,
  34.   metric = "RMSE"
  35. )
  36. # 计算并绘制变量重要性
  37. vip(model_glm_cv)
  38. vip(model_gam_cv)
  39. vip(model_rf_cv)
  40. vip(model_gbm_cv)
  41. # make Variable Importance Plots
  42. p11 <- vip(model_glm_cv) + ggtitle("Generalized linear Model")
  43. p21 <- vip(model_gam_cv) + ggtitle("Random forest")
  44. p31 <- vip(model_rf_cv) + ggtitle("Gradient boosting")
  45. p41 <- vip(model_gbm_cv) + ggtitle("Generalized Additive Model")
  46. grid.arrange(p11, p21, p31, p41, nrow = 2)
  47. # Extract the results
  48. results_glm <- model_glm_cv$results
  49. results_rf <- model_rf_cv$results
  50. results_gbm <- model_gbm_cv$results
  51. results_gam <- model_gam_cv$results
  52. # Print results
  53. cat(
  54.   "Generalized linear Model (GLM):   R2 =", max(results_glm$Rsquared), "MAE =", min(results_tree$MAE), "RMSE =", min(results_tree$RMSE), "\n",
  55.   "Random Forest (RF):              R2 =", max(results_rf$Rsquared), "MAE =", min(results_rf$MAE), "RMSE =", min(results_rf$RMSE), "\n",
  56.   "Gradient Boosting (GBM):         R2 =", max(results_gbm$Rsquared), "MAE =", min(results_gbm$MAE), "RMSE =", min(results_gbm$RMSE), "\n",
  57.   "Generalized Additive Model(GAM): R2 =", max(results_gam$Rsquared), "MAE =", min(results_gam$MAE), "RMSE =", min(results_gam$RMSE), "\n"
  58. )
复制代码
结果展示:

模型模拟精度验证:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

欢乐狗

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表