“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 <- as.numeric(dtrain[[11]])
和data <- as.matrix(sapply(dtrain, as.numeric))
时,数据中的第11列实际上是标签。当然你会得到一个很高的准确率,标签本身就在数据中!那是严重的泄漏,你应该改用data <- 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函数控制训练过程