大數據比賽(3)- 模型選擇I

聊完特徵,就要說說模型的選擇與實現。雖然已經接觸了不少機器學習方法和模型,但最近纔對監督學習有了一些提綱挈領的認識,在介紹模型的同時對這些零散的知識進行簡單的彙總。(誰讓我健忘。。)

監督學習的基本模式

陳天奇大大有一篇將boost tree的文章裏提到了監督學習的key concepts,抄來加深一下印象:
監督學習要素:樣本(標記) 模型 參數 目標函數 優化方法
i. 模型和參數
模型指給定輸入xi如何去預測輸出 yi。我們比較常見的模型如線性模型(包括線性迴歸和logistic regression)採用了線性疊加的方式進行預測y^i=∑jwjxijy^i=∑jwjxij 。其實這裏的預測yy可以有不同的解釋,比如我們可以用它來作爲迴歸目標的輸出,或者進行sigmoid 變換得到概率,或者作爲排序的指標等。而一個線性模型根據yy的解釋不同(以及設計對應的目標函數)用到迴歸,分類或排序等場景。參數指我們需要學習的東西,在線性模型中,參數指我們的線性係數ww。
• Notations: i-th training example
• Model: how to make prediction given
• Parameters: the things we need to learn from data

ii. 目標函數:損失 + 正則
模型和參數本身指定了給定輸入我們如何做預測,但是沒有告訴我們如何去尋找一個比較好的參數,這個時候就需要目標函數登場了。一般的目標函數包含下面兩項:
• Objective Function(目標函數)
這裏寫圖片描述
常見的誤差函數有L=∑nil(yi,y^i)L=∑inl(yi,y^i) 比如平方誤差 l(yi,y^i)=(yi−y^i)2l(yi,y^i)=(yi−y^i)2 ,logistic誤差函數(l(yi,y^i)=yiln(1+e−y^i)+(1−yi)ln(1+ey^i)l(yi,y^i)=yiln⁡(1+e−y^i)+(1−yi)ln⁡(1+ey^i) )等。而對於線性模型常見的正則化項有L2L2正則和L1L1正則。這樣目標函數的設計來自於統計學習裏面的一個重要概念叫做Bias-variance tradeoff,Bias可以理解爲假設我們有無限多數據的時候,可以訓練出最好的模型所拿到的誤差。而Variance是因爲我們只有有限數據,其中隨機性帶來的誤差。目標中誤差函數鼓勵我們的模型儘量去擬合訓練數據,這樣相對來說最後的模型會有比較少的 bias。而正則化項則鼓勵更加簡單的模型。因爲當模型簡單之後,有限數據擬合出來結果的隨機性比較小,不容易過擬合,使得最後模型的預測更加穩定

iii.優化方法:
給定目標函數之後如何學習模型參數進而優化目標函數,也就是怎麼學的問題。不同的模型通常具有獨特的優化方法,在講述模型部分詳述

常用模型概述

Tree Ensemble

現在在數據比賽中,效率最高、效果較好的常用模型就是基於分類或迴歸樹的樹形模型。下面就已有的一些資料進行簡單整理:

基礎:

分類和迴歸樹

決策樹應當都很熟悉了,實際上是將空間用超平面進行劃分的一種方法,每次分割的時候(選擇分裂結點)都將當前的空間一分爲二, 每一個葉子節點都是在空間中的一個不相交的區域。根據樣本特徵的取值可以把這個樣本劃分到某一個葉子節點來得到分類結果。而回歸樹可以看做分類樹的擴展,不同點是在每個葉子節點上對應一個實值得分數,進而完成數值型的預測任務
這裏寫圖片描述

boosting 與 bagging

集成學習方法是機器學習的重要內容,而boosting與bagging就是常用的兩種。所謂集成,其實就是將若干個“弱”分類器“綁”在一起構成一個“強”分類器(我來組成頭部!!!。。。。)
boosting:通常使用的是AdaBoost(Adaptive Boosting):初始化時對每一個訓練樣例賦相等的權重1/n,然後用該學算法對訓練集訓練t輪,每次訓練後,對誤分類樣本賦以較大的權重,(也就是讓學習算法在後續的學習中集中對比較難的訓練例進行學習),每輪學習後得到的函數(分類器)也依據誤分類率獲得一個權重,從而得到一個預測函數序列h_1,⋯, h_m,預測效果好的預測函數權重較大,反之較小。最終的預測函數H對分類問題採用‘加權多數表決’的方式,對迴歸問題採用‘加權平均’的方法對新示例進行判別。
(串行進行的,第k個分類器訓練時關注對前k-1分類器中錯分的樣本。流水作業,每個人都告訴下一個人哪裏比較難,有’經驗’傳承,學的好的人‘發言權’比較大)

bagging:bootstrap aggregating的縮寫。訓練多輪,每輪的訓練集由從初始的訓練集中隨機取出的n個訓練樣本組成,(也就是說,某個初始訓練樣本可以出現多次或根本不出現),訓練之後可得到一個預測函數序列h_1,⋯ ⋯h_n ,最終的預測函數H對分類問題採用‘多數表決’方式,對迴歸問題採用‘簡單平均’方法對新示例進行判別。
(可以並行進行,第k個分類器取決於所選取的訓練樣本。並行作業,每個人隨機學習一部分內容,擁有同樣的表決權利)

Bagging與Boosting的區別:二者的主要區別是取樣方式不同。Bagging採用均勻取樣,而Boosting根據錯誤率來取樣,因此通常Boosting的分類精度要優於Bagging,但有些數據集中,boosting會引起退化(Overfit)。Bagging的訓練集的選擇是隨機的,各輪訓練集之間相互獨立,而Boostlng的各輪訓練集的選擇與前面各輪的學習結果有關;Bagging的各個預測函數沒有權重,而Boosting是有權重的;Bagging的各個預測函數可以並行生成,而Boosting的各個預測函數只能順序生成。對於神經網絡這樣極爲耗時的學習方法,Bagging可通過並行訓練節省大量時間開銷。

隨機森林 Random Forest

官方版:
隨機森林是一個用隨機方式建立的,包含多個決策樹(CART樹)的分類器。其輸出的類別是由各個樹多數表決而定。
隨機性主要體現在兩個方面:(1)訓練每棵樹時,從全部訓練樣本中選取一個子集進行訓練(即bootstrap取樣)。用剩餘的數據進行評測,評估其誤差;(2)在每個節點,隨機選取所有特徵的一個子集,用來計算最佳分割方式。
隨機森林的主要優點:(1)在大的、高維數據訓練時,不容易出現過擬合而且速度較快;(2)測試時速度很快;(3)對訓練數據中的噪聲和錯誤魯棒

隨機森林的訓練過程可以總結如下:(請注意黑體字的行、列採樣和sklearn參數)
(1)給定訓練集S,測試集T,特徵維數F。
以sklearn爲例,確定參數:使用到的CART樹的數量n_estimators,每棵樹的深度max_depth,每個節點使用到的特徵數量max_features,終止條件:節點上最少樣本數min_samples_split ,節點上最少的信息增益(或者熵)min_weight_fraction_leaf
(2)從S中有放回的抽取大小和S一樣的訓練集S(i)(‘行採樣’),作爲根節點的樣本,從根節點開始訓練
(3)如果當前節點上達到終止條件,則設置當前節點爲葉子節點,如果是分類問題,該葉子節點的預測輸出爲當前節點樣本集合中數量最多的那一類c(j),概率p爲c(j)佔當前樣本集的比例;如果是迴歸問題,預測輸出爲當前節點樣本集各個樣本值的平均值,然後繼續訓練其他節點。如果當前節點沒有達到終止條件,則從F維特徵中無放回的隨機選取f維特徵(‘列採樣’)。利用這f維特徵,尋找分類效果最好的一維特徵k及其閾值th,當前節點上樣本第k維特徵小於th的樣本被劃分到左節點,其餘的被劃分到右節點。
(4)重複直到所有CART都被訓練過

利用隨機森林的預測過程如下:
(1)從當前樹的根節點開始,根據當前節點的閾值th,判斷是進入左節點還是進入右節點(>=th),直到到達某個葉子節點,並輸出預測值。
(2)重複執行(1)直到所有t棵樹都輸出了預測值。如果是分類問題,則輸出爲所有樹中預測概率總和最大的那一個類,即對每個c(j)的p進行累計;如果是迴歸問題,則輸出爲所有樹的輸出的平均值。

通俗版:
爲什麼隨機森林的效果好?不就是一羣戰5渣的組合嗎?簡單來說,99.9%不相關的樹做出的預測結果涵蓋所有的情況,這些預測結果將會彼此抵消。少數優秀的樹的預測結果將會超脫於芸芸“噪音”,做出一個好的預測。隨機森林就是學習方法中最“百搭”的一種,你幾乎可以把任何東西扔進去,它基本上都是可供使用的。(在數據比賽中非常好用,運行速度快,調參比較簡單,假設你初步提了幾個特徵又不知道效果好不好,請選擇rf幫你測測;假設你剛改進了一個模型,不知道泛化能力怎麼樣,請選擇rf幫你比比;假如你完全沒思路,哈哈哈,請選擇rf,因爲他比你猜的準)

你以爲這就完了?還記的上一篇中的特徵選擇麼?沒錯,rf可以幫你搞定,它能夠處理很高維度(feature很多)的數據,並且不用做特徵選擇,在訓練完後,它還能夠給出哪些feature比較重要,訓練速度快,還支持並行哦,只要998,萬能分類器帶回家!!!。。

GBDT -Gradient Boost Decision Tree

Boosted Tree有各種‘馬甲’,比如GBDT, GBRT (gradient boosted regression tree),MART(Multiple Additive Regression Tree),LambdaMART也是一種boosted tree的變種,最早的提出者應該是Friedman。
GBDT主要由三個概念組成:Regression Decistion Tree(即DT),Gradient Boosting(即GB),Shrinkage(學習方法,大部分都使用)。DT不用多說就是迴歸樹,GB則是個比較大的命題,老樣子,雅俗共賞:
官方版
一般的,損失函數(loss function)描述的是模型的訓練誤差,損失函數越大,則說明模型越容易出錯(不考慮方差、偏差均衡問題)。學習的過程讓損失函數持續的下降,則說明我們的模型在不停的改進,而梯度方向是函數下降最快的方向(高數學過吧),神經網絡中梯度下降法(SGD)就是這種思想。
在GBDT中,算法流程如下:
(0) 給定一個初始值
(1) 建立M棵決策樹(迭代M次)
(2) 對函數估計值F(x)進行Logistic變換
(3) 對於K個分類進行下面的操作(通常爲向量操作):

  • 求得殘差減少的梯度方向
  • 根據每一個樣本點x,與其殘差減少的梯度方向,得到一棵由J個葉子節點組成的決策樹
  • 爲當決策樹建立完成後,得到每一個葉子節點的增益(在預測時用)
  • 將當前得到的決策樹與之前的那些決策樹合併起來,作爲新的一個模型

通俗版:
之前介紹的Boost算法是在算法開始的時候,每一個樣本賦上一個權重值,在每一步結束後,增加分錯的點的權重,減少分對的點的權重,這樣使得某些誤分類點被“嚴重關注”。然後進行N次迭代得到N個簡單的分類器(basic learner)將它們組合起來得到一個最終的模型。
而Gradient Boost中,每一次的計算是爲了減少上一次的殘差(residual),而爲了消除殘差,我們可以在殘差減少的梯度(Gradient)方向上建立一個新的模型。即:

在Gradient Boost中,每個新的模型的建立是爲了使得之前模型的殘差往梯度方向減少。

那什麼是殘差呢?很簡單,殘差就是一個加預測值後能得真實值的累加量
抄個例子:

比如A的真實年齡是18歲,但第一棵樹的預測年齡是12歲,差了6歲,即殘差爲6歲。那麼在第二棵樹裏我們把A的年齡設爲6歲去學習,如果第二棵樹真的能把A分到6歲的葉子節點,那累加兩棵樹的結論就是A的真實年齡;如果第二棵樹的結論是5歲,則A仍然存在1歲的殘差,第三棵樹裏A的年齡就變成1歲,繼續學習

Shrinkage(縮減)的思想認爲,每次走一小步逐漸逼近結果的效果,要比每次邁一大步很快逼近結果的方式更容易避免過擬合。即它不完全信任每一個棵殘差樹,它認爲每棵樹只學到了真理的一小部分,累加的時候只累加一小部分,通過多學幾棵樹彌補不足

y(i+1) = 殘差(y1~yi), 其中: 殘差(y1~yi) = y真實值 - y(1 ~ i)
y(1 ~ i) = SUM(y1, …, yi)
Shrinkage不改變第一個方程,只把第二個方程改爲:
y(1 ~ i) = y(1 ~ i-1) + step * yi

GBDT適用於各種迴歸問題,在二分類等分類問題中也有不錯的效果。

xgboost -Extreme Gradient Boosting

xgboost在kaggle比賽中大放異彩,是Gradient Boosting Machine的一個c++實現,先放陳天奇大牛文章和講義:
Boosted Tree http://www.52cs.org/?p=429
講義 http://homes.cs.washington.edu/~tqchen/pdf/BoostedTree.pdf
還有一些相關資料:
xgboost導讀和實戰 http://vdisk.weibo.com/s/vlQWp3erG2yo/1431658679
XGBoost Parameters
http://xgboost.readthedocs.io/en/latest/parameter.html
XGboost參數設置(譯文)
http://blog.csdn.net/zzlzzh/article/details/50770054

簡單來說,不同於傳統的gbdt方式,只利用了一階的導數信息;xgboost對loss function做了二階的泰勒展開,並在目標函數之外加入了正則項整體求最優解,用以權衡目標函數的下降和模型的複雜程度,避免過擬合;
優點是運行速度快、可以並行執行,缺點是參數比較複雜,調參不是很容易。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章