使用“xgboost”官方软件包与来自R的“caret”软件包中的xgboost的结果不同

时间:2016-07-18 09:42:35

标签: r machine-learning r-caret xgboost

我是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%...... 我在它们两个上设置了相同的种子。

第二次我错了吗?请告诉我为什么会这样!

1 个答案:

答案 0 :(得分:2)

代码中有两个不同的东西,第一个是最严重的:

  • 当您致电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