R语言神经网络敏感性分析:识别对输出影响最大的特征变量
针对nnet二分类模型的特征敏感性/重要性分析可行方案
你之前使用lek.fun未得到有效结果大概率是参数调用不全导致的,该函数需要传入训练集的预测变量作为参考基准,可先尝试修正调用方式:
library(NeuralNetTools) # 提取训练集的预测变量列(剔除标签列is_cancelled) train_x <- train[, !names(train) %in% "is_cancelled"] # 补充xdata参数后重新调用 all_variables <- lek.fun(nn1, xdata = train_x) # 查看输出结果 head(all_variables, val.out = TRUE)
如果仍不符合需求,可选用以下3种成熟的实现方案:
1. 置换重要性(通用易解释,适配所有模型类型)
原理为随机打乱单个特征的取值,观测模型预测性能的下降幅度,幅度越大代表该特征对输出的影响程度越高,二分类场景可选用AUC或准确率作为性能评估指标。
代码示例:
library(caret) library(pROC) # 定义AUC计算函数 auc_fun <- function(model, test_x, test_y) { pred <- predict(model, newdata = test_x, type = "raw") as.numeric(roc(test_y, pred)$auc) } # 拆分测试集的特征与标签 test_x <- test[, !names(test) %in% "is_cancelled"] test_y <- test$is_cancelled # 计算原始模型的基准AUC base_auc <- auc_fun(nn1, test_x, test_y) # 遍历所有特征计算置换后的AUC下降值 imp_score <- sapply(names(test_x), function(f) { # 打乱当前特征的取值顺序 test_x_perm <- test_x test_x_perm[[f]] <- sample(test_x_perm[[f]]) # 计算置换后的模型AUC perm_auc <- auc_fun(nn1, test_x_perm, test_y) # 得分=基准AUC-置换后AUC,值越大特征越重要 return(base_auc - perm_auc) }) # 按重要性从高到低排序输出 sort(imp_score, decreasing = TRUE)
2. OLDEN神经网络专用重要性算法
属于NeuralNetTools包内置的专用算法,直接基于神经网络的连接权重计算特征重要性,不需要额外测试集,结果稳定性更高,还可以输出特征对结果的影响方向。
代码示例:
library(NeuralNetTools) # 关闭绘图直接返回数值结果 olden_res <- olden(nn1, bar_plot = FALSE) # 按重要性绝对值从高到低排序输出,正负值代表影响方向 print(olden_res[order(-abs(olden_res$importance)), ]) # 如需可视化可直接调用绘图函数 olden(nn1)
3. SHAP值(支持全局重要性排序+单样本影响解释)
SHAP是目前通用的模型可解释性工具,支持nnet模型,既可以输出全局的特征重要性排序,也可以查看单个特征对不同样本输出结果的具体影响程度。
代码示例:
library(fastshap) # 定义预测函数,返回二分类概率输出 pred_fun <- function(model, newdata) { predict(model, newdata = newdata, type = "raw") } # 计算所有特征的SHAP值 shap_res <- fastshap::explain(nn1, X = train_x, pred_wrapper = pred_fun, nsim = 10) # 全局重要性:按SHAP值的平均绝对值排序 global_imp <- sort(apply(abs(shap_res), 2, mean), decreasing = TRUE) print(global_imp)
内容的提问来源于stack exchange,提问作者Quantizer
相关产品推荐
相关产品推荐

