在没有目标列的情况下,对新数据进行预测时,XGBoost会出错
在许多数据科学竞赛中,要求对新数据进行预测,但新数据集中未给出目标变量。目标变量在训练数据集中给出,但在测试集中则没有。
例如:https://www.kaggle.com/competitions/playground-series-s6e3/overview
我无法在任何数据集上用XGBoost实现这一点。
简单示例:
# Set up train and test sets
train <- MASS::Pima.tr
train$type <- ifelse(train$type == "No", 0, 1)
test <- MASS::Pima.te
test$type <- ifelse(test$type == "No", 0, 1)
train_x = data.matrix(train[, 1 : ncol(train)])
train_y = train[,ncol(train) : ncol(train)]
#define predictor and response variables in test set
test_x = data.matrix(test[, 1 : ncol(test) -1])
xgb_train = xgb.DMatrix(data = train_x, label = as.matrix(train_y))
#define watchlist
watchlist = list(train = xgb_train, validation=xgb_validation)
# definte xgb model
xgb_model <- xgb.train(data = xgb_train, params = xgb.params(max_depth = 3), nrounds = 70)
# set up new data without the target column
newdata <- MASS::Pima.tr2[1:10, 1:7]
现在使用训练好的模型在没有目标列的新数据上进行预测:
xgb_train_pred <- stats::predict(object = xgb_model, newdata = newdata, type = "prob")
Error in predict.xgb.Booster(object = xgb_model, newdata = newdata, type = "prob") :
[12:32:13] src/predictor/utils.h:20: Check failed: n_features_data == n_features_model (7 vs. 8) : Number of columns in data must equal to the trained model.
XGBoost返回一个错误,提示新数据的列数必须与训练集和测试集中的列数相同。当新数据不包含目标列时,是否有办法使用训练好的XGBoost模型对新数据进行预测?我看到很多其他方法可以在不包含目标列的新数据上进行预测,但似乎无法用XGBoost实现。
解决方案
看起来是在训练集/测试集/新数据中定义预测变量和响应变量时出现问题;这个示例在你的系统上是否按预期工作?
library(xgboost)
# Set up train and test sets
train <- MASS::Pima.tr
train$type <- ifelse(train$type == "No", 0, 1)
test <- MASS::Pima.te
test$type <- ifelse(test$type == "No", 0, 1)
str(train)
#> 'data.frame': 200 obs. of 8 variables:
#> $ npreg: int 5 7 5 0 0 5 3 1 3 2 ...
#> $ glu : int 86 195 77 165 107 97 83 193 142 128 ...
#> $ bp : int 68 70 82 76 60 76 58 50 80 78 ...
#> $ skin : int 28 33 41 43 25 27 31 16 15 37 ...
#> $ bmi : num 30.2 25.1 35.8 47.9 26.4 35.6 34.3 25.9 32.4 43.3 ...
#> $ ped : num 0.364 0.163 0.156 0.259 0.133 ...
#> $ age : int 24 55 35 26 23 52 25 24 63 31 ...
#> $ type : num 0 1 0 0 0 1 0 0 0 1 ...
str(test)
#> 'data.frame': 332 obs. of 8 variables:
#> $ npreg: int 6 1 1 3 2 5 0 1 3 9 ...
#> $ glu : int 148 85 89 78 197 166 118 103 126 119 ...
#> $ bp : int 72 66 66 50 70 72 84 30 88 80 ...
#> $ skin : int 35 29 23 32 45 19 47 38 41 35 ...
#> $ bmi : num 33.6 26.6 28.1 31 30.5 25.8 45.8 43.3 39.3 29 ...
#> $ ped : num 0.627 0.351 0.167 0.248 0.158 0.587 0.551 0.183 0.704 0.263 ...
#> $ age : int 50 31 21 26 53 51 31 33 27 29 ...
#> $ type : num 1 0 0 1 1 1 1 0 0 1 ...
train_x = data.matrix(train[, 1 : ncol(train) - 1])
train_y = train[,ncol(train)]
test_x = data.matrix(test[, 1 : ncol(test) -1])
xgb_train = xgb.DMatrix(data = train_x, label = as.matrix(train_y))
xgb_model <- xgb.train(data = xgb_train, params = xgb.params(max_depth = 3, ), nrounds = 70)
newdata <- MASS::Pima.tr2[1:10, 1:7]
xgb_train_pred <- stats::predict(object = xgb_model, newdata = newdata, type = "prob")
newdata$predictions <- xgb_train_pred
newdata$predicted_type <- ifelse(xgb_train_pred > 0.5, 1, 0)
newdata$actual_type <- ifelse(MASS::Pima.tr2[1:10, 8] == "No", 0, 1)
newdata
#> npreg glu bp skin bmi ped age predictions predicted_type actual_type
#> 1 5 86 68 28 30.2 0.364 24 0.026993284 0 0
#> 2 7 195 70 33 25.1 0.163 55 0.923599541 1 1
#> 3 5 77 82 41 35.8 0.156 35 -0.043762676 0 0
#> 4 0 165 76 43 47.9 0.259 26 0.012716775 0 0
#> 5 0 107 60 25 26.4 0.133 23 0.021328017 0 0
#> 6 5 97 76 27 35.6 0.378 52 0.795750141 1 1
#> 7 3 83 58 31 34.3 0.336 25 0.055253368 0 0
#> 8 1 193 50 16 25.9 0.655 24 0.007477899 0 0
#> 9 3 142 80 15 32.4 0.200 63 0.036213551 0 0
#> 10 2 128 78 37 43.3 1.224 31 1.005829334 1 1
创建于2026-03-17,使用 reprex v2.1.1.9000
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。