插入符号上的 R xgboost 尝试执行分类而不是回归

R xgboost on caret attempts to perform classification instead of regression

大家。

首先,数据样本在这里:

> str(train)
'data.frame':   30226 obs. of  71 variables:
 $ sal              : int  2732 2732 2732 2328 2560 3584 5632 5632 3584 2150 ...
 $ avg              : num  2392 2474 2392 2561 2763 ...
 $ med              : num  2314 2346 2314 2535 2754 ...
 $ jt_category_1    : int  1 1 1 1 1 1 1 1 1 1 ...
 $ jt_category_2    : int  0 0 0 0 0 0 0 0 0 0 ...
 $ job_num_1        : int  0 0 0 0 0 0 0 0 0 0 ...
 $ job_num_2        : int  0 0 0 0 0 0 0 0 0 0 ...

and more 64 variables(type of all is int, 0 or 1 binary values) 

第"sal"列是标签,是测试数据(原始数据的70%)

我在 R 中使用包 "caret" 进行回归,选择方法 "xgbTree"。 我知道它适用于分类和回归。

问题是,我想回归...但我不知道该怎么做

我执行完整代码,错误是

Error: Metric RMSE not applicable for classification models

但我不是要进行分类。我想做回归。

我的标签类型(训练函数的 y)是 int 并且还检查了数据类型。

错了吗? 它使 caret 将此训练识别为分类?

> str(train$sal)
 int [1:30226] 2732 2732 2732 2328 2560 3584 5632 5632 3584 2150 ...

> str(train_xg)
Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
  ..@ i       : int [1:181356] 0 1 2 3 4 5 6 7 8 9 ...
  ..@ p       : int [1:71] 0 30226 60452 90504 90678 90709 90962 93875 95087 96190 ...
  ..@ Dim     : int [1:2] 30226 70
  ..@ Dimnames:List of 2
  .. ..$ : NULL
  .. ..$ : chr [1:70] "avg" "med" "jt_category_1" "jt_category_2" ...
  ..@ x       : num [1:181356] 2392 2474 2392 2561 2763 ...
  ..@ factors : list()

为什么会认错?

你知道如何使用 xgboost 和插入符执行回归吗?

提前谢谢你,

完整代码在这里:

library(caret)
library(xgboost)

xgb_grid_1 = expand.grid(
  nrounds = 1000,
  max_depth = c(2, 4, 6, 8, 10),
  eta=c(0.5, 0.1, 0.07),
  gamma = 0.01,
  colsample_bytree=0.5,
  min_child_weight=1,
  subsample=0.5
)

xgb_trcontrol_1 = trainControl(
  method = "cv",
  number = 5,
  verboseIter = TRUE,
  returnData = FALSE,
  returnResamp = "all",                                                        # save losses across all models
  classProbs = TRUE,                                                           # set to TRUE for AUC to be computed
  summaryFunction = twoClassSummary,
  allowParallel = TRUE
)

    xgb_train_1 = train(
  x = as.matrix(train[ , 2:71]),
  y = as.matrix(train$sal),
  trControl = xgb_trcontrol_1,
  tuneGrid = xgb_grid_1,
  method = "xgbTree"
)

更新(18.08.10)

当我删除 trainControl 函数的两个参数 (classProbs = TRUE, summaryFunction = twoClassSummary) 时,结果是一样的...:[=​​18=]

> xgb_grid_1 = expand.grid(
+   nrounds = 1000,
+   max_depth = c(2, 4, 6, 8, 10),
+   eta=c(0.5, 0.1, 0.07),
+   gamma = 0.01,
+   colsample_bytree=0.5,
+   min_child_weight=1,
+   subsample=0.5
+ )
> 
> xgb_trcontrol_1 = trainControl(
+   method = "cv",
+   number = 5,
+   allowParallel = TRUE
+ )
> 
> xgb_train_1 = train(
+   x = as.matrix(train[ , 2:71]),
+   y = as.matrix(train$sal),
+   trControl = xgb_trcontrol_1,
+   tuneGrid = xgb_grid_1,
+   method = "xgbTree"
+ )
Error: Metric RMSE not applicable for classification models

caret 认为您要求分类并不奇怪,因为您实际上在 trainControl 函数的这两行中这样做:

classProbs = TRUE,     
summaryFunction = twoClassSummary

删除这两行(以便它们采用默认值 - 请参阅 function documentation),你应该没问题。

另请注意,AUC 仅适用于分类问题。

UPDATE(评论后):似乎目标变量是整数会导致问题;在 运行 具有

的模型之前将其转换为 double
train$sal <- as.double(train$sal)

您需要使用 --> metric = 'RMSE' 进行回归,否则 metric = "Accuracy" 进行分类。