2017-07-30 82 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) 

從上面的代碼,我得到的F1得分〜0.8使用scikit-learn和〜0.25使用脫字符號。一個小的差異可能歸因於算法的差異,但是我必須在插入符號模型上做一些錯誤來獲得我在這裏看到的巨大差異。我不想發佈我的數據集,所以希望可以通過代碼來診斷問題。任何幫助將非常感激。

+0

是否存在您在插入符號中指定的隨機狀態參數? – blacksite

+0

@blacksite,不針對脫字符,但我在初始化模型之前設置種子。 –

回答

1

GBT是一個決策樹的集合。區別來自:

  • 集合中的決策樹數量(n_estimators = 4000n.trees = 100)。
  • 單個決策樹的形狀(寬度,深度)(max_depth = 5interaction.depth = 1)。

目前,你100 MBGradientBoostingClassifier對象的F1得分爲100 KBgbm對象比較 - 一個GBT模型包含着數以千計的時間比其他更多信息。

您可能希望這兩個模型導出到使用sklearn2pmmlr2pmml包裝標準化PMML表示,並期待得到的PMML文件內(純文本,這樣可以在任何文本編輯器中打開),以更好地把握它們的內部結構。

+0

換句話說,爲了讓您的GBT對象大小相同,請使用參數'n_estimators = 100'和'max_depth = 1'重新訓練您的'GradientBoostingClassifier'。 – user1808924

+0

此外,函數'prSummary'將爲您計算F分數。 – topepo