1. 程式人生 > >【精彩】為什麼在實際的 kaggle 比賽中 gbdt 和 random forest 效果非常好?

【精彩】為什麼在實際的 kaggle 比賽中 gbdt 和 random forest 效果非常好?

這是一個非常好,也非常值得思考的問題。換一個方式來問這個問題:為什麼基於 tree-ensemble 的機器學習方法,在實際的 kaggle 比賽中效果非常好?

通常,解釋一個機器學習模型的表現是一件很複雜事情,而這篇文章儘可能用最直觀的方式來解釋這一問題。

我主要從三個方面來回答樓主這個問題。

1. 理論模型 (站在 vc-dimension 的角度)
2. 實際資料
3. 系統的實現 (主要基於 xgboost)

通常決定一個機器學習模型能不能取得好的效果,以上三個方面的因素缺一不可。

(1)站在理論模型的角度


統計機器學習裡經典的 vc-dimension 理論告訴我們:一個機器學習模型想要取得好的效果,這個模型需要滿足以下兩個條件:

1. 模型在我們的訓練資料上的表現要不錯,也就是 trainning error 要足夠小。
2. 模型的 vc-dimension 要低。換句話說,就是模型的自由度不能太大,以防overfit.

當然,這是我用大白話描述出來的,真正的 vc-dimension 理論需要經過複雜的數學推導,推出 vc-bound.

vc-dimension 理論其實是從另一個角度刻畫了一個我們所熟知的概念,那就是 bias variance trade-off.



好,現在開始讓我們想象一個機器學習任務。對於這個任務,一定會有一個 “上帝函式” 可以完美的擬合所有資料(包括訓練資料,以及未知的測試資料)。很可惜,這個函式我們肯定是不知道的 (不然就不需要機器學習了)。我們只可能選擇一個 “假想函式” 來逼近 這個 “上帝函式”,我們通常把這個 “假想函式” 叫做 hypothesis.


在這些 hypothesis 裡,我們可以選擇 svm, 也可以選擇 logistic regression. 可以選擇單棵決策樹,也可以選擇 tree-ensemble (gbdt, random forest). 現在的問題就是,為什麼 tree-ensemble 在實際中的效果很好呢?

區別就在於 “模型的可控性
”。

“模型的可控性” 這個詞是我自己發明的,因為我沒有從其它的機器學習的教科書或者課程中找到類似的術語。先說結論,tree-ensemble 這樣的模型的可控性是好的,而像 LR 這樣的模型的可控性是不夠好的(或者說,可控性是沒有 tree-ensemble 好的)。為什麼會這樣?別急,聽我慢慢道來。

我們之前說,當我們選擇一個 hypothsis 後,就需要在訓練資料上進行訓練,從而逼近我們的 “上帝函式”。我們都知道,對於 LR 這樣的模型。如果 underfit,我們可以通過加 feature,或者通過高次的特徵轉換來使得我們的模型在訓練資料上取得足夠高的正確率。而對於 tree-enseble 來說,我們解決這一問題的方法是通過訓練更多的 “弱弱” 的 tree. 所以,這兩類模型都可以把 training error 做的足夠低,也就是說模型的表達能力都是足夠的。但是這樣就完事了嗎?沒有,我們還需要讓我們的模型的 vc-dimension 低一些。而這裡,重點來了。
在 tree-ensemble 模型中,通過加 tree 的方式,對於模型的 vc-dimension 的改變是比較小的。而在 LR 中,初始的維數設定,或者說特徵的高次轉換對於 vc-dimension 的影響都是更大的。換句話說,tree-ensemble 總是用一些 “弱弱” 的樹聯合起來去逼近 “上帝函式”,一次一小步,總能擬合的比較好。而對於 LR 這樣的模型,我們很難去猜到這個“上帝函式”到底長什麼樣子(到底是2次函式還是3次函式?上帝函式如果是介於2次和3次之間怎麼辦呢?)。所以,一不小心我們設定的多項式維數高了,模型就“剎不住車了”。俗話說的好,步子大了,總會扯著蛋。這也就是我們之前說的,tree-ensemble 模型的可控性更好,也即更不容易 overfit.

(2)站在資料的角度


除了理論模型之外, 實際的資料也對我們的演算法最終能取得好的效果息息相關。kaggle 比賽選擇的都是真實世界中的問題。所以資料多多少少都是有噪音的。而基於樹的演算法通常抗噪能力更強。比如在樹模型中,我們很容易對缺失值進行處理。除此之外,基於樹的模型對於 categorical feature 也更加友好。

除了資料噪音之外,feature 的多樣性也是 tree-ensemble 模型能夠取得更好效果的原因之一。通常在一個kaggle任務中,我們可能有年齡特徵,收入特徵,性別特徵等等從不同 channel 獲得的特徵。而特徵的多樣性也正是為什麼工業界很少去使用 svm 的一個重要原因之一,因為 svm 本質上是屬於一個幾何模型,這個模型需要去定義 instance 之間的 kernel 或者 similarity (對於linear svm 來說,這個similarity 就是內積)。這樣的數學模型使得 svm 更適合去處理 “同性質”的特質,例如影象特徵提取中的 lbp 。而從不同 channel 中來的 feature 則更適合 tree-based model, 這些模型對資料的 distributation 通常並不敏感。

(3)站在系統實現的角度

除了有合適的模型和資料,一個良好的機器學習系統實現往往也是演算法最終能否取得好的效果的關鍵。一個好的機器學習系統實現應該具備以下特徵:

1. 正確高效的實現某種模型。我真的見過有些機器學習的庫實現某種演算法是錯誤的。而高效的實現意味著可以快速驗證不同的模型和引數。
2. 系統具有靈活、深度的定製功能。
3. 系統簡單易用。
4. 系統具有可擴充套件性, 可以從容處理更大的資料。

到目前為止,xgboost 是我發現的唯一一個能夠上很好的滿足上述所有要求的 machine learning package. 在此感謝青年才俊 陳天奇。

在效率方面,xgboost 高效的 c++ 實現能夠通常能夠比其它機器學習庫更快的完成訓練任務。
在靈活性方面,xgboost 可以深度定製每一個子分類器,並且可以靈活的選擇 loss function(logistic,linear,softmax 等等)。除此之外,xgboost還提供了一些列在機器學習比賽中十分有用的功能,例如 early-stoping, cv 等等
在易用性方面,xgboost 提供了各種語言的封裝,使得不同語言的使用者都可以使用這個優秀的系統。
最後,在可擴充套件性方面,xgboost 提供的分散式訓練(底層採用 rabit 介面),並且其分散式版本可以跑在各種平臺之上,例如 mpi, yean, spark等等。

有了這麼多優秀的特性,自然而然大家都會去使用它來參加 kaggle 比賽。

綜上所述,理論模型,實際的資料,良好的系統實現,都是使得 tree-ensemble 在實際的 kaggle 比賽中“屢戰屢勝”的原因。