2016-07-18 48 views
2

私はRプログラミング言語が初めてで、いくつかの実験では "xgboost"を実行する必要があります。問題は、私はモデルのクロス検証し、精度を取得する必要があることだと私は私に異なった結果得られる二つの方法が見つかりました:使用して"xgboost"公式パッケージとxgboostの違いが "R"の "caret"パッケージと異なる結果R

「キャレット」での:

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)) 

しかし、結果は同じデータセットで大きく異なります。私は通常、コードの第2の切り取りと最初のものと63%の学生のパフォーマンスデータセットで99%の精度を得ます...
私はそれらの両方に同じシードを設定しました。

私は2番目に間違っていますか?もしそうなら、教えてください!

+0

[再現性の例](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)がなければ、正確な理由を把握するのは難しいだろう'キャレット'は単に 'xgboost'のラッパーであるため、あなたが明示的に提供しているものか、デフォルトが何であるかによって、2つの設定が異なる設定になる可能性があります(つまり、自身の 'xgboost'バージョン、それは同じ' xgboost'パッケージを呼び出します) – Tchotchke

+0

ここで使用されるデータセットはhttps://archive.ics.uci.edu/ml/machine-learning-databases/00320/です。この例を再現するために何が必要かを教えてください。私はできるだけ基本的なパラメータとして試しましたが、まだ〜25-30%の差です –

答えて

2

2つのことは、コードのうち異なっている最初のものは最も重大である:

  • あなたはlabel <- as.numeric(dtrain[[11]])data <- as.matrix(sapply(dtrain, as.numeric))を呼び出すと、データ内の11番目の列には、実際にラベルです。もちろん、あなたは高い精度を得るでしょう、ラベル自体がデータにあります!それは重大な漏れだし、あなたの代わりにマイナーな違いは、マルチクラス分類のための第二のコードでobjective = "multi:softmax"caret道具objective = "multi:softprob"を使用していることであるdata <- as.matrix(sapply(dtrain[,-11L], as.numeric))

  • を使用する必要があります。どのくらい違うのか分からないけど、それはコード間で違います。 Check it

+0

私はコード内でdtrain [33]を修正しました。私は他のデータセットでも作業するので、コピー&ペーストエラーでした。 softmaxの代わりにsoftprobが私に大きな違いがあると思われ、上記のコードはもう動作しません...しかしsoftprobの代わりにsoftmaxを使用するのは悪いですか? –

+0

@StefanPaulPopescuクロス検証を正しく実行すると、問題はありません。 –

+0

しかし、クロスバリデーションのための私の呼び出しが正しいですか?つまり、コードからの呼び出し:croosvalid < - xgb.cv(...)? –

関連する問題