2016-05-05 13 views
1

私は25000行と761列のデータセットを持っています。これにはバイナリ応答カラムが1つあります。私のバイナリレスポンスは値が '-1'と '1'でした。私は、私はまだ同じエラーを取得しておく、次のコマンド -XGBoost in R

levels(output)[levels(output)=="-1"] <- "0" 

を使用して、私の応答のレベルを変更し、それにxgboost実行しようとしている、と

xg_base<-xgboost(data = features,label = output,objective="binary:logistic",eta=1,nthreads=2,nrounds = 10 
      , verbose = T, print.every.n = 5) 


Error in xgb.iter.update(bst$handle, dtrain, i - 1, obj) : 
label must be in [0,1] for logistic regression 

をsays-エラーを取得しておくました正確に何が問題なのかは分かりません。 1つの重要な点は、これがまれな事象検出問題であり、陽性事例の割合が全観測値の1%であることである。それが私がエラーを取得している理由ですか?

+0

私は 'output'変数は0と1の間でなければならないと考えています。 'xgboost'を使うときにレスポンスをコード化する必要があるかもしれません。 – steveb

答えて

5

あなたが0のに-1年代を変更した後、数値に要因からoutputを変更:

output <- as.numeric(levels(output))[output] 

私は、これはまれなイベント検出問題であるという事実は、エラーに関連しているとは思いません。

9

これは、レベル0と1の因子変数をXGBoostへの入力用のラベルに変換しようとする人に役立つかもしれません。

に変換した後に1を減算する必要があることに注意する必要があります。
> f <- as.factor(c(0, 1, 1, 0)) 

# XGBoost will not accept this for label 
> as.integer(f) 
[1] 1 2 2 1 

# Correct label 
> as.integer(f) - 1 
[1] 0 1 1 0 
0

Xgboostモデルを実行する前に、一定の手順を念頭に置いておく必要があります。 " - 1"

  1. すべての変数は、バイナリ分類の
  2. 数値である必要があり、あなたの出力変数は0からレベル(出力)[レベル(出力)==を使用して1

の範囲にすべきです] < - "0"、あなたの出力変数は文字になります。それを数値に変更し、範囲を0と1の間に保つと、あなたのXgboostモデルがおそらく動作します。