GBM模型生成NA结果

时间:2014-01-17 23:41:15

标签: r gbm

我正在尝试运行一个简单的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预测的一个问题。感谢。

2 个答案:

答案 0 :(得分:2)

我之前遇到过将因子变量赋给gbm的问题。您可以强制Class变量为字符类型而不是因子,应该这样做。

bc$Class <- as.factor(mapvalues(bc$Class, c("benign", "malignant"), c("0","1")))
bc$Class <- as.character(bc$Class)

您的代码应该可以正常运行,只需确保在bc.test中致电bc.test.ind(而不是predict)。

这里是我做出这些改变后得到的预测值的摘要

> summary(pred.gbm)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  0.222   0.222   0.231   0.346   0.573   0.579 

最后一件事,我建议在调用set.seed()之前设置种子(例如使用createDataPartition())。否则,每次运行代码时,您都会获得不同的培训和测试集。

答案 1 :(得分:0)

您可以将标签分别转换为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 <= 0.5,则可以通过调用标签的第一级来获取标签,反之亦然:

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