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

Posted

技术标签:

【中文标题】插入符号上的 R xgboost 尝试执行分类而不是回归【英文标题】:R xgboost on caret attempts to perform classification instead of regression 【发布时间】:2019-01-16 15:42:21 【问题描述】:

每个人。

首先,数据样本在这里:

> 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 并且还检查了数据类型。

错了吗? 它使插入符号将这种训练识别为分类?

> 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 和 caret 执行回归吗?

提前谢谢你,

完整代码在这里:

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)时,结果是一样的...:

> 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

【问题讨论】:

您也可以使用rdocumentation.org/packages/xgboost/versions/0.71.2/topics/… 进行交叉验证,仅供参考。虽然您可能需要自己进行训练/测试拆分或使用插入符号或其他包 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

classProbs = TRUE,     
summaryFunction = twoClassSummary

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

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

UPDATE(在 cmets 之后):似乎目标变量为整数会导致问题;在运行模型之前将其转换为双倍

train$sal <- as.double(train$sal)

【讨论】:

以上是关于插入符号上的 R xgboost 尝试执行分类而不是回归的主要内容,如果未能解决你的问题,请参考以下文章

R 插入符号保留样本和测试集 ROC

xgboost多分类原理

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

Xgboost 处理不平衡的分类数据

summaryFunction 插入符号分类的自定义指标 (hmeasure)

在 R 中使用插入符号调整朴素贝叶斯分类器