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

Posted

技术标签:

【中文标题】“xgboost”官方包与 R 中“caret”包中的 xgboost 的不同结果【英文标题】:Different results with “xgboost” official package vs. xgboost from "caret" package in R 【发布时间】:2016-11-20 20:47:30 【问题描述】:

我是 R 编程语言的新手,我需要运行“xgboost”进行一些实验。问题是我需要交叉验证模型并获得准确性,我发现两种方法可以得到不同的结果:

使用“插入符号”:

library(mlbench)
library(caret)
library(caretEnsemble)
dtrain <- read.csv("student-mat.csv", header=TRUE, sep=";")
formula <- G3~.
dtrain$G3<-as.factor(dtrain$G3)
control <- trainControl(method="cv", number=10)
seed <- 10
metric <- "Accuracy"    
fit.xgb <- train(formula, data=dtrain, method="xgbTree", metric=metric, trControl=control, nthread =4)
fit.xgb
fit.xgbl <- train(formula, data=dtrain, method="xgbLinear", metric=metric, trControl=control, nthread =4)
fit.xgbl

使用“xgboost”包和以下代码:

 library(xgboost)
 printArray <- function(label, array)
 cat(paste(label, paste(array, collapse = ", "), sep = ": \n"), "\n\n")
 setwd("D:\\datasets")
 dtrain <- read.csv("moodle7original(AtributosyNotaNumericos).csv",        header=TRUE, sep=",")
 label <- as.numeric(dtrain[[33]])
 data <- as.matrix(sapply(dtrain, as.numeric))

croosvalid <-
xgb.cv(
data = data,
nfold = 10,
nround = 10,
label = label,
prediction = TRUE,
objective = "multi:softmax",
num_class = 33
)

print(croosvalid)  
printArray("Actual classes", label[label != croosvalid\$pred])  
printArray("Predicted classes", croosvalid\$pred[label != croosvalid\$pred])  
correctlyClassified <- length(label[label == croosvalid\$pred])  
incorrectlyClassified <- length(label[label != croosvalid\$pred])  
accurancy <- correctlyClassified * 100 / (correctlyClassified + incorrectlyClassified)  
print(paste("Accurancy: ", accurancy))  

但是在同一个数据集上结果差异很大。我通常使用第二个代码片段在学生表现数据集上获得 99% 的准确率,而在第一个代码片段上获得约 63% 的准确率... 我给他们两个都设置了相同的种子。

第二个我错了吗?如果是,请告诉我为什么!

【问题讨论】:

如果没有reproducible example,将很难确切地找出原因,但这可能归结为您在两者之间的设置不同,无论是通过您明确提供的内容还是默认设置, 因为caret 只是xgboost 的包装器(即,它没有实现自己的xgboost 版本,它只是调用相同的xgboost 包) 这里是使用的数据集 archive.ics.uci.edu/ml/machine-learning-databases/00320 。让我知道您需要什么来重现该示例。我尝试了尽可能基本的参数,但仍然有 ~25-30% 的差异 【参考方案1】:

代码之间有两点不同,第一点是最严重的:

当你调用label &lt;- as.numeric(dtrain[[11]])data &lt;- as.matrix(sapply(dtrain, as.numeric))时,数据中的第11列实际上是标签。当然你会得到一个很高的准确率,标签本身就在数据中!那是严重的泄漏,你应该改用data &lt;- as.matrix(sapply(dtrain[,-11L], as.numeric))

一个小的区别是您在第二个代码中使用objective = "multi:softmax"caret 实现objective = "multi:softprob" 用于多类分类。我不知道这可能会有多大的不同,但是代码之间是不同的。 Check it.

【讨论】:

我在代码中修改了dtrain[[33]]。这是一个复制和粘贴错误,因为我还使用其他数据集。 softprob 而不是 softmax 对我来说似乎有很大的不同,上面提到的代码不再起作用了......但是使用 softmax 而不是 softprob 是不是很糟糕? @StefanPaulPopescu 如果您正确执行交叉验证,我看不出有任何问题。 但是我对交叉验证的呼吁是否正确?我的意思是,来自代码的调用:croosvalid

以上是关于“xgboost”官方包与 R 中“caret”包中的 xgboost 的不同结果的主要内容,如果未能解决你的问题,请参考以下文章

R语言caret包构建xgboost模型实战:特征工程(连续数据离散化因子化无用特征删除)配置模型参数(随机超参数寻优10折交叉验证)并训练模型

R语言使用caret包构建xgboost模型(xgbDART算法使用的dropout思想)构建回归模型通过method参数指定算法名称通过trainControl函数控制训练过程

R语言利用caret包比较ROC曲线

使用 xgboost 和 caret 进行并行处理

在 R 中绘制由 caret 包训练的 SVM 线性模型

如何绘制从使用 R 中的“caret”包创建的随机森林中选择的树