我是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%...... 我在它们两个上设置了相同的种子。
第二次我错了吗?请告诉我为什么会这样!
答案 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