1. 程式人生 > >Spark GBDT vs Random Forests vs xgboost

Spark GBDT vs Random Forests vs xgboost

演算法層面比較: GBDT vs Random Forests (RF)

1) GBDT一次只訓練一棵樹,而RF一次可以並行地訓練多棵樹,所以GBDT的訓練時間更長。所以,GBDT通常會使用更小的樹,同時也減少訓練一棵樹的時間。

2)RF更不容易過擬合,訓練更多的樹能夠降低RF過擬合的可能性,卻增加GBDT過擬合的可能性。 (因為在統計學角度,RF通過訓練更多的樹降低方差,而GBDT通過訓練更多的樹來降低偏差.)

3) RF更易於調整,因為其效能隨樹的個數單調遞增。而對於GBDT來說,當樹的個數太大時,其效能可能會隨著樹的個數增加而降低。

隨機森林

支援二分類,多分類,迴歸。訓練的每棵樹的分類結果都會有所不同,將所有樹結合在一起可以降低方差,從而提高效能。

1.訓練

每一次迭代中從原始資料集取樣得到子資料集,在子資料集上應用決策樹模型。對於不同的子資料集,使用不同的特徵子集作為決策樹上的分類節點。

2.預測

1)分類模型:多數投票制。每一棵樹的預測結果代表對對應類的一個選票,最終將選票最多的類作為最終預測結果。

2)迴歸模型:平均。將每棵樹的結果做平均得到最終預測結果。

3.提升模型效能常考慮的引數

1)numTrees: 增加樹的數目能夠降低模型的方差,提高在測試集上的效能,但是同時也會線性增加訓練時間。

2)maxDepth:增加每棵樹的深度能夠增加樹的可表示性,但也會增加訓練時間並且可能會過擬合(增加了每棵樹中的特徵個數)。但是相比於單棵決策樹,增加樹的深度對於隨機森林來說是可以接受的。

4.通常不需要調整但可以加快訓練速度常考慮的引數

1)subSamplingRate:用於控制單棵樹上的訓練子集的大小,也就是子資料集的規模。通常推薦為預設值1.0,但是減小值可以加快訓練。

2)featureSubsetStrategy: 在每棵樹的節點上作為候選的特徵集的大小。減小這個值可以減少最優分割節點的計算量,但如果值過小也會影響樹的效能。這個引數和maxDepth是不同的概念,maxDepth調整的是每棵子樹上使用的最大特徵個數,而featureSubsetStrategy調整的是在每個節點上挑選分割節點的候選集的大小。

GBDT

支援二分類和迴歸,不支援多分類。迭代地訓練一序列的樹,在每一次迭代中,使用當前的整合模型來預測訓練資料並且和其真實類標進行對比,之後會提升那些訓練結果不是很好的樣本(分類錯誤,或者回歸值與真實值相差較大)的權重,從而用於下一次迭代。每個樣本的re-label機制都是通過損失函式決定的,每次迭代的目標就是降低損失函式值。

損失函式只能用於分類或者回歸中的一種,不能同時適用。

優化方式使用了一階求導。

2.提升模型效能常考慮的引數

1) loss: 損失函式

2) numIterations: 樹的個數,每增加一次迭代即增加一棵樹。增加樹的個數能夠增加模型的表示性,提高訓練集上的預測準確性,但如果個數太大會造成過擬合,影響測試集上的效果。

3)learningRate:不太需要調整這個值。但如果模型表現不是很穩定時,降低learningRate能夠讓模型表現更穩定。

3. validation while training

樹的個數增加可能引起過擬合,因此需要在training的時候進行驗證,使用runWithValidation。

4. 防止過擬合能夠設定的引數

1) 上文提到的numIterations:樹的個數過多會造成過擬合;

2)maxDepth:控制每棵樹的最大深度

3)min_samples_split:每個葉子節點上的最少節點數,以保證樣本沒有被過度分割,即過擬合。

xgboost

損失函式使用了泰勒展開式二階求導,學習速度更快,這是其優於GBDT的方面。