2017-03-21 6 views
1

caretパッケージのtrain関数を使用してxgbTreeモデルに適合させようとしています。xgbTreeがキャレットトレーニング用の非数式で失敗する

EDIT:ここでは、例を再現可能にするためのサンプルデータセットを示します。

df<-data.frame(
x1=c(-231,5,-166,-158,170,-243,-184,25,-130,-209,453,-46,-13,-247,-74,-209,-130,-118,10,40), 
x2=c(2,48,6,7,24,2,5,7,12,48,48,24,2,8,4,1,8,5,50,6), 
x3=c(6, 3, 2, 1, 2, 6, 0, 6, 2, 4, 5, 5, 2, 4, 1, 2, 3, NA, 0, 1), 
x4=c(0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 3, 0, 0, 0, 0, 0, 0, 1, 0, 0), 
x5=c(45.1, 58.6, 41.3, 58.6, 45.1, 60.8, 44.1, 58.6, 38.8, 40.5, 60.8, 45.1, 41.3, 45.1, 41.3, 45.1, 39, 41.3, 51.7, 51.7), 
x6=c(0, 2, 4, 0, NA, 0, 1, 0, NA, 0, 3, 0, 0, 0, 0, 0, 0, NA, 0, 0), 
x7=c(NA, 6, 6, NA, 6, NA, 3, NA, 6, NA, 6, NA, NA, NA, NA, NA, NA, 1, NA, NA), 
x8=c(0, 1, 4, 0, 4, 0, 2, 0, 1, 0, 4, 0, 0, 0, 0, 0, 0, 1, 0, 0), 
x9=c(0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 
x10=c(NA, NA, NA, NA, 0, NA, 0, NA, NA, NA, 0, NA, NA, NA, NA, NA, NA, NA, NA, NA), 
y=c(0.00272609554964902, 0.00196386488609584, 0.0169606512890095, 0, 0.00978263953223331, 0.00310850075796128, 0.0225595119926366, 0.00456053067993367, 0.00980320074504326, 0.0116718460483506, 0.0618914994405961, 0.0420972062763108, 0.00139303482587065, 0.0426927149151269, 0.0248756218905473, 0, 0, 0.000855672497463542, 0.0287026406429392, 0.00190374657325617)) 

私は式インタフェースのすべてを使用しています正常に動作します:

はEDIT:使用するライブラリが

library(caret) 
library(doParallel) 

registerDoParallel(cores=n) 

xgb_model <-train(y ~., 
        data = df, 
        method = "xgbTree", 
        na.action = na.pass) 

を追加しました。しかし、私はまた、提案されているよう数値にすべての変数を変換しました非数式インターフェースを使用しているときにモデルトレーニングが失敗します。

xgb_model <-train(x=df[,-ncol(df)], 
        y=df[,ncol(df)], 
        data = df, 
        method = "xgbTree", 
        na.action = na.pass) 

私はすでにすべてのNAを省略し、特定の変数のみを使用して問題を絞り込もうとしましたが、実際には入力データに関して問題が見つかりませんでした。

実際data.frameは次のようになります。train(x, y, ...)インタフェースを参照

'data.frame': 433 obs. of 30 variables: 
$ x1  : int -231 5 -166 -158 170 -243 -184 25 -130 -209 ... 
$ x2  : int 2 48 6 7 24 2 5 7 12 48 ... 
$ x3  : Ord.factor w/ 7 levels "0"<"1"<"2"<"3"<..: 4 3 2 3 7 1 7 3 5 6 ... 
$ x4  : Ord.factor w/ 8 levels "0"<"1"<"2"<"3"<..: 1 2 2 1 2 1 2 1 2 2 ... 
$ x5  : num 45.1 58.6 41.3 58.6 45.1 60.8 44.1 58.6 38.8 40.5 ... 
$ x6  : int 0 2 4 0 NA 0 1 0 NA 0 ... 
$ x7  : Ord.factor w/ 6 levels "1"<"2"<"3"<"4"<..: NA 6 6 NA 6 NA 3 NA 6 NA ... 
$ x8  : Ord.factor w/ 5 levels "0"<"1"<"2"<"3"<..: 1 2 5 1 5 1 3 1 2 1 ... 
$ x9  : Ord.factor w/ 5 levels "0"<"2"<"4"<"6"<..: 1 1 5 1 1 1 1 1 1 1 ... 
$ x10  : int NA NA NA NA 0 NA 0 NA NA NA ... 
$ x11  : Ord.factor w/ 10 levels "0"<"2"<"4"<"5"<..: 7 5 1 5 4 4 9 7 5 8 ... 
$ x12  : Ord.factor w/ 32 levels "0"<"1"<"2"<"3"<..: 10 2 1 13 1 10 6 6 1 1 ... 
$ x13  : Ord.factor w/ 13 levels "0"<"0.7"<"1.4"<..: 1 1 1 8 1 1 13 6 1 6 ... 
$ x14  : Factor w/ 4 levels "1","2","3","4": 2 1 1 4 1 2 4 1 4 4 ... 
$ x15  : int 1 2 3 1 2 1 1 9 2 2 ... 
$ x16  : int 180 200 160 250 120 160 300 600 180 150 ... 
$ x17  : Ord.factor w/ 6 levels "1"<"2"<"3"<"4"<..: 2 6 5 3 2 2 1 3 2 2 ... 
$ x18  : Ord.factor w/ 5 levels "1"<"2"<"3"<"4"<..: 4 1 2 3 5 3 4 4 5 5 ... 
$ x19  : num 366825 509200 353760 502500 306666 ... 
$ x20  : num 2 2 2 2 2.83 ... 
$ x21  : Factor w/ 2 levels "0","1": 1 2 1 1 1 1 2 1 1 1 ... 
$ x22  : int 50 70 32 48 20 56 57 51 53 55 ... 
$ x23  : int 5 2 5 5 2 3 3 2 4 1 ... 
$ x24  : int 0 0 3 0 0 0 0 0 0 0 ... 
$ x25  : int 0 2 0 0 0 0 0 0 0 0 ... 
$ x26  : Factor w/ 3 levels "1","2","3": 3 3 3 3 3 3 3 3 3 3 ... 
$ x27  : Ord.factor w/ 5 levels "12"<"13"<"14"<..: NA NA 3 3 1 5 1 5 5 5 ... 
$ x28  : Ord.factor w/ 9 levels "4"<"6"<"7"<"8"<..: 7 7 2 NA 4 6 8 NA 4 9 ... 
$ x29  : num -0.3211 -0.0462 -0.8133 0.3825 -0.5475 ... 
$ y  : num 0.00273 0.00196 0.01696 0 0.00978 ... 
+0

正確にあなたが取得しているエラーは何ですか? [再現可能な例]を提供してください(http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)。 'str()'からのデータの共有は役に立ちません。代わりに 'dput()'を使用してください。変数 'y'が定義されていますか? 'dataset [、y]'は実際にあなたの興味のある列を返しますか? – MrFlick

+0

再現可能な例を追加しました。私がキャレットから得ているエラーはそれほど役に立ちませんので、ここでは追加していません。エラー: 'train.default(x = df [、-ncol(df)]、y = df [、ncol(df)]のエラー: ' –

答えて

1

フォーム?trainヘルプ:xの

予測因子は限り配下のモデルフィット関数として最も任意のオブジェクトにすることができますオブジェクトクラスを扱うことができます。あなたがエラーを取得するよう

xgb.DMatrix機能の基礎となる(あなたはgetModelInfo('xgbTree')からキャレットのxgboostラッパーのすべての機能を見ることができる)は、入力として数値行列を期待しています。式trainは、フードの下でmodel.matrixを使用して、数式を数値行列に変換します。これには係数変数のエンコードが含まれます。 (x、y)インターフェイスを使用するには、まずdata.frameを行列に変換する必要があります。 model.matrixまたはcaret::dummyVarsのいずれかが役立ちます。

注意:あなたのデータには多くの順序変数変数があります。木はノンパラメトリックアルゴリズムのために順序間隔の不均一性を簡単に処理できるため、それらの中から複数のダミー変数を作成するのではなく、各序数要素を単一列数値に変換する方が良いでしょう。

+1

を停止していますdata.setを数値に変換しようとしましたまた、 'as.matrix(sapply(df、as.numeric))'を使用してデータを行列に変換しましたが、同じエラーが発生しています。 –

1

パラメータは、train()の公式バージョンでのみ使用してください。これはどちらか

xgb_model <- train(y ~., 
       data = df, 
       method = "xgbTree", 
       na.action = na.pass) 

または

を使用する必要があります意味
xgb_model <- train(x=df[,-ncol(df)], 
        y=df[,ncol(df)], 
        method = "xgbTree") 
私は問題が train()コマンド内の任意のミスによって引き起こされるが、 registerDoParallel(cores=n)を使用してモデルを並列化しようとする試みではなかったことが判明しました
0

doParallelパッケージからdoParallelは、今までのところ(つまりtreebag,cforestgbm)でテストした他のすべてのモデルで問題なく動作します。

したがって、次のコードは、あなたがdoParallelを使用していないことを考えると、正常に動作します:

xgb_model <- train(x=df[,-ncol(df)], 
        y=df[,ncol(df)], 
        method = "xgbTree") 
関連する問題