基于mlr的随机森林特征重要性计算及结果解读问询
关于mlr包中排列特征重要性的三个问题解答
先结合你的代码背景明确前提:你用的是generateFeatureImportanceData()的permutation.importance方法,基于调优后的随机森林模型,以AUC为评估指标。下面逐一解答你的问题:
1. ft_im$res是否为各特征排列后的AUC下降值?
是的,完全正确。permutation.importance的核心逻辑就是:
- 先计算原模型在任务上的基准AUC值
- 对每个特征单独进行随机排列(破坏该特征与目标变量的关联),再用训练好的模型在打乱特征后的数据集上计算AUC
ft_im$res中存储的就是基准AUC - 排列后AUC的差值,也就是该特征被打乱后AUC的下降幅度。这个数值越大,说明该特征对模型的AUC贡献越大,重要性越高。
2. 绝对值最大的特征是否更重要?
要分情况讨论:
- 大部分情况下,排列特征后模型性能会下降,所以
ft_im$res的数值是正数。这种情况下,数值越大(绝对值也越大),特征的重要性越高,因为它的缺失/打乱对模型性能的负面影响最大。 - 如果出现负数(绝对值大的负数),意味着打乱该特征后,模型的AUC反而上升了。这种情况比较特殊,可能的原因包括:该特征带有噪声,干扰了模型的正常预测;或者该特征与其他特征存在严重冗余,打乱后反而消除了冗余带来的干扰。这种情况下,绝对值大的负数特征不仅不重要,甚至可能是有害的,不能直接按绝对值判断重要性。
3. AUC值为0是否说明该特征与当前分类任务无关?
你这里指的应该是ft_im$res中的差值为0(即基准AUC和排列后AUC几乎无差异)。这种情况说明:该特征的存在与否,对模型的AUC性能没有任何影响。可能的原因有两种:
- 该特征本身与目标变量
DIAG完全没有关联,对分类任务没有预测价值; - 该特征的信息已经被数据集中的其他特征完全覆盖(完全冗余),模型不需要它也能做出同样好的预测。
不管是哪种情况,都可以认为该特征对当前的二分类任务没有贡献,属于可考虑移除的特征。
附你提供的相关代码:
library(easypackages) libraries("mlr","purrr","glmnet","parallelMap","parallel") data = read.table("data_past.txt", h = T) set.seed(123) task = makeClassifTask(id = "past_history", data = data, target = "DIAG", positive = "BD") #specifying hyperparameters for random forest ps_rf = makeParamSet(makeIntegerParam("mtry", lower = 4, upper = 16),makeDiscreteParam("ntree", values = 1000)) ctrl_rf = makeTuneControlRandom(maxit = 10L) inner = makeResampleDesc("RepCV", fold = 10, reps = 3, stratify = TRUE) lrn_rf = makeLearner("classif.randomForest", predict.type = "prob", fix.factors.prediction = TRUE) lrn_rf = makeTuneWrapper(lrn_rf, resampling = inner, par.set = ps_rf, control = ctrl_rf, measures = auc, show.info = FALSE) parallelStartMulticore(36) ft_im = generateFeatureImportanceData(task = task, method = "permutation.importance", learner = lrn_rf, measure = auc) parallelStop() t(ft_im$res)
内容的提问来源于stack exchange,提问作者FcmC
相关产品推荐
相关产品推荐

