在没有目标列的情况下,对新数据进行预测时,XGBoost会出错

人工智能 2026-07-11

在许多数据科学竞赛中,要求对新数据进行预测,但新数据集中未给出目标变量。目标变量在训练数据集中给出,但在测试集中则没有。

例如: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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章