2017-04-09 10 views
2

私はRが新しく、XGBoostを使用してテストセット内のクラス変数を予測したいと考えています。私のトレーニングデータセットは次のようになります。RでXGBoostを使用してクラス変数を予測する

> str(train) 
'data.frame': 5000 obs. of 37 variables: 
$ ID : int 1 2 3 4 5 6 7 8 9 10 ... 
$ A1 : num 0.36 0.33 0.33 0.31 0.33 0.31 0.3 0.3 0.3 0.3 ... 
$ A2 : num 0.45 0.4 0.4 0.4 0.37 0.37 0.4 0.4 0.35 0.37 ... 
$ A3 : num 0.47 0.42 0.4 0.4 0.4 0.38 0.42 0.42 0.38 0.38 ... 
$ A4 : num 0.37 0.31 0.33 0.31 0.31 0.3 0.33 0.34 0.3 0.3 ... 
$ A5 : num 0.33 0.33 0.31 0.33 0.31 0.31 0.3 0.31 0.3 0.3 ... 
$ A6 : num 0.4 0.4 0.4 0.37 0.37 0.4 0.4 0.38 0.37 0.38 ... 
$ A7 : num 0.42 0.4 0.4 0.4 0.38 0.4 0.42 0.42 0.38 0.4 ... 
$ A8 : num 0.31 0.33 0.31 0.31 0.3 0.31 0.34 0.31 0.3 0.28 ... 
$ A9 : num 0.33 0.31 0.33 0.31 0.31 0.3 0.31 0.3 0.3 0.3 ... 
$ A10 : num 0.4 0.4 0.37 0.37 0.4 0.4 0.38 0.37 0.38 0.37 ... 
$ A11 : num 0.4 0.4 0.4 0.38 0.4 0.4 0.42 0.4 0.4 0.35 ... 
$ A12 : num 0.33 0.31 0.31 0.3 0.31 0.31 0.31 0.3 0.28 0.3 ... 
$ A13 : num 0.4 0.36 0.33 0.33 0.33 0.3 0.31 0.31 0.31 0.3 ... 
$ A14 : num 0.49 0.44 0.4 0.39 0.39 0.39 0.42 0.44 0.37 0.36 ... 
$ A15 : num 0.52 0.46 0.41 0.41 0.41 0.41 0.46 0.46 0.41 0.41 ... 
$ A16 : num 0.4 0.33 0.32 0.31 0.32 0.32 0.35 0.35 0.29 0.29 ... 
$ A17 : num 0.36 0.33 0.33 0.33 0.3 0.3 0.31 0.31 0.3 0.3 ... 
$ A18 : num 0.44 0.4 0.39 0.39 0.39 0.39 0.44 0.42 0.36 0.37 ... 
$ A19 : num 0.46 0.41 0.41 0.41 0.41 0.42 0.46 0.44 0.41 0.39 ... 
$ A20 : num 0.33 0.32 0.31 0.32 0.32 0.33 0.35 0.33 0.29 0.31 ... 
$ A21 : num 0.33 0.33 0.33 0.3 0.3 0.3 0.31 0.31 0.3 0.3 ... 
$ A22 : num 0.4 0.39 0.39 0.39 0.39 0.4 0.42 0.37 0.37 0.36 ... 
$ A23 : num 0.41 0.41 0.41 0.41 0.42 0.46 0.44 0.39 0.39 0.39 ... 
$ A24 : num 0.32 0.31 0.32 0.32 0.33 0.35 0.33 0.31 0.31 0.29 ... 
$ A25 : num 0.4 0.35 0.33 0.33 0.33 0.33 0.31 0.31 0.29 0.29 ... 
$ A26 : num 0.49 0.47 0.42 0.39 0.39 0.4 0.42 0.4 0.36 0.36 ... 
$ A27 : num 0.53 0.5 0.44 0.41 0.41 0.41 0.44 0.41 0.38 0.38 ... 
$ A28 : num 0.41 0.39 0.34 0.31 0.31 0.31 0.34 0.33 0.29 0.28 ... 
$ A29 : num 0.35 0.33 0.33 0.33 0.33 0.31 0.31 0.31 0.29 0.31 ... 
$ A30 : num 0.47 0.42 0.39 0.39 0.4 0.42 0.4 0.4 0.36 0.34 ... 
$ A31 : num 0.5 0.44 0.41 0.41 0.41 0.43 0.41 0.41 0.38 0.36 ... 
$ A32 : num 0.39 0.34 0.31 0.31 0.31 0.34 0.33 0.31 0.28 0.28 ... 
$ A33 : num 0.33 0.33 0.33 0.33 0.31 0.31 0.31 0.31 0.31 0.31 ... 
$ A34 : num 0.42 0.39 0.39 0.4 0.42 0.42 0.4 0.37 0.34 0.34 ... 
$ A35 : num 0.44 0.41 0.41 0.41 0.43 0.43 0.41 0.39 0.36 0.36 ... 
$ Class: **Factor** w/ 6 levels "A","B","C","D",..: 3 3 3 3 3 3 3 3 4 4 ... 

私のテストデータセットは、クラス属性が空であることを除いて全く同じように見えます。このコードを使用して、テストデータセットのクラスを予測しています。

train <- read.csv("cse_DS_Intro2TRAIN.csv") 

test <- read.csv("cse_DS_Intro2TEST.csv") 

setDT(train) 

setDT(test) 

labels <- train$Class 

ts_label <- test$Class 

new_tr <- model.matrix(~.+0,data = train[,-c("Class"),with=F]) 

new_ts <- model.matrix(~.+0,data = test[,-c("Class"),with=F]) 

labels <- as.numeric(labels)-1 

ts_label <- as.numeric(ts_label)-1 

dtrain <- xgb.DMatrix(data = new_tr,label = labels) 

dtest <- xgb.DMatrix(data = new_ts,label=ts_label) 

params <- list(
booster = "gbtree", 
objective = "binary:logistic", 
eta=0.3, 
gamma=0, 
max_depth=6, 
min_child_weight=1, 
subsample=1, 
colsample_bytree=1 
) 

xgbcv <- xgb.cv(params = params 
      ,data = dtrain 
      ,nrounds = 100 
      ,nfold = 5 
      ,showsd = T 
      ,stratified = T 
      ,print.every.n = 10 
      ,early.stop.round = 20 
      ,maximize = F 
) 

上記のコードを実行すると、このエラーが発生します。

Error in xgb.iter.update(fd$bst, fd$dtrain, iteration - 1, obj) : 
[16:49:39] amalgamation/../src/objective/regression_obj.cc:108: label must 
be in [0,1] for logistic regression 

RのXGBoostを使用して因子タイプのデータを予測することは可能ですか?

P.S.以前はクラス変数を予測するためにランダムフォレストを使用しており、うまくいきました。

+0

適切なツールを使用して質問の書式を設定してください。 'str()'関数を使ってデータがどのように見えるかを知ることができます(少なくとも私はより直感的です)。 –

+0

あなたの 'Class'変数は文字列か因子ですか?このエラーメッセージは、関数が2進数値形式のターゲット/クラスを期待していることを示しています。 – ulfelder

+0

@ulfelderそれが要因です。トレーニングデータセットのスクリーンショットを追加しました。 – Yash

答えて

3

ターゲットクラスは0から始まる必要があります。このモデルは、列車$ラベルので、作品

library(xgboost) 
data(agaricus.train) 
data(agaricus.test) 
train = agaricus.train 

param = list("objective" = "binary:logistic" ,"eval_metric" = "logloss" , 
     "eta" =1 , "max.depth" = 2) 

次の例を試してみてくださいすると、出力確率は、このモデルでは動作しないでしょう「1」

model <- xgboost(data = train$data, label = train$label, 
      nrounds = 20, objective = "binary:logistic") 

のためになりますので、0から開始します。あなたはちょうど彼らが動作するはずです0から始める数値型に変換し、それは1

model <- xgboost(data = train$data, label = train$label+1, 
      nrounds = 20, objective = "binary:logistic") 

から始まっていたときに、エラーメッセージに注意してください。

アップデート:「:ソフトマックスマルチ」か:あなたはまた、「num_class」パラメータを含める必要があり、「マルチsoftprob」あなたは、ほぼ6クラスを持っているので、また 「目標は」である必要があります。

+0

ありがとう。ソフトマックスを使って私のトリックをしました。あなたが言ったように、私は因子型変数を数値型変数に変換しました。次に私はマルチ:ソフトマックスを使いました。 のparam < - リスト( "客観的" =:、 "マルチソフトマックス" "num_class" = numberOfClasses、 "eval_metric" = "merror"、 "colsample_bytree" = 0.7、 'サブサンプル' = 0.7、 」 η "= .01、" max.depth "= 6)今回は何のエラーもありませんでした。 – Yash

+0

素晴らしい!それが助けてくれてうれしい。 :-) –

関連する問題