一、前述:算法
二、Bosting方式介紹:bootstrap
五、待解決問題:app
從本節開始咱們講解集成學習的思想和一個重要的算法Adaboost。
以前咱們介紹了blending的一種方式,uniformly blending,均勻的攪拌,也就是bagging形式,就是把全部g(x)加起來,取個符號,每一個g(x)的結果認爲是一樣重要的,此時每一個g(x)的權重就等於1。數學符號表達爲:
今天開始咱們講解另外一種blending的方式,linearly Blending,就是把結果線性組合一下。線性組合就是一次項前邊能夠和一個係數相乘,再相加叫作線性組合,線性組合關注的是,它不帶平方關係,不帶立方關係,只是一次項,咱們稱這種一次方的相乘相加就叫作線性的。由於它是直的,帶平方它就變成曲線了,或者相乘就變成曲線了。假如g1(x)乘以g2(x)雖然沒帶平方,但它也不是線性的,它們彼此之間相乘了。它們不能相乘,只能有相加的關係,係數能夠隨便加,咱們管這個東西叫作線性的Blending,簡稱Lineraly Blending 。也就是Boosting 方式,此時它們的權重是unequal,不相等的。數學符號表達爲:
Boosting方式表明有Adaboost和GBDT。
爲何linearly Blending加α而uniformly Blending不加α,取決於怎麼訓練的模型。uniformly Blending之因此不加是由於咱們公平地進行了一個隨機抽樣,而linearly Blending爲何會加?取決於訓練的時候就決定了必定須要加了α纔有意義。
Boosting是集成學習的一種思路,它經過多輪迭代生成多個弱分類器,它是用所有的數據,而Bagging不必定用所有的數據。Boosting經過多輪迭代,每輪產生一個弱分類器,最後將弱分類器的結果線性組合,獲得強分類器的最終結果。
咱們先看下Adaboost的一個例子,對於下圖:
假如只容許思考一秒鐘,如何判斷一個物體是蘋果?
第一我的說圓的是蘋果,那麼會發現全部圓的裏面,圖上標的藍色部分被分錯了,有的是圓的,可是沒有被標出來,有的是蘋果,可是由於不是圓的因此也沒被識別出來,總之就是看錯了,弱分類器,容許犯錯誤。爲了彌補這些錯誤,咱們着重在錯誤的裏面考慮,又發現紅的是蘋果。如今就是兩個條件了,圓的和紅的是蘋果。發如今這兩個條件下面,又有被分錯的,以下圖藍色部分:
原本是蘋果,由於顏色是綠色的因此在圓的和紅的兩個條件下面沒有被識別出來。又由於番茄是圓的和紅的,因此識別錯了。再着重在錯誤的裏面考慮,咱們又會發現綠色的是蘋果。這三個說法至關於咱們每一次都得出一個弱分類器,來得出最後的判斷。可是這3個弱分類器的靠譜程度顯然不同。咱們須要組合去用他們,如今就獲得了三個結果,一是圓的是蘋果,二是紅的是蘋果,三是綠色是蘋果,三不是很靠譜,翻譯過來就是它的正確率不會過高,而前兩個的正確率相對來講有點不相上下。咱們給每個賦予一個權重的概念,也就至關於投票。這三個投票的話,第一個靠譜一點的給它高一點權重,好比是1.5,第二個紅的還能夠,給1.45,綠的最差,給它0.1。好比咱們拿下面的蘋果作測試:
咱們判斷是否是蘋果,就根據最後的結果,若是>0就是蘋果<0不是蘋果1。對於這一個來講,它不是紅的,因此給它-1.5,對於第二個來講,它是圓的因此給+1.45,此時-1.5+1.45=-0.05,判斷爲不是蘋果。可是若是跟第三個條件結合的話,-1.5+1.45+0.1=0.05。就會判斷成蘋果。而對於如下這種來講
由於是圓的和紅色的因此,根據賦予的權重相加就是1.5+1.45,而對於第三個條件來講-0.1,不太怎麼會影響最後的結果。因此說這些看起來不太靠譜的分類器,他們都是經過錯誤的子集訓練出來的,在那些靠譜的分類器得不到正確結果的狀況下,須要這些不太靠譜的分類器去平衡,而那些已經獲得結論的時候它就不會太大程度的干擾結論。
咱們一般稱1,-1,0.1爲權重。把錯誤的圖片放大這個過程怎麼理解?也就是在訓練模型的時候,怎麼實現讓計算機考慮讓分錯的類別下次着重考慮?也是經過權重,那麼這兩個權重,是一個權重含義嗎?確定不是,由於第二個權重是跟着數據走的,在這個例子裏是跟着每張圖片走的,哪張圖片大,也就是當前分錯了,它權重就高一些;而第一個權重是跟着訓練出來的分類器走的。咱們把第一個叫作分類器權重,把第二個叫作數據權重。linearly Blending裏有一個α,αgi(x)或者αgt(x) 。α跟着gi(x)走,gi(x)就是分類器得出來的結果,因此它是分類器權重,一般用α來表示。而數據權重一般用un來表示。
咱們先粗略的看下adaboost的計算流程:
首先用所有數據訓練一個弱分類器g1,弱分類器就能給出一個在訓練集上,誰判斷對了,誰判斷錯了的結果,咱們利用結果修改訓練集每個數據的權重。 權重變了,訓練出來的模型也就是新的弱分類器就跟之前不同了,獲得了g2。g2又能獲得一組判斷結果,這個判斷結果又能夠看它判斷對了仍是判斷錯了,以後又能夠利用對錯的結果去修改權數據權重,而後拿到新的數據權重,訓練g3。一直循環,就達到了剛纔蘋果那個例子,拿到一堆弱分類器,可是每一個人看的是一方面,最後你們綜合討論一下,結合全部人的意見,獲得一個最終結果。這裏須要強調下這是有監督的仍是無監督的算法?答案是有監督的。由於咱們必須知道每個分類器對結果的判斷對錯,既然是判斷對錯就必定是有監督的,有了ŷ,沒有yi怎麼判斷對錯。因此在訓練集上必定已經已知了yi,纔有所謂的對錯。總結下上面的描述,首先對樣本賦予權重,賦予了權重這個值才能實現 着重看一下某些數據的這種方式,而後採用迭代的方式來構造每一步的弱分類器,最終經過弱分類器的linearly Blending(線性組合)獲得強分類器,那麼linearly Blending是G(x)= α1* g1(x)+ α2* g2(x)+……+αn* gn(x),若是用向量形式表示的話,就是[α1……αn]*[ g1(x)……gn(x)]。因此這個就代表了向量形式就是一種簡寫。它本質上就是這個東西,只不過我給它寫成這種形式了。在這爲何沒寫行向量和列向量的點乘?向量的點乘也叫向量的內積,就是把前面向量跟後邊向量對位相乘再相加,就是點乘的定義。[1,2,3]·[1,2,3],獲得的結果是1×1+2×2+3×3,這是一種寫法,它實際表明的仍是我們數學中的這些東西,因此全部線性代數它並非發明了一種新的運算,它只是把特別長的一個式子給寫成兩個方塊的形式了。
瞭解了adaboost的計算流程以後,咱們須要解決兩個問題:
一、第一是如何迭代生成若干互不相同的g(x)。咱們最終想要G(x),G(x)裏邊有兩項,全部g(x)和全部的α;
二、第二是如何得到跟每個x相配的不同凡響的α。
咱們一個一個來,先解決第一個問題。如何得到不一樣的g(x),也就是咱們的每個弱分類器。
咱們先來回顧下隨機森林的構造方式:也須要得到若干不同凡響的g(x),經過bootstrap re-sample,re-sample就是有放回的重抽樣,那麼這裏面g(x)有什麼特色? 它們是公平的,它們訓練過程當中都是公平的,只不過每人看到的數據比較少,致使它比較弱。既然它是公平的,如何利用g(x)生成G(x)?均勻投票,每人一票不偏不倚。
而Adaboost:也須要獲得若干不一樣的g(x),只是經過所有樣原本得到,再也不作bootstrap re-sample。如何讓它不同凡響?經過賦予樣本不一樣的權重,就能得到不一樣的g(x)。這個權重是數據權重,一般用un來表示,爲何帶一個n呢?說明有咱們有N條樣本,每一條樣本背後都有本身的一個權重,表明我這條數據有多重要。重要多少取決於權重到底有多大,權重越大越重要。
對於Adaboost裏面,全部boosting算法,都偏好於特別淺的層,不一樣於Bagging偏好深層。這個緣由後面咱們再具體解釋。好比GBDT通常5到6層就夠了,而Adaboost更加極端,一般使用1層。什麼叫一層或者有的也叫兩層?就是一分爲二,每個g(x)對數據就作一個一分爲二,這個訓練速度會很快。基分類器g(x)一般會使用decision-stump,stump是一個戳的概念或者樁子的概念。原來是一棵樹,如今把上面都砍掉了就成了樹樁了,它就像一個樹樁同樣,它只會一分爲二,咱們一般管它叫decision-stump。咱們經過修改數據的權重,使本次訓練的弱分類器在上次弱分類器作得很差的地方進行訓練。跟剛纔的例子是能夠對應上的,你哪些地方作得很差,我就着重考慮你沒作好的那些地方,這樣最後投票的時候纔能有所Boosting,有所提高。 爲何提高?由於每一棵樹是對上一棵樹的一個補強,而不是像原來弄出一大堆來,搞投票,它是一種補強的概念,它不能說更強,至少是把原來作的很差的地方給補上。
咱們再普及下數據的正確率ACC怎麼計算?正確的個數/總的個數,就是咱們的普通形式的正確率。那麼咱們在Adaboost裏邊引入權重正確率。什麼含義呢?數據又是怎麼一個形式?假設我有N條數據,每個數據都有一個權重記錄它的重要性,假如第一條數據認爲是0.1份的重要,第二條數據認爲0.2份的重要,一直到最後一條數據。此時的權重正確率就再也不是正確個數的總和了,而是正確樣本對應權重的總和/總權重和。這表明每條數據再也不認爲它是一樣的重要性了,而是有的數據重要,有的數據不重要。所以首先還得看每條數據是分對了仍是分錯了。excel舉例說明下:
好比如今有五條數據,第一條數據權重0.1,第二條數據權重0.1,第三條數據權重0.5,第四條數據權重0.2,第五條數據權重1。假如已經訓練出來一個分類器了,而且獲得預測結果與真實結果的正確關係。此時它的權重正確率應該是(0.1+0.5+0.2)/(0.1+1)= 0.421,普通正確率是:正確的個數有3個,所有的個數5個,爲0.6,所謂正確率ACC就是這麼定義的,正確個數除以總個數。在沒有數據權重的時候,一般都是追求正確率高,而加上數據權重了,咱們此時去追求權重正確率高。假設決策樁(就是兩層的決策樹)就簡單粗暴地以結果論英雄,我找到一個分裂條件,把數據就分紅了兩份,強制左邊是+1,右邊是-1,左邊是正,右邊是負。此時我遍歷的條件再也不是基尼係數了,再也不是信息熵了,而是就看結果,誰的權重正確率最大,我就保留那種分裂條件。若是是這麼一個機制的話,它會傾向於儘可能把第五條樣本數據判斷對。由於第五條樣本權重最高,一旦把它判斷對了,根據權重正確率的計算方式,此時結果更容易得到高的權重正確率。
因此若是說要追求的是正確率最高,權重就沒有用了,而若是我這棵樹追求的是怎麼分了以後權重正確率最高,它就會去嘗試第一種分法權重正確率多少,第二種分法權重正確率是多少,當它忽然嘗試到某一種分法權重正確率特別高的時候,它就把此時分裂條件保留下來了。此時能保留下來的分裂條件更容易的把高權重的數據分隊,由於只有高權重分對了,權重正確率纔會相對容易高,不能說它絕對高。這樣就叫作讓計算機着重的去考慮高權重的數據,你給我儘可能把它分對。
權重怎麼來的?第一代的權重全是1,經過一次一次的迭代去改變的。對應蘋果的例子,上來沒有任何一張照片被放大了,直接看,此時每條數據是同等重要的。當權重全爲1的時候,權重正確率和正確率就相等了。隨着你迭代的加深,每一步樣本權重必定是一直在變的,因此它變化就不同了。迭代出來結果,有對錯,我要把對的權重下降一點,把錯的權重升高一點,下一個分類器就會着重去考慮上一個分類器沒看到的問題。
這裏難免有個問題,每次訓練完了以後,要不要把正確的都踢出去,只在錯誤的裏面從新訓練?若是這樣作的話,那就變成普通決策樹了,普通決策樹一分爲二,在子集中再去分。 這裏由於每次迭代都是全量的,改權重就夠了,不必把正確的剔出去了。注意這裏的決策樁它的分裂條件是靠權重正確率判斷的,而原來是基尼係數判斷純度。大致的規則是判斷結果爲對的要下降,判斷結果爲錯的要升高,這樣才能達到讓後一代分類器,能着重看前一代分類器分錯的這些東西,儘可能把以前錯的給分對。
而每次更改了權重都會生成一棵新的樹,這些新的樹之間彼此是什麼關係? 這些樹彼此之間看起來雖然是獨立的,並且我這些樹實際上是樁子,都是一層的小樹,如今新來一條數據的時候,也要加給每個小樹獲得一個結果,以後咱們就能夠給每個結果配上一個權重,α1* g1(x)+ α2* g2(x)+α3* g3(x)。這樣就獲得一個最終想要的G(x)。
而G(x)爲何有意義,參考剛纔講的例子,第一棵樹看到的有可能就是紅的權重正確率最高,而後經過放大了那些判斷錯的權重,第二棵樹就認爲紅的是最好的,第三棵樹會把全部綠的東西判斷爲蘋果,而後再經過某種方法算出α,最終就獲得了一個有道理的投票結果。
剛提到有兩個權重,一個權重叫α,一個權重叫un,咱們剛纔跟着數據走的權重叫數據權重,一般用un來表示;而表達每個分類器靠不靠譜的權重叫α,它是給最後預測結果去加一個權重,最後去組成G(x)用的。
α針對的是每個弱分類器,α就是跟着小樹走的,而un是跟着每條數據走的。 如今就知道它是經過某種方式計算出來的就能夠了。un跟維度不要緊,un要根據正確仍是錯誤用,因此它是整條數據的權重,它不會去成到任何一個維度上。un是用來計算權重正確率的,你只要知道這條數據是判斷對了,仍是判斷錯了,對錯是用yi和ŷ去比的,跟x並無關係。x是遍歷分裂條件的時候用的。由於咱們生成一棵樹須要遍歷全部的分裂條件,x是因,而最後對錯是果,你選了很差的x做爲分裂條件會致使錯誤的特別多。
對於同一個算法 :
一、 訓練集不一樣 ,生成的模型必定不一樣。
二、若是訓練集相同,咱們調整訓練集中數據的權重,生成的模型也必定不一樣。
這個解釋了爲何咱們經過更新這一組un(它是捆綁在每一條數據後的一個數)以後就能得到一個新的G(x),由於G(x)在訓練的過程當中,它的機制就是要讓權重正確率最高,權重變了確定G(x)也會變。
對於同一個模型:
一、輸入的數據權重不一樣, 模型預測的權重正確率也必定不一樣。
二、能夠經過調整輸入數據的權重, 讓原本還不錯的分類器的正確率達到1/2。
咱們再來看下權重錯誤率的定義:
一、數據預測的錯誤率=錯誤數據的個數/所有數據的個數。剛纔說的都是正確率,錯誤率也是同樣的。
二、數據預測的權重錯誤率=預測錯誤數據的權重和/所有數據的權重和。
舉例:有幾個樣本的實際標籤yi是{+1,+1,+1,+1,-1},訓練出來g1(x)分類器的預測結果是{+1,+1,+1,+1,+1},在全部權重都爲1/5的時候,g1(x)的權重錯誤率是多少?錯誤率是多少?由於只對了一個,因此,錯誤率是0.2。若是權重都是1,權重錯誤率也是0.2,因此不太在意權重相加到底等不等於1,我只是須要它的比例大。當-1這條樣本數據權重是1/2,其它+1樣本數據是1/8的時候權重正確率是多少?正確的權重和作分子,前四個正確了,它們的權重和就是1/2,總權重和是1,此時的權重正確率變成了0.5。既然ŷ沒變,分類器就沒變,分類器決定的實際上是ŷ,ŷ仍是ŷ,yi仍是yi,可是當你把權重改了,權重正確率就變了。實際上分類器自己g1(x)一點都沒變。所謂的把un2扔到g1(x)裏邊,這一組結果就是g1(x),算權重正確率的時候,你離不開權重,你把權重改了,一樣的g1(x)的結果,它的權重正確率也變了。
咱們再來看下Adaboost中的數據權重un變化:
一、在訓練集的每一個數據背後都標註一個權重,初始權重設爲1/N,也就是un1永遠都等於1/N,或者說永遠你們都等於1是同樣的。
二、每一輪訓練一個在當前權重下權重錯誤率最低,或者說權重正確率最高的g(x)。
三、而後迭代生成下一輪的權重。
考慮一下決策樁(decision-stump),若是下一輪數據的權重變了,訓練出來分類器內部會發生什麼改變?在剛纔例子裏,它會不會選擇別的分裂維度去分裂?有可能會,剛纔第一個是用圓和不圓分的,而改了權重以後,發現用綠和不綠分是更高的。既然如此,那咱們就要考慮應該如何改變權重了,這個權重永遠不去參與維度的運算,它只是最後用來加一加,最後算評分用的。先有兩個函數,一個叫g函數,一個叫h函數,h函數從屬於一個叫H的函數空間的。
解釋一下,什麼叫函數空間呢,就是你想象一個美好的世界裏面生活着各類各樣的函數,這些函數組成了一個函數空間,這個h是函數空間裏的一員,在這個無窮無盡的函數裏面,若是咱們能找到一個可以讓權重正確率最高的h,此時,恭喜你,你被升職了,你的名字叫作g,OK吧?雖然咱們計算的是權重正確率,但其實你們的分母部分都是同樣的,都是權重的總和,因此咱們只須要找個分子部分最大的。也就是在H這個函數空間中,找到一個h,這個h可以使最後的權重錯誤率最小(或者權重正確率最大),此時這個h咱們成爲g。咱們看下用公式怎麼表達上面的思想:
解釋下上面公式:
首先全部t的標記都表明了第幾棵樹,由於我是一輪一輪迭代的,因此t1表明第一次的樹,t2表明第二次的樹,gt表明第t次的樹,而gt+1表明gt的下一顆樹,能理解嗎?咱們gt+1是經過gt生成出來的。那麼gt有了就有了unt,咱們知道un是訓練集的前面的權重,是否是每一數據權重都會發生變化,因此迭代到t次咱們是否是就有t個un?那un有多少個呢?un有N個,N是樣本的數量,有多少個樣本就有多少個un。
[[這兩個中括號是if的意思,h是函數空間裏找的那個h,也就是你嘗試分裂的每一次樹是否是就是一個h,它是一個候選人的概念,yn是數據真實的yn,也就是真實的標籤,第n條數據的label。hxn是你扔給他以後它判斷出來的結果。而後這個東西真實的標籤不等於預測出來的標籤的時候,這一項等於1不然就等於0,再經過加和它其實是把全部錯誤的權重加了一遍和,由於不等於的時候是錯誤的時候,不等於的時候返回1,這裏面它總共有n項加和,其中全部錯誤的項存活下來,正確的項由於這一項會返回零,就死掉了,因此最終這一項是全部錯誤的權重的和。咱們要找的h是可以讓錯誤權重和最小的那個h,也就是 正確權重和最大的那個h,因此咱們找到了他就獲得了gt,能理解嗎?其實這個東西我解釋了這麼半天它就解釋了一句話,就是當前輪的樹訓練的結果就是可以在當前的這個狀況下表現權重錯誤率最小的那棵樹。gt是可以讓t輪的權重錯誤率最小的樹,那gt+1天然就想讓t+1輪的權重錯誤率最小的樹。
那咱們思考一下,我如今待求的是什麼?我但願它達到一個什麼標準?也就是說你但願這個新的數據權重是什麼樣的呢?但願它扔在原來的弱分類器裏錯誤率最小仍是最大?思考一下這個問題,你想用新的權重訓練出一個新的分類器來,這個新的分類器要作到原來的分類器作不到的地方,因此咱們但願這個新的權重帶入到原來的分類器裏面是原來的弱分類器表現最差的權重,這樣你用它表現的最弱的地方你才能訓練出來一個補償原來的弱分類器作不到的地方,可以理解個人意思嗎?就至關於如今給你一副數據鏈讓你作,你的了80分,對嗎?接下來,你要作的是我就想針對你不會的那些題特訓,你應該出一份什麼卷子讓他去學習,你應該出一份他先作只能作0分的卷子讓他去學習,是否是纔對他的提高是最大的?這個也是同樣,你原來的弱分類器是在這個unt這輪表現得還不錯了,那接下來我是否是要找一些你原來表現得很差的地方來着重訓練才能訓練出一個新的訓練器,因此說新的權重應該是可以讓原來的分類器在它上面測試是表現最差的,這個權重才能去補強下一個分類器,讓下一個分類器具有這個分類器作不到的地方。
咱們再捋一遍,我如今想訓練新的分類器,新的分類器要有一個什麼功能呢?要有一箇舊的分類器作到很差的地方我要額外的好,我要補強你,對以前有所提高,那麼如何讓它有所提高呢?你就得訓練新分類器的時候,將新分類器的權重帶入到老分類器裏面,而且是老分類器它作不到的地方進行訓練,那怎麼叫它作不到的呢,就是權重錯誤率最高就叫它作不到的地方,我不關注你作得好的地方,只關注作的最很差的地方。我最終要全部人一塊兒投票,全部就是我不須要你作得好我也作得好,你作得差的我作好就好了,到時候投票的地方,你作得好的地方你負責說,你作的很差的地方我負責說,最後你們綜合起來,獲得結果,能明白嗎?由於從一開始將那個蘋果的例子就是讓你們看你在錯誤的例子裏面你怎麼找到一個新的結果,可以理解嗎?你提高的不是,一代比一代強,你提高的是最終的Gx。它是被提高的對象,經過什麼提高,經過對不停的加進來原來作不到的地方他能作的好的分類器,好與很差是相對於每輪權重來講的,它是在這一輪權重上表現的好,並非說他整體的好,我更新了權重也是想把他以前作的差的那些地方給補強了,讓下一個分類器可以去重視。
因此我首先有了unt,我搞出來了一個gt,如今最終我想要的是gt+1,那怎麼來呢?須要一個unt+1,那麼gt+1跟gt有什麼關係呢?就是但願gt+1在gt表現得很差的地方他能表現得好,gt+1不是設計出來的,而是訓練出來的,你gt+1但願gt表現得很差的地方表現得好,那好,你就構建一個訓練集,專門讓gt表現得很差,可以理解嗎?由於只要改變了這一組權重就會影響它的表現,對吧?我專門構建一個訓練集讓它表現得最很差,這個至關於對他特製的訓練集就可以訓練出來一個專門補強gt的訓練器。
這個看完了你們大部分都繞過來了,那如何叫作gt在unt+1上表現得最很差呢?它的權重正確率和錯誤率應該等於多少?有人會說正確率爲0是最很差的時候,其實正確率爲0並非最很差的,正確率若是爲0了,你的模型反着用就是一個正確率百分之百的一個模型,那麼最很差的分類模型永遠是和瞎猜同樣,這個叫最很差的模型,不會有任何規律可言,因此把舊的gt扔到新的unt+1上可以獲得2/1的權重錯誤率,此時的unt+1就是咱們要找的那個unt+1。由於錯誤率爲1/2,就至關於瞎蒙同樣。你以前的un甭管讓gt獲得一個什麼樣的權重正確率,無所謂。我們不要驕傲自滿,你0.99了咱們也不在意,我就專門出一個刁難你用的權重用它去訓練下一個分類器,只有這樣下一個分類器才能作到以前作不到的地方的補強,最終把他們聚合到一塊兒的時候纔會有各類各樣不一樣的角度來看這個東西,因此如何獲得下一輪的unt+1呢,我只須要讓前一輪的錯誤率g(t)爲2/1。
接下來咱們進行一些恆等推導,所謂恆等推導,就是拿等號左乘右乘導出來的一個結論。好比ax=3,x=3/a。
咱們但願的是unt+1的全部權重在gt上的表現,使得gt的權重正確率是1/2,怎麼能作到1/2,也就是錯誤的權重之和除以(錯誤的加上+正確的權重之和)爲1/2。
咱們但願 錯誤的總權重和/總權重和=1/2,其中橙色方塊表明錯誤的總權重和,綠色圓圈表明正確的總權重和,綠色錯誤權重和指的是t+1輪的權重扔到t輪的分類器gt裏的錯誤權重和。橙色指的是t+1輪的權重扔到t輪的分類器gt裏面的正確權重和。咱們但願t+1輪權重在g(t)上的錯誤權重和 = t+1輪在g(t)的權重的正確權重和。也就是全部的un (t+1)的incorrect等於un (t+1)的correct,即unt+1的總錯誤和等於總正確和的時候,權重錯誤率結果爲1/2。即:
假設上一輪錯誤權重和是1126,正確權重和是6211,
我但願它倆能相等,就把上一輪的1126乘以上一輪的6211,6211乘以1126,它們倆就必定會相等,但這樣越乘越大了,比較討厭,我再除以一個7337,7337是什麼?上一代的總權重和。因此相等的兩端如今變成了(1126*6211)/7337=(6211*1126)/7337,這是一個恆等式。咱們換個角度看這個公式,1126/7337是上一代的錯誤權重率,6211/7337是上一代的正確權重率。
對於左半部分(1126*6211)/7337能夠當作是1126*(6211/7337)。而1126是全部的錯誤權重總和,6211/7337是正確權重率。這是一個加法分配率(a+b)*c=a*c+b*c。因此只要我讓每一條數據,凡是你判斷對了的乘以錯誤權重率,凡是你判斷錯誤了的乘以正確權重率,即:
€t是t輪的權重錯誤率,1-€t是權重正確率。咱們把全部正確的乘以€t;全部錯誤的乘以(1-€t),就能達到1/2的效果了。因此接下來咱們的思路給你們捋一下,首先我有un了,我想算unt+1,接下來我要作的就是把從un訓練出來的gt用到unt+1上,讓它的表現是正確總權重等於錯誤總權重,怎麼讓正確總權重等於錯誤總權重呢?就是正確的總權重X錯誤率就等於原來的錯誤總權重X正確率,這樣就相等了,那如今是對和的操縱,咱們手裏拿到的是一個一個的數據,那我怎麼作這個數據呢?我就是讓原來的正確的通通每個都乘錯誤率,由於是有一個加法分配律,原來每個錯誤都都X正確率,這樣我是否是就獲得了新一代的每個權重也就是un(t+1)。
而後你再宏觀的看一下,通常是錯誤率高仍是正確率高?確定是正確率高,對吧?因此原來正確的都乘以一個比較小的數,原來錯誤的也乘以一個數,也變小了,你們通通都變小,正確的變得多,錯誤的變得少。而不是咱們想要的錯誤的加大,正確的變小,因此咱們加了一個規劃因子,咱們通通讓正確的除以這個東西,錯誤的乘以這個東西,就可以達到咱們想要的結果。爲何要這麼作呢,咱們推導下:
假設A爲正確的總權重和,B爲錯誤的總權重和,€是權重錯誤率,1-€是權重正確率。有A*€=B*(1-€),那麼總權重和就是錯誤的權重和除以錯誤權重率,或者正確的權重和除以正確權重率,設總權重和C,則C=A/(1-€)= B/€。對於A*€=B*(1-€)這個式子裏,都各乘一個C,則A*€*A/(1-€) = B*(1-€)*B/€。整理一下,是A*A*€/(1-€)= B*B*(1-€)/€。€/(1-€)和(1-€)/€是倒數關係,把兩邊開根號,就是A*sqrt(€/(1-€))= B* sqrt ((1-€)/€)。總結下上面公式推導以下:
(1-€)/€這一項,就是這裏面的規範因子◆t,這裏是錯誤的乘以根號下◆t ,若是正確乘以◆t的倒數,也就是除以◆t。即下面操做:
只要對un進行了這種操做,全部預測對的除◆t;全部預測錯的乘◆t,咱們就獲得了unt+1,此時的unt+1就是把它扔進gt裏,可以使gt獲得權重正確率爲1/2的那一組unt+1。
sqrt((1-€)/€),它是大於一的數仍是小於一的數?一般是權重正確率高,€是錯誤率,分母是一個比較小的數,分子是一個比較大的數,結果是一個大於一的數。最後獲得一個結果是:錯誤的乘以大於1的數,而正確的除以大於1的數,最後結果是錯誤的權重提高了,正確的權重減少了,而此刻還達到了1/2。 完美!!!
因此目前的總體流程是根據數據un1訓練出來一個g1(x),而後根據g1(x)判斷是否正確,有了g1(x)就有€t1,€t1就是un1在g1(x)上的表現。un2就是un1裏邊全部正確的除以◆t,全部錯誤的乘以◆t,就獲得了un2,而後咱們去計算g2(x)。有了g2(x)跟un2,咱們就有€t2,就是un2在g2(x)上面的表現。就能夠往復迭代下去了。那咱們還差每一個g上的α,g裏面€t越低,α越大合適,€t越小就表明這個東西表現的還不錯,要給它一個比較高的權重。
α怎麼求呢,很是簡單,α=ln ◆t,◆t=√((1-€)/€)。其實是根據損失函數推出來的,α=ln ◆t確定是一個大於0的正數,一般大於一,萬一小於一會產生什麼問題?ln的點,當x<1的時候就獲得了負數。也就是說對於◆t<1的這麼特別差的一個分類器,它算出來的α<0,表明它投的是負票。也不矛盾,它計算的正確率都已經不到0.5了,咱們天然須要讓它去投負票。咱們能夠看ln曲線的變化,
隨着的◆t增大,也不會變大的特別快,也就是說你表現的是90份給你打的權重多是1.2,你打了99分可能給你的權重是1.8變化的也不會特別多,因此加這麼一個ln表現的不會這麼明顯,咱們既要經過限制數的深度防止獨裁也要經過限制α的設計上防止有些分類器的權重太高了致使的問題。這也正是爲何須要Ln的緣由。
假設是一個徹底長成的樹,也就是徹底分對的樹,它的優缺點各是什麼?
優勢:若是是徹底長成的樹€t會等於0,分的徹底正確,此時的αt= ln ◆t=ln√((1-€)/€),當€=0的時候,αt等於正無窮,就產生了autocracy這個問題,獨裁。容易致使一個問題---過擬合,這是個致命的缺點,一切運算效率上的缺點均可以忍受,但忍受不了的是這個模型過擬合一旦嚴重了就無法用了。假設α1的€=0,此時的G(x)中α1就是正無窮了,其它的沒有意義了。最後G(x)等於多少就看g1等於多少了,此時的Adaboost就退化成一個徹底長成的決策樹了,就必定會帶來過擬合的問題。別人再怎麼加也幹不過它。此時G(x)≈g1(x)。因此徹底長成的樹不能用。
若是不是用徹底長成的樹,樹的層次稍微深一點的話,準確率高一點又會有什麼狀況呢?假如這棵樹能準確率能到95%,此時的€很小,當€t特別小的時候,((1-€)/€)會變得特別大,權重也會變化特別大。它必定程度上能緩解過擬合的問題,不會讓g1(x)獨裁,可是很大的話,這個弱分類器的權重也會相對很大,因此雖然不會獨裁,可是也不是咱們所須要的。
因此咱們在這裏面傾向於最淺的樹,也就是說傾向於pruned Dtree,被剪枝過的Dtree。通常只須要兩層,咱們稱爲決策樁(decision-stump),爲何須要決策樁呢,決策樹不行嗎?咱們解剖下緣由:
decision-stump是一個一分爲二的決策樹,它能夠以權重正確率論英雄,去遍歷全部的分裂節點,看哪一種分出來以後權重正確率最高。咱們思考一個問題,以前講的決策樹爲何不直接以ACC做爲分裂結果,而要以純度呢?傳統決策樹雖然沒有權重,總能夠用ACC,至少二分類的時候的正確率更高,爲何每次分裂不去分一個ACC更高的值呢?而是要用純度這種間接的方式來判斷哪一種分裂條件好仍是很差?由於在只有一層的狀況下,能夠分爲左邊是正例,右邊是負例。但有多層的狀況下,你能左邊是正例,右邊是負例嗎?它並不必定能分好,強制的讓它把正例都分左邊,負例都分右邊,不如每一步都讓它去把純度搞純,最後再作投票,該是正例就是正例,該是負例就是負例,它若是隻是一分爲二,你能夠簡單說左邊是1右邊-1,由於有多層了,因此就不能直接用正確率強制的分左右,不然分出來決策樹必定是表示正例的葉子節點,跟表示負例的葉子節點的數量是相同的,這樣有可能並非最好的結果。而是每個葉子節點你都儘可能把它分純,讓它越分越純,雖然最後可能只有個別幾個葉子節點表示負例,但仍然是能找到的最好的分類的方式。
假如Adaboost硬要使用一個不止兩層的決策樹做爲弱分類器,它的權重應該如何用起來呢?對比決策樁的權重,直接拿過來算權重正確率,而後找分裂條件,而決策樹不能這麼幹,那數據權重應該怎麼用起來? 實際上經過按比例抽樣的方式,這個權重不能直接丟到算法裏去,對於decision-stump它能認識權重,可是對於decision-tree它不認識這個權重。因而就又要在訓練集上作文章了,按照數據的權重的比例去抽樣,好比樣本集的權重分別是1,2,未來數據裏就有1份第一條數據,2份第二條數據。從新構建一個符合數據權重比例的數據集,雖然決策樹不認識這個權重,可是在構造訓練集的時候已經把它按比例構造好了,它就能夠認識權重了。經過這種間接的方式,至關於你的模型、算法是個黑盒,它認識不了權重,改一改數據集,讓它在不須要認識權重的狀況下,把權重的信息直接體如今數據集裏面去,訓練一棵decision-tree。但這樣更麻煩,因此大部分時間就直接使用單層的決策樹,也就是決策樁。咱們會手動的限制讓咱們的每個分類器儘可能弱一點,怎麼讓它弱,對於決策樹來講就須要將樹的高度給限制掉,讓它儘可能的別本身分的太好,讓它的正確率是0.6左右就能夠了,還有兄弟姐妹們互相補強,這就是爲何要使用弱一些的樹的緣由。
一、初始化權重un1。un1是一組數,它的數量等於樣本的數量。
二、開始迭代。
2.1 有un1能夠理解爲有第一個unt,根據unt訓練gt。
2.2 gt根據在unt數據上的結果計算◆t
2.3 根據◆t能夠算unt+1 。全部這個數據集上一代被判斷錯了的,都乘以◆t;上一代爲判斷對了的都除以◆t,就獲得了下一代的u。
2.4 根據◆t能夠算αt,就是ln◆t,這種迭代方式是在一次循環中同時產生兩個迭代結果,和咱們講的L-BFGS相似,L-BFGS在迭代xk+1的時候,也要迭代一個dk+1出來,也是在同一輪循環中要得出兩個結果,咱們管這種迭代方式叫on the fly迭代。
三、迭代完成後,獲得一組g(x),返回G(x)。
舉例驗證下一輪權重與上一輪權重的關係:
根據gt判斷樣本的正確性,判斷對了gt就是0,判斷錯了gt就是1,此時的權重偏差率是€=0.25,◆t是√3,α1是ln√3,此時咱們就能夠算出u2來了。把u2這組權重扔到g1裏面去,此時的€=0.5,由於判斷出來的結果是對對錯對,因此根據u2計算出來的權重正確率是1/2。此時u2不是生湊的,而是確實有的乘以了◆t,有的除以了◆t,全部判斷對的都除以了◆t,全部判斷錯的都乘以了◆t,最後結果等於了0.5。
1. 把弱聚合強
2. 每次生成新的權重時放大一次錯的, 縮小上一次對的。
3. 把獲得的g(x) 線性組合獲得G(x)。
Adaboost的優點是快,它比隨機森林快好多,它雖然不能並行處理,但它只須要10,20顆樹就夠了。 90棵樹和40棵樹,差異已經不是很大了。
Adaboost的最先的應用,一炮成名是一我的臉識別的應用,在第一款數碼相機上面能顯示一個小框,識別出人臉的時候,背後算法就Adaboost。它是在Adaboost提出論文以後,第二年年末出來的產品,是當時的學術界向產業輸出算至關快的。
爲何能在當時實現這個功能,當時其實早就能夠經過神經網絡來實現人臉識別了,可是數碼相機的cpu根本就跑不起來,而Adaboost提供了一種輕量化的解決方案,它也能作到二分類,是人臉仍是不是人臉。在這個算法底層還有好多計算機視覺方面作法,它要把圖像分紅多少個方塊,怎麼分最合理。
最後它判斷每一張小方塊圖究竟是不是人臉,經過Adaboost訓練好的模型直接在裏面去判斷,模型是直接內嵌在固件裏面,不須要你拿你的數碼相機去訓練模型,廠商訓練好了模型,把這一組數的分裂條件存到了固件裏面,而後它拿過來直接就跑這十個樹,最後一投票結果究竟是人臉仍是不是人臉就出來了,它就會判斷這我的臉到底在哪。這個是Adaboost最先成名的,它最先能在客戶端實現可以達到人臉識別效果的這麼一個算法。