R语言gbm包summary函数报错求助:plot.window需有限xlim值
解决gbm包summary函数在R 3.5.0中出现的
need finite 'xlim' values错误 我来帮你解决这个在R 3.5.0版本中使用gbm包summary()函数时遇到的报错问题。
问题复现
你执行的代码如下:
library(ISLR) Caravan$Purchase <- ifelse(Caravan$Purchase == "Yes", 1, 0) train_index <- 1:1000 train <- Caravan[train_index, ] test <- Caravan[-train_index, ] library(gbm) set.seed(1234) boost <- gbm(Purchase ~ ., data = train, n.trees=400, shrinkage =0.01, distribution = "bernoulli") summary(boost)
报错信息及回溯:
Error in plot.window(xlim, ylim, log = log, ...) : need finite 'xlim' values 5. plot.window(xlim, ylim, log = log, ...) 4. barplot.default(rel.inf[i[cBars:1]], horiz = TRUE, col = rainbow(cBars, start = 3/6, end = 4/6), names = object$var.names[i[cBars:1]], xlab = "Relative influence", ...) 3. barplot(rel.inf[i[cBars:1]], horiz = TRUE, col = rainbow(cBars, start = 3/6, end = 4/6), names = object$var.names[i[cBars:1]], xlab = "Relative influence", ...) 2. summary.gbm(boost) 1. summary(boost)
问题原因
这个错误是R 3.5.0版本的特性导致的:R 3.5.0对绘图参数的检查变得更严格,而gbm包旧版本的summary.gbm()函数在计算特征相对重要性时,会出现部分特征的相对重要性值为0的情况,这就导致barplot()无法生成有效的xlim范围,最终触发报错。而R 3.4.4没有这么严格的参数检查,所以不会出现这个问题。
解决方案
这里有几个可行的解决办法,你可以依次尝试:
方法1:明确指定n.trees参数到summary()函数
在调用summary()时,手动传入训练模型时设置的树数量,确保函数用正确的树集合计算特征重要性:
summary(boost, n.trees = 400)
这能避免因默认树数量不匹配导致的特征重要性计算异常,很多时候能直接解决问题。
方法2:手动过滤无效特征后绘图
如果方法1无效,你可以跳过原函数的绘图逻辑,手动提取并过滤掉相对重要性为0的特征,再自行绘制条形图:
# 提取特征重要性但不绘图 imp <- summary(boost, plotit = FALSE) # 过滤掉相对重要性为0的特征 imp_filtered <- imp[imp$rel.inf > 0, ] # 手动绘制条形图 barplot(imp_filtered$rel.inf[order(imp_filtered$rel.inf)], horiz = TRUE, names.arg = imp_filtered$var[order(imp_filtered$rel.inf)], col = rainbow(nrow(imp_filtered), start = 3/6, end = 4/6), xlab = "Relative influence")
方法3:更新gbm包到最新版本
这个问题在gbm包的后续更新中已经被官方修复,直接更新包就能彻底解决:
install.packages("gbm")
更新完成后重新训练模型,再调用summary()应该就能正常运行了。
方法4:降级R版本(备选)
如果上述方法都无法快速解决,你可以暂时降级到R 3.4.4版本,这个版本不会触发这个严格的绘图参数检查。
内容的提问来源于stack exchange,提问作者ktj1989
相关产品推荐
相关产品推荐

