插入符号上的 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 尝试执行分类而不是回归的主要内容,如果未能解决你的问题,请参考以下文章
“xgboost”官方包与 R 中“caret”包中的 xgboost 的不同结果