Xgboost原理介紹,通俗易懂
初看Xgboost,翻了多篇部落格發現關於xgboost原理的描述實在難以忍受,缺乏邏輯性,寫一篇供討論。
——以下是拋磚引玉。
觀其大略,而後深入細節,一開始扎進公式反正我是覺得效率不高,還容易打消人的積極性。
首先說下決策樹
決策樹是啥?
舉個例子,有一堆人,我讓你分出男女,你依靠頭髮長短將人群分為兩撥,長髮的為“女”,短髮為“男”,你是不是依靠一個指標“頭髮長短”將人群進行了劃分,你就形成了一個簡單的決策樹,官方細節版本自行baidu或google劃分的依據是啥?
這個時候,你肯定問,為什麼用“頭髮長短”劃分啊,我可不可以用“穿的鞋子是否是高跟鞋”,“有沒有喉結”等等這些來劃分啊,Of course!那麼肯定就需要判斷了,那就是哪一種分類效果好,我就選哪一種啊。分類效果如何評價量化呢?
怎麼判斷“頭髮長短”或者“是否有喉結”…是最好的劃分方式,效果怎麼量化。直觀來說,如果根據某個標準分裂人群后,純度越高效果越好,比如說你分為兩群,“女”那一群都是女的,“男”那一群全是男的,這個效果是最好的,但事實不可能那麼巧合,所以越接近這種情況,我們認為效果越好。於是量化的方式有很多,資訊增益(ID3)、資訊增益率(C4.5)、基尼係數(CART)等等,來用來量化純度其他細節如剪枝、過擬合、優缺點、並行情況等自己去查吧。決策樹的靈魂就已經有了,依靠某種指標進行樹的分裂達到分類/迴歸的目的(上面的例子是分類),總是希望純度越高越好。
說下Xgboost的建樹過程
Xgboost是很多CART迴歸樹整合
概念1:迴歸樹與決策樹
事實上,分類與迴歸是一個型號的東西,只不過分類的結果是離散值,迴歸是連續的,本質是一樣的,都是特徵(feature)到結果/標籤(label)之間的對映。說說決策樹和迴歸樹,在上面決策樹的講解中相信決策樹分類已經很好理解了。迴歸樹是個啥呢?
直接摘抄人家的一句話,分類樹的樣本輸出(即響應值)是類的形式,如判斷蘑菇是有毒還是無毒,週末去看電影還是不去。而迴歸樹的樣本輸出是數值的形式,比如給某人發放房屋貸款的數額就是具體的數值,可以是0到120萬元之間的任意值。
那麼,這時候你就沒法用上述的資訊增益、資訊增益率、基尼係數來判定樹的節點分裂了,你就會採用新的方式,預測誤差,常用的有均方誤差、對數誤差等。而且節點不再是類別,是數值(預測值),那麼怎麼確定呢,有的是節點內樣本均值,有的是最優化算出來的比如Xgboost。
細節概念2:boosting整合學習,由多個相關聯的決策樹聯合決策,什麼叫相關聯,舉個例子,有一個樣本[資料->標籤]是[(2,4,5)-> 4],第一棵決策樹用這個樣本訓練得預測為3.3,那麼第二棵決策樹訓練時的輸入,這個樣本就變成了[(2,4,5)-> 0.7],也就是說,下一棵決策樹輸入樣本會與前面決策樹的訓練和預測相關。
與之對比的是random foreast(隨機森林)演算法,各個決策樹是獨立的、每個決策樹在樣本堆裡隨機選一批樣本,隨機選一批特徵進行獨立訓練,各個決策樹之間沒有啥毛線關係。
所以首先Xgboost首先是一個boosting的整合學習,這樣應該很通俗了
這個時候大家就能感覺到一個迴歸樹形成的關鍵點:(1)分裂點依據什麼來劃分(如前面說的均方誤差最小,loss);(2)分類後的節點預測值是多少(如前面說,有一種是將葉子節點下各樣本實際值得均值作為葉子節點預測誤差,或者計算所得)
是時候看看Xgboost了
首先明確下我們的目標,希望建立K個迴歸樹,使得樹群的預測值儘量接近真實值(準確率)而且有儘量大的泛化能力(更為本質的東西),從數學角度看這是一個泛函最優化,多目標,看下目標函式:
其中ii表示第i個樣本,l((ŷ i−yi)l((y^i−yi)表示第ii個樣本的預測誤差,誤差越小越好,不然你算得上預測麼?後面∑kΩ(fk)∑kΩ(fk)表示樹的複雜度的函式,越小複雜度越低,泛化能力越強,這意味著啥不用我多說。表示式為
Ω(f)=γT+12λ||w||2Ω(f)=γT+12λ||w||2
TT表示葉子節點的個數,ww表示節點的數值(這是迴歸樹的東西,分類樹對應的是類別)
直觀上看,目標要求預測誤差儘量小,葉子節點儘量少,節點數值儘量不極端(這個怎麼看,如果某個樣本label數值為4,那麼第一個迴歸樹預測3,第二個預測為1;另外一組迴歸樹,一個預測2,一個預測2,那麼傾向後一種,為什麼呢?前一種情況,第一棵樹學的太多,太接近4,也就意味著有較大的過擬合的風險)
ok,聽起來很美好,可是怎麼實現呢,上面這個目標函式跟實際的引數怎麼聯絡起來,記得我們說過,迴歸樹的引數:(1)選取哪個feature分裂節點呢;(2)節點的預測值(總不能靠取平均值這麼粗暴不講道理的方式吧,好歹高階一點)。上述形而上的公式並沒有“直接”解決這兩個,那麼是如何間接解決的呢?
先說答案:貪心策略+最優化(二次最優化,恩你沒看錯)
通俗解釋貪心策略:就是決策時刻按照當前目標最優化決定,說白了就是眼前利益最大化決定,“目光短淺”策略,他的優缺點細節大家自己去了解,經典揹包問題等等。
這裡是怎麼用貪心策略的呢,剛開始你有一群樣本,放在第一個節點,這時候T=1T=1,ww多少呢,不知道,是求出來的,這時候所有樣本的預測值都是ww(這個地方自己好好理解,決策樹的節點表示類別,迴歸樹的節點表示預測值),帶入樣本的label數值,此時loss function變為
如果這裡的l(w−yi)l(w−yi)誤差表示用的是平方誤差,那麼上述函式就是一個關於ww的二次函式求最小值,取最小值的點就是這個節點的預測值,最小的函式值為最小損失函式。
暫停下,這裡你發現了沒,二次函式最優化!
要是損失函式不是二次函式咋辦,哦,泰勒展開式會否?,不是二次的想辦法近似為二次。
接著來,接下來要選個feature分裂成兩個節點,變成一棵弱小的樹苗,那麼需要:(1)確定分裂用的feature,how?最簡單的是粗暴的列舉,選擇loss function效果最好的那個(關於粗暴列舉,Xgboost的改良並行方式咱們後面看);(2)如何確立節點的ww以及最小的loss function,大聲告訴我怎麼做?對,二次函式的求最值(細節的會注意到,計算二次最值是不是有固定套路,導數=0的點,ok)
那麼節奏是,選擇一個feature分裂,計算loss function最小值,然後再選一個feature分裂,又得到一個loss function最小值…你列舉完,找一個效果最好的,把樹給分裂,就得到了小樹苗。
在分裂的時候,你可以注意到,每次節點分裂,loss function被影響的只有這個節點的樣本,因而每次分裂,計算分裂的增益(loss function的降低量)只需要關注打算分裂的那個節點的樣本。原論文這裡會推匯出一個優雅的公式,我不想敲latex公式了,
接下來,繼續分裂,按照上述的方式,形成一棵樹,再形成一棵樹,每次在上一次的預測基礎上取最優進一步分裂/建樹,是不是貪心策略?!
凡是這種迴圈迭代的方式必定有停止條件,什麼時候停止呢:
(1)當引入的分裂帶來的增益小於一個閥值的時候,我們可以剪掉這個分裂,所以並不是每一次分裂loss function整體都會增加的,有點預剪枝的意思(其實我這裡有點疑問的,一般後剪枝效果比預剪枝要好點吧,只不過複雜麻煩些,這裡大神請指教,為啥這裡使用的是預剪枝的思想,當然Xgboost支援後剪枝),閾值引數為γγ正則項裡葉子節點數T的係數(大神請確認下);
(2)當樹達到最大深度時則停止建立決策樹,設定一個超引數max_depth,這個好理解吧,樹太深很容易出現的情況學習區域性樣本,過擬合;
(3)當樣本權重和小於設定閾值時則停止建樹,這個解釋一下,涉及到一個超引數-最小的樣本權重和min_child_weight,和GBM的 min_child_leaf 引數類似,但不完全一樣,大意就是一個葉子節點樣本太少了,也終止同樣是過擬合;
(4)貌似看到過有樹的最大數量的…這個不確定
具體數學推導細節(只要是那個節點分裂增益計算的公式),請參看作者(論文作者哦)介紹,很細緻!http://www.52cs.org/?p=429,上面那個也可以
問題1:節點分裂的時候是按照哪個順序來的,比如第一次分裂後有兩個葉子節點,先裂哪一個?
答案:呃,同一層級的(多機)並行,確立如何分裂或者不分裂成為葉子節點,來源
https://wenku.baidu.com/view/44778c9c312b3169a551a460.html
看下Xgboost的一些重點
ww是最優化求出來的,不是啥平均值或規則指定的,這個算是一個思路上的新穎吧;
正則化防止過擬合的技術,上述看到了,直接loss function裡面就有;
支援自定義loss function,哈哈,不用我多說,只要能泰勒展開(能求一階導和二階導)就行,你開心就好;
支援並行化,這個地方有必要說明下,因為這是xgboost的閃光點,直接的效果是訓練速度快,boosting技術中下一棵樹依賴上述樹的訓練和預測,所以樹與樹之間應該是隻能序列!那麼大家想想,哪裡可以並行?!
沒錯,在選擇最佳分裂點,進行列舉的時候並行!(據說恰好這個也是樹形成最耗時的階段)Attention:同層級節點可並行。具體的對於某個節點,節點內選擇最佳分裂點,候選分裂點計算增益用多執行緒並行。—–
較少的離散值作為分割點倒是很簡單,比如“是否是單身”來分裂節點計算增益是很easy,但是“月收入”這種feature,取值很多,從5k~50k都有,總不可能每個分割點都來試一下計算分裂增益吧?(比如月收入feature有1000個取值,難道你把這1000個用作分割候選?缺點1:計算量,缺點2:出現葉子節點樣本過少,過擬合)我們常用的習慣就是劃分區間,那麼問題來了,這個區間分割點如何確定(難道平均分割),作者是這麼做的:
方法名字:Weighted Quantile Sketch
大家還記得每個樣本在節點(將要分裂的節點)處的loss function一階導數相關推薦
Xgboost原理介紹,通俗易懂
初看Xgboost,翻了多篇部落格發現關於xgboost原理的描述實在難以忍受,缺乏邏輯性,寫一篇供討論。——以下是拋磚引玉。 觀其大略,而後深入細節,一開始扎進公式反正我是覺得效率不高,還容易打消人的積極性。首先說下決策樹決策樹是啥? 舉個例子,有一堆人,我讓你分出男女,你
MySql索引演算法原理解析(通俗易懂,只講B-tree)
剛開始學習的時候,百度去查,但發現好多說得太複雜不好理解,結合各個文章總結一下(建議大概看文字,不理解不要緊,然後再看圖的執行步驟然後在結合文字,這樣一切就清晰好多) B-tree,B是balance,一般用於資料庫的索引。使用B-tree結構可以顯著減少定位記錄
OAuth原理,圖文並茂,通俗易懂
步驟2請求OAuth登入頁(慕課的伺服器請求騰訊伺服器)步驟3使用第三方賬號登入並授權步驟4返回登入結果拿到了加密後的code引數,有了code基本上可以確定(使用者輸入的QQ號和密碼)是匹配的,也就是
SVM 原理詳解,通俗易懂
看了該作者的文章,瞬間膜拜了!講得太好了!(一)SVM的簡介支援向量機(Support Vector Machine)是Cortes和Vapnik於1995年首先提出的,它在解決小樣本、非線性及高維模式識別中表現出許多特有的優勢,並能夠推廣應用到函式擬合等其他機器學習問題中[
Android中廣播的使用程式碼,通俗易懂介紹廣播獲取使用(BroadcastReceiver)
/***********************佈局檔案***********************/ <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http:
redux 小demo,通俗易懂
clas mage 分享圖片 post png bsp src dem body redux 小demo,通俗易懂
什麽是Socket?簡單點,通俗易懂的?
電視 連接 link itl 網絡 baidu 虛擬 網絡通信 易懂 網絡上的兩個程序通過一個雙向的通信連接實現數據的交換,這個連接的一端稱為一個socket。 建立網絡通信連接至少要一對端口號(socket)。socket本質是編程接口(API),對TCP/IP的封裝,
如何使用Squid服務來構建=》傳統和透明代理服務器,通俗易懂!
bdb changelog 控制 error log out blog dex web 1、緩存代理概述: 作為應用層的代理服務軟件,Squid主要提供緩存加速和應用層過濾控制的功能 2、代理的工作機制: (1)當客戶機通過代理來請求web頁面時,指定的代理服務器會先檢查自
類和介面的區別,通俗易懂
原文連結:https://blog.csdn.net/fenglibing/article/details/2745123 介面和抽象類有什麼區別 你選擇使用介面和抽象類的依據是什麼? 介面和抽象類的概念不一樣。介面是對動作的抽象,抽象類是對根源的抽象。 抽象類表示的是,這個物件是什
如何理解Linux下的動態庫概念,和靜態庫概念,通俗易懂的解釋如下:
動態庫和靜態庫都是一組函式集合,打包在一起供應用程式呼叫,區別是: 靜態庫名稱一般為xxx.a,在編譯時和應用程式連結在一起,這樣的應用程式佔用空間較大。 動態庫名稱一般為xxx.so,對於動態庫即可以在編譯時連結,也可以使用dlopen()/dlsy
JQuery圖文解釋,通俗易懂,小白快來瞅瞅的。。趕緊的!
1. 正則表示式 宣告 var regex = new RegExp(partten); var regex2 = /^匹配規則$/; /../:模式符號 ^:匹配開始 $:匹配結束 \d:數字[0-9] \w:字母數字下劃線[0-9A-Za-z
python歌詞解析(非常牛詳細,通俗易懂,有驗證部分)
廢話不多說直接上程式碼,一看就懂每一步都有註釋 s = '''[ti:藍蓮花] [ar:許巍] [al:留聲十年絕版青春北京演唱會] [00:-01.70]藍蓮花 [00:-00.70]演唱:許巍 [00:00.00] [00:00.70]沒有什麼能夠阻擋 [00:06.01]你對自由的
kafka基本原理介紹,以及重新選舉,replica複製機制,isr等。
最近做的專案,通過資料庫的log日誌將資料庫某些千萬量級的表(這些表需要聯表查詢)資料同步到elasticsearch中,以減輕資料庫的查詢壓力,其中以kafka作為訊息中介軟體,以下是做該專案過程中對kafka的一些整理。 一、中介軟體 中介軟體,用於業務對於資料的時效
RNN介紹,較易懂
Recurrent Neural Networks 人類並不是每時每刻都從一片空白的大腦開始他們的思考。在你閱讀這篇文章時候,你都是基於自己已經擁有的對先前所見詞的理解來推斷當前詞的真實含義。我們不會將所有的東西都全部丟棄,然後用空白的大腦進行思考。我們的思想擁有永續
【無監督學習】DBSCAN聚類演算法原理介紹,以及程式碼實現
前言:無監督學習想快一點複習完,就轉入有監督學習 聚類演算法主要包括哪些演算法?主要包括:K-m
7-8 哈利·波特的考試 (25 分)(Floyed)(c++描述,超詳細註釋,通俗易懂)
哈利·波特要考試了,他需要你的幫助。這門課學的是用魔咒將一種動物變成另一種動物的本事。例如將貓變成老鼠的魔咒是haha,將老鼠變成魚的魔咒是hehe等等。反方向變化的魔咒就是簡單地將原來的魔咒倒過來念,例如ahah可以將老鼠變成貓。另外,如果想把貓變成魚,可以通過念一個直接魔咒lalala,也可以將
簡單示例理解樸素貝葉斯演算法,通俗易懂
一個簡單的例子 讓我們看一下這個例子在實踐中如何運作。假設我們正在建立一個分類器,說明文字是否涉及體育運動。我們的訓練集有5句話: Text Category A great game(一個偉大的比賽)
POS-商戶手續費-從生活剖析,通俗易懂
前言 我們大家日常都在使用pos機,尤其是買衣服,吃火鍋,都習慣刷卡。pos機帶來的消費便利,也正是市場 對經濟的一種促進手段。 今天主要分享下商戶手續費這個概念,引出這個概念前,我們先大概說點別的東西。 一、卡片的分類 1.1、借記卡/儲蓄卡 我們最常見的卡片,一般我們去銀行辦理
多執行緒問題,三個執行緒輪流進行,每個執行緒進行n次操作,共執行n*n*3次操作。本程式碼用三軍攻擊做演示,通俗易懂。
package com.yyj.zxy; public class SanJunFight { /** * 三隻部隊輪流上戰場,每隻部隊在戰場上每一輪只能進行n次攻擊; * 合計攻擊300次則停止攻擊; */ private static int coun
快速排序,通俗易懂~
快速排序由於排序效率在同為O(N*logN)的幾種排序方法中效率較高,因此經常被採用,再加上快速排序思想----分治法也確實實用,因此很多軟體公司的筆試面試,包括像騰訊,微軟等知名IT公司都喜歡考這個,還有大大小的程式方面的考試如軟考,考研中也常常出現快速排序的身影。