首页 > 解决方案 > XGBoost 交叉验证错误: slice.xgb.DMatrix 中的错误

问题描述

我正在尝试针对 R 中的多类分类问题(通过 R Studio)运行 xgb.cv 算法,但我不断收到以下错误消息:

• slice.xgb.DMatrix(dall, unlist(folds[-k])) 中的错误:std::bad_alloc

我的数据集包括一个 4 类响应变量和 12 个解释变量。我已经完成了将响应变量转换为数字数据类型的过程,将我的数据拆分为训练组和测试组 (80/20),使用 1-hot 编码创建了一个稀疏矩阵,然后使用以下代码:

TrainM <- sparse.model.matrix(Response_var ~ .-1, data = Train_data)
Train_Label <- Train_data[,1] 
Train_Matrix <- xgb.DMatrix(data = as.matrix(TrainM), label = Train_Label)

TestM <- sparse.model.matrix(Response_var ~ .-1, data = Test_data)
Test_Label <- Test_data[,1] 
Test_Matrix <- xgb.DMatrix(data = as.matrix(TestM), label = Test_Label)

然后我将模型参数设置如下:

nc <- length(unique(Train_Label)) 
xgb_params <- list(objective = "multi:softprob", 
                   eta = 0.01,
                   gamma = 2,
                   eval_metric = 'AUC',
                   max_depth = 15,
                   subsample = 0.5,
                   colsample_bytree = 0.5,
                   num_class = nc,
                   min_child_weight = 2)

然后将交叉验证模型运行为:

CV_Model <- xgb.cv(params = xgb_params,
                   data = Train_Matrix,
                   nrounds = 1000,
                   nfold = 10,
                   stratified = TRUE,
                   print_every_n = 1,
                   early_stopping_rounds = 15,
                   maximize = FALSE,
                   prediction = TRUE) 

在我启动 CV 模型之前,一切都运行良好,该模型很快就会出错(就像模型正在初始化一样)。

slice.xgb.DMatrix(dall, unlist(folds[-k])) 中的错误:std::bad_alloc

我在使用 R v4.1.1 和 RStudio V1.4.1106 的 Windows 10 工作站上运行它。我应该注意,我已经运行“相同”代码几个星期了,没有任何问题,唯一的区别是评估指标 = 'mlogloss' 而不是 'AUC'。但是,一旦我切换到“AUC”,问题就开始出现了。

任何解决此问题的帮助将不胜感激!

标签: rxgboost

解决方案


嗨,Doug Turk,欢迎来到该网站。此错误很可能与内存不足有关。

例如,请参见此处: https ://en.cppreference.com/w/cpp/memory/new/bad_alloc

在 Windows 中,您可以通过在运行代码时打开任务管理器来验证这一点,您应该会看到内存上升到 100%。尝试使用您的数据子集重新运行代码,以减少内存需求,看看是否能解决您的问题

祝你好运。


推荐阅读