2016-07-18 107 views
2

我是R編程語言的新手,我需要爲某些實驗運行「xgboost」。問題是,我需要交叉驗證模型,並得到準確,我發現兩種方法給我不同的結果:「xgboost」官方軟件包與x中的「caret」軟件包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

沒有[reproducible example](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)它將很難找出究竟爲什麼,但它可能歸結於你在兩者之間有不同的設置,無論是通過你明確提供的還是默認設置,因爲'caret'只是'xgboost'的一個包裝器(即它沒有實現它的自己的'xgboost'版本,它只是調用相同的'xgboost'包) – Tchotchke

+0

這裏是使用https://archive.ics.uci.edu/ml/machine-learning-databases/00320/的數據集。讓我知道你需要什麼來重現這個例子。我儘可能使用基本參數,但仍有25-30%的差異 –

回答

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

+0

我在代碼中修改了dtrain [[33]]。這是一個複製和粘貼錯誤,因爲我也與其他數據集一起工作。 softprob而不是softmax似乎對我來說是一個很大的區別,上面提到的代碼不再工作了......但是使用softmax代替softprob會不好嗎? –

+0

@StefanPaulPopescu如果您正確執行交叉驗證,我看不到任何問題。 –

+0

但是我要求交叉驗證的請求是否正確?我的意思是,來自代碼的調用:croosvalid < - xgb.cv(...)? –

相關問題