2017-07-30 19 views
0

私はscikit-learnとcaretを使って同じ入力データでF1スコアを大幅に上げています。ここでは、それぞれについてGBMモデルを実行しています。scikit-learnとcaret GBMの結果の違いは?

scikit-学ぶ(F1はデフォルトの出力である)

est = GradientBoostingClassifier(n_estimators = 4000, learning_rate = 0.1, max_depth = 5, max_features = 'log2', random_state = 0) 
cv = StratifiedKFold(y = labels, n_folds = 10, shuffle = True, random_state = 0) 
scores = cross_val_score(est, data, labels, scoring = 'f1', cv, n_jobs = -1) 

キャレット(F1を定義して呼び出さなければなりません):

f1 <- function(data, lev = NULL, model = NULL) { 
     f1_val <- F1_Score(y_pred = data$pred, y_true = data$obs, positive = lev[1]) 
     c("F1" = f1_val) 
} 
set.seed(0) 
gbm <- train(label ~ ., 
      data = data, 
      method = "gbm", 
      trControl = trainControl(method = "repeatedcv", number = 10, repeats = 3, 
            summaryFunction = f1, classProbs = TRUE), 
      metric = "F1", 
      verbose = FALSE) 

上記のコードから、私は〜0.8のF1のスコアを取得Scikit-Learnを使用し、キャレットを使用して〜0.25を使用します。小さな違いはアルゴリズムの違いに起因する可能性がありますが、私はここで見ている大きな違いを得るために、キャレットモデリングに何か間違ったことをしているに違いありません。私は自分のデータセットを投稿したくないので、コードから問題を診断できることを願っています。どんな助けでも大歓迎です。

+0

キャレットに指定するランダムな状態パラメータはありますか? – blacksite

+0

@blacksite、キャレットに固有のものではありませんが、モデルを初期化する前にシードを設定します。 –

答えて

1

GBTは決定木のアンサンブルです。

  • アンサンブル(n_estimators = 4000n.trees = 100)における決定木の数:違いがから来ています。
  • 個々の決定木の形状(幅、深さ)(max_depth = 5interaction.depth = 1)。

現在、100 キロバイトgbmオブジェクトとあなたが100 MBのF1スコアを比較しているGradientBoostingClassifierオブジェクト - 1つのGBTモデルは、文字通り他よりも数千倍より多くの情報が含まれています。

sklearn2pmmlおよびr2pmmlパッケージを使用して、標準のPMML表現に両方のモデルをエクスポートし、結果のPMMLファイル(プレーンテキストなので任意のテキストエディタで開くことができます)を調べて内部構造をよく把握できます。

+0

つまり、GBTオブジェクトをおおよそ同じサイズにするには、パラメータ 'n_estimators = 100'と' max_depth = 1'を使って 'GradientBoostingClassifier'を再調整してください。 – user1808924

+0

また、関数 'prSummary'はあなたのFスコアを計算します。 – topepo

関連する問題