无法运行插入符号 xgboost 分类

Posted

技术标签:

【中文标题】无法运行插入符号 xgboost 分类【英文标题】:Unable to run caret xgboost classification 【发布时间】:2019-11-24 08:35:19 【问题描述】:

我尝试使用 xgboost 对虹膜数据进行分类,但遇到了这个错误。

"frankv(predicted) 中的错误:x 是一个列表,'cols' 不能是 0 长度 另外:警告信息: 在 train.default(x_train, y_train, trControl = ctrl, tuneGrid = xgbgrid, : 无法计算回归的类别概率”

我正在使用以下代码。任何帮助或解释将不胜感激。

data(iris)
library(caret)
library(dplyr)
library(xgboost)

set.seed(123)
index <- createDataPartition(iris$Species, p=0.8, list = FALSE)
trainData <- iris[index,]
testData <- iris[-index,]


x_train = xgb.DMatrix(as.matrix(trainData %>% select(-Species)))
y_train = as.numeric(trainData$Species)



#### Generic control parametrs
ctrl <- trainControl(method="repeatedcv", 
                    number=10, 
                    repeats=5,
                    savePredictions=TRUE, 
                    classProbs=TRUE,
                    summaryFunction = twoClassSummary)

xgbgrid <- expand.grid(nrounds = 10,
                    max_depth = 5,
                    eta = 0.05,
                    gamma = 0.01,
                    colsample_bytree = 0.75,
                    min_child_weight = 0,
                    subsample = 0.5,
                    objective = "binary:logitraw",
                    eval_metric = "error")


set.seed(123)
xgb_model = train(x_train, 
                y_train,  
                trControl = ctrl,
                tuneGrid = xgbgrid,
                method = "xgbTree")

【问题讨论】:

看看this。 看看这一行:y_train = as.numeric(trainData$Species)。同样使用 twoClassSummary 函数也不合适,因为 Species 具有三个级别。修复这两个,你就可以开始了。请改用multiClassSummary。此注释中的函数可能大小写不正确(小写/大写)。 感谢您在类摘要中识别错误,但是,我尝试通过 y_train 只使用as.factor 而不是as.factor(as.numeric()) 尽管物种已经是鸢尾花数据集中的一个因素,不需要这样做。我运行它没有问题,没有使用你的调子网格,也停止了训练,因为这需要很多时间,但无论如何它都会起作用。 是的,现在它运行了,但是没有结果出来(使用网格和不使用网格都试过)-----出了点问题;缺少所有准确度指标值:logLoss AUC prAUC Accuracy Kappa Mean_F1 Mean_Sensitivity Mean_Specificity Min。 : NA 分钟。 :0.5 分钟。 : NA 分钟。 : NA 分钟。 : NA 分钟。 : NA Min.... 全部 NA 【参考方案1】:

有几个问题:

    结果变量应该是一个因素。

    调谐网格具有插入符号调谐网格未使用的参数。

    由于存在三个级别,因此使用两个级别的摘要是不合适的。多类摘要与summaryFunction = multiClassSummary 一起使用。

一个工作示例:

data(iris)
library(caret)
library(dplyr)
library(xgboost)
    set.seed(123)
index <- createDataPartition(iris$Species, p=0.8, list = FALSE)
trainData <- iris[index,]
testData <- iris[-index,]


x_train = xgb.DMatrix(as.matrix(trainData %>% select(-Species)))
y_train = as.factor(trainData$Species)



#### Generic control parametrs
ctrl <- trainControl(method="repeatedcv", 
                     number=10, 
                     repeats=5,
                     savePredictions=TRUE, 
                     classProbs=TRUE,
                     summaryFunction = multiClassSummary)

xgbgrid <- expand.grid(nrounds = 10,
                       max_depth = 5,
                       eta = 0.05,
                       gamma = 0.01,
                       colsample_bytree = 0.75,
                       min_child_weight = 0,
                       subsample = 0.5)


set.seed(123)
x_train 
xgb_model = train(x_train, 
                  y_train,  
                  trControl = ctrl,
                    method = "xgbTree",
                  tuneGrid = xgbgrid)
xgb_model

【讨论】:

以上是关于无法运行插入符号 xgboost 分类的主要内容,如果未能解决你的问题,请参考以下文章

Python XGBoost 分类器无法“预测”:“TypeError: Not supported type for data”

无法在 conda-forge 上安装 xgboost

使用 xgboost 和 caret 进行并行处理

带有插入符号错误的 SVM 分类(基本)

“xgboost”官方包与 R 中“caret”包中的 xgboost 的不同结果

插入符号分类阈值