2017-04-14 14 views
0

我正在從一個Sklearn和GradientBoostingClassifier我正在從詳細輸出一些輸出奇怪。我從我的整個數據集中隨機抽取10%的樣本,大多數似乎沒問題,但有時候我會得到奇怪的輸出和糟糕的結果。有人可以解釋發生了什麼嗎?Scikit-Learn GradientBoostingClassifier中的錯誤?

「好」的結果:

n features = 168 
GradientBoostingClassifier(criterion='friedman_mse', init=None, 
       learning_rate=0.01, loss='deviance', max_depth=4, 
       max_features=None, max_leaf_nodes=None, 
       min_impurity_split=1e-07, min_samples_leaf=1, 
       min_samples_split=2, min_weight_fraction_leaf=0.0, 
       n_estimators=2000, presort='auto', random_state=None, 
       subsample=1.0, verbose=1, warm_start=False) 
     Iter  Train Loss Remaining Time 
     1   0.6427   40.74m 
     2   0.6373   40.51m 
     3   0.6322   40.34m 
     4   0.6275   40.33m 
     5   0.6230   40.31m 
     6   0.6187   40.18m 
     7   0.6146   40.34m 
     8   0.6108   40.42m 
     9   0.6071   40.43m 
     10   0.6035   40.28m 
     20   0.5743   40.12m 
     30   0.5531   39.74m 
     40   0.5367   39.49m 
     50   0.5237   39.13m 
     60   0.5130   38.78m 
     70   0.5041   38.47m 
     80   0.4963   38.34m 
     90   0.4898   38.22m 
     100   0.4839   38.14m 
     200   0.4510   37.07m 
     300   0.4357   35.49m 
     400   0.4270   33.87m 
     500   0.4212   31.77m 
     600   0.4158   29.82m 
     700   0.4108   27.74m 
     800   0.4065   25.69m 
     900   0.4025   23.55m 
     1000   0.3987   21.39m 
     2000   0.3697   0.00s 
predicting 
this_file_MCC = 0.5777 

「壞」的結果:

Training the classifier 
n features = 168 
GradientBoostingClassifier(criterion='friedman_mse', init=None, 
       learning_rate=1.0, loss='deviance', max_depth=5, 
       max_features='sqrt', max_leaf_nodes=None, 
       min_impurity_split=1e-07, min_samples_leaf=1, 
       min_samples_split=2, min_weight_fraction_leaf=0.0, 
       n_estimators=500, presort='auto', random_state=None, 
       subsample=1.0, verbose=1, warm_start=False) 
     Iter  Train Loss Remaining Time 
     1   0.5542   1.07m 
     2   0.5299   1.18m 
     3   0.5016   1.14m 
     4   0.4934   1.16m 
     5   0.4864   1.19m 
     6   0.4756   1.21m 
     7   0.4699   1.24m 
     8   0.4656   1.26m 
     9   0.4619   1.24m 
     10   0.4572   1.26m 
     20   0.4244   1.27m 
     30   0.4063   1.24m 
     40   0.3856   1.20m 
     50   0.3711   1.18m 
     60   0.3578   1.13m 
     70   0.3407   1.10m 
     80   0.3264   1.09m 
     90   0.3155   1.06m 
     100   0.3436   1.04m 
     200   0.3516   46.55s 
     300  1605.5140   29.64s 
     400 52215150662014.0469   13.70s 
     500 585408988869401440279216573629431147797247696359586211550088082222979417986203510562624281874357206861232303015821113689812886779519405981626661580487933040706291550387961400555272759265345847455837036753780625546140668331728366820653710052494883825953955918423887242778169872049367771382892462080.0000   0.00s 
predicting 
this_file_MCC = 0.0398 
+0

你可以找出哪些數據樣本是造成這個問題呢? –

+0

我正在訓練有大約100萬行數據集的「咬樣本」。每個樣本約有10萬行。由於我在相同的示例文件上運行了sklearn.ensemble.ExtraTreesClassifier,並且沒有錯誤,因此該問題似乎與輸入數據無關。 – denson

+0

好的。我在問,這樣我們就可以有一個可重複使用的例子來在sklearn上添加一個bug。 –

回答

1

爲「壞」例如你的學習率太高,你是跳躍在本地或全局極小在漸變增強算法的漸變下降步驟中。這會導致發散情況並導致您看到的錯誤爆發。看看this lecture from Andrew Ng's Machine Learning Course。學習率的相關部分大約在4點半左右。

想想梯度下降/的Ascent爲試圖找到自己的方式谷/山的底部或頂部或理想的最低/最高點全局的過程。如果丘陵/山谷非常大,而且你採取微小的步驟,你最終應該能夠找到自己的方式,至少在當地的最小/最大值。但是如果山丘/山谷與你的步伐大小成正比,那麼跨越最大/最小值將很容易跳躍,並最終變得糟糕透頂。學習率代表你的步驟的大小,在「良好」的情況下,你的學習率(α)爲0.01,所以你可以在正確的方向上進行很小的步驟(大部分),直到達到最小值,但在「糟糕」的情況下,你的alpha值爲1.0,所以你採取了大步驟並跳過局部最小值,最終上升而不是下降。這是思考在算法中學習速度如何的一個非常基本的方法。

如果您閱讀了關於tuning the learning rate on DatumBox的這篇文章,您會看到經過再循環的過程可視化(不確定是誰偷走了這張圖片,但是它無處不在)以及自適應改變學習率的一些討論。不知道這是否是sklearn的默認值,但我不會指望它。

+0

由於我隨機選擇參數,我知道某些組合會是「不好的」。但是,當出現問題時,GradientBoostingClassifier似乎正在輸出垃圾。對於一些輸入樣本,相同的參數實際上可以很好地工作併產生相當高的性能。 – denson

+0

這可能是隨機種子的結果。你使用固定的種子嗎?如果不是基於你開始下降的地方,某些參數可能有時會起作用,但其他參數不起作用。 – Grr

+0

我會建議使用grid_serch,而不僅僅是隨機化參數,如果你正在試圖尋找一個最佳模型。 – Grr

相關問題