GBM 模型生成 NA 结果
Posted
技术标签:
【中文标题】GBM 模型生成 NA 结果【英文标题】:GBM model generating NA results 【发布时间】:2014-02-07 11:57:24 【问题描述】:我正在尝试运行一个简单的 GBM 分类模型来对随机森林和 SVM 的性能进行基准测试,但我无法让模型正确评分。它没有抛出错误,但预测都是 NaN。我正在使用来自mlbench
的乳腺癌数据。代码如下:
library(gbm)
library(mlbench)
library(caret)
library(plyr)
library(ada)
library(randomForest)
data(BreastCancer)
bc <- BreastCancer
rm(BreastCancer)
bc$Id <- NULL
bc$Class <- as.factor(mapvalues(bc$Class, c("benign", "malignant"), c("0","1")))
index <- createDataPartition(bc$Class, p = 0.7, list = FALSE)
bc.train <- bc[index, ]
bc.test <- bc[-index, ]
model.gbm <- gbm(Class ~ ., data = bc.train, n.trees = 500)
pred.gbm <- predict(model.gbm, bc.test.ind, n.trees = 500, type = "response")
谁能帮我解决我做错了什么?另外,我是否必须转换预测函数的输出?我读过这似乎是 GBM 预测的问题。谢谢。
【问题讨论】:
这是gbm
包的“功能”。有关说明,请参阅 here。 (基本上,gbm
假设因子响应服从多项分布。如果只有 2 个唯一响应值(无论是字符还是数字),那么它假设是伯努利。
【参考方案1】:
你可以只将标签转换为0和1,但先存储标签进行比较:
library(gbm)
library(mlbench)
library(caret)
data(BreastCancer)
bc <- BreastCancer
bc$Id <- NULL
# store the actual labels
labels = bc$Class
bc$Class <- as.numeric(bc$Class)-1
index <- createDataPartition(bc$Class, p = 0.7, list = FALSE)
bc.train <- bc[index, ]
bc.test <- bc[-index, ]
model.gbm <- gbm(Class ~ ., data = bc.train, n.trees = 500,distribution = "bernoulli")
pred.gbm <- predict(model.gbm, bc.test, n.trees = 500, type = "response")
由于只有两个类,如果 p
predicted_labels = levels(labels)[1+(pred.gbm>0.5)]
我们取出实际的测试标签并制作混淆矩阵以查看它是否正常工作:
test_labels = labels[-index]
table(predicted_labels,test_labels)
test_labels
predicted_labels benign malignant
benign 129 2
malignant 3 75
【讨论】:
【参考方案2】:我之前遇到过将因子变量分配给gbm
的问题。您可以强制 Class
变量为字符类型而不是因子,并且应该这样做。
bc$Class <- as.factor(mapvalues(bc$Class, c("benign", "malignant"), c("0","1")))
bc$Class <- as.character(bc$Class)
您的代码应该可以正常运行,只要确保您在 predict
中调用 bc.test
(而不是 bc.test.ind
)即可。
这是我做出这些更改后得到的预测值的摘要
> summary(pred.gbm)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.222 0.222 0.231 0.346 0.573 0.579
最后一件事,我建议在调用createDataPartition()
之前设置一个种子(例如使用set.seed()
)。否则每次运行代码时都会得到不同的训练和测试集。
【讨论】:
以上是关于GBM 模型生成 NA 结果的主要内容,如果未能解决你的问题,请参考以下文章
GBM模型的“有效偏差”是nan,这是啥意思以及如何摆脱它?
R语言基于h2o包构建二分类模型:使用h2o.gbm构建梯度提升机模型GBM使用h2o.auc计算模型的AUC值
R语言使用gbm包的gbm函数构建梯度提升机模型(Gradient Boosting Machine)指定分布为贝努力分布bernoulli