使用pdp包生成多分类概率尺度部分依赖图遇参数问题求助
解决
partial()函数中pred.fun多参数限制的方法 我明白你想要结合多分类全类别绘图和概率尺度预测的需求——你想用e1071的SVM模型输出类别概率,再用partial()生成每个类别的部分依赖图,但问题出在pred.fun只能接受两个参数(模型对象和新数据),没办法传入你需要的i(类别索引)对吧?
这里有几个可行的解决方案:
方案1:使用闭包(Closure)传递额外参数
闭包可以让你在定义pred.fun时捕获外部的类别索引i,这样pred.fun就只需要两个参数,完全符合partial()的要求。修改你的代码如下:
library(e1071) library(pdp) # 假设你使用的是pdp包的partial函数 iris.svm <- svm(Species ~ ., data = iris, kernel = "radial", gamma = 0.75, cost = 0.25, probability = TRUE) # 定义一个生成pred.fun的函数,传入目标类别索引i make_pred_prob <- function(i) { function(object, newdata) { pred <- predict(object, newdata, probability = TRUE) prob.class <- attr(pred, which = "probabilities")[, i] mean(prob.class) } } # 测试闭包函数是否正常工作 test_fun <- make_pred_prob(1) test_fun(iris.svm, iris) pd <- NULL for (i in 1:3) { # 为当前类别创建对应的pred.fun current_pred_fun <- make_pred_prob(i) tmp <- partial(iris.svm, pred.var = c("Petal.Width", "Petal.Length"), pred.fun = current_pred_fun, grid.resolution = 101, progress = "text") pd <- rbind(pd, cbind(tmp, Species = levels(iris$Species)[i])) }
这个方法的核心是用make_pred_prob函数生成绑定了特定i值的闭包,让partial()调用的pred.fun严格符合“仅两个参数”的接口要求,同时保留了你需要的类别概率计算逻辑。
方案2:使用匿名函数临时绑定参数
如果你不想单独定义生成函数,也可以在循环里直接用匿名函数捕获当前的i值:
pd <- NULL for (i in 1:3) { tmp <- partial(iris.svm, pred.var = c("Petal.Width", "Petal.Length"), pred.fun = function(object, newdata) { pred <- predict(object, newdata, probability = TRUE) prob.class <- attr(pred, which = "probabilities")[, i] mean(prob.class) }, grid.resolution = 101, progress = "text") pd <- rbind(pd, cbind(tmp, Species = levels(iris$Species)[i])) }
这种方式更简洁,匿名函数会直接捕获循环中的i值,在R的循环环境中可以稳定运行。
方案3:利用pdp包的多分类特性简化代码
其实pdp包本身支持多分类模型的部分依赖图生成,虽然svm的概率输出需要通过attr提取,但结合闭包的思路,你也可以用lapply替代循环,让代码更简洁:
pd_list <- lapply(1:3, function(i) { pred_fun <- make_pred_prob(i) tmp <- partial(iris.svm, pred.var = c("Petal.Width", "Petal.Length"), pred.fun = pred_fun, grid.resolution = 101, progress = "text") cbind(tmp, Species = levels(iris$Species)[i]) }) pd <- do.call(rbind, pd_list)
总结一下,闭包是解决这类“函数接口有限制但需要传递额外参数”问题的标准R技巧,既保证了代码的可读性,又完美适配partial()的要求。
内容的提问来源于stack exchange,提问作者see24
相关产品推荐
相关产品推荐

