-
當前位置:首頁 > 創(chuàng)意學(xué)院 > 技術(shù) > 專題列表 > 正文
boosting算法(boosting算法和bagging算法的區(qū)別)
大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關(guān)于boosting算法的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。
開始之前先推薦一個非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計劃、工作報告、論文、代碼、作文、做題和對話答疑等等
只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準,寫出的就越詳細,有微信小程序端、在線網(wǎng)頁版、PC客戶端
官網(wǎng):https://ai.de1919.com。
創(chuàng)意嶺作為行業(yè)內(nèi)優(yōu)秀的企業(yè),服務(wù)客戶遍布全球各地,如需了解SEO相關(guān)業(yè)務(wù)請撥打電話175-8598-2043,或添加微信:1454722008
本文目錄:
一、Bagging與Boosting最大的不同在哪里?它們對模型性能最大的貢獻在哪里?
兩種不同的集成算法,Bagging采用重復(fù)取樣:boostrap 每個個體分類器所采用的訓(xùn)練樣本都是從訓(xùn)練集中按等概率抽取的,因此Bagging的各子網(wǎng)能夠很好的覆蓋訓(xùn)練樣本空間,從而有著良好的穩(wěn)定性。
而Boosting注重分類錯誤的樣本,將個體子網(wǎng)分類錯誤的訓(xùn)練樣本的權(quán)重提高,降低分類錯誤的樣本權(quán)重,并依據(jù)修改后的樣本權(quán)重來生成新的訓(xùn)練樣本空間并用來訓(xùn)練下一個個體分類器。然而,由于Boosting算法可能會將噪聲樣本或分類邊界樣本的權(quán)重過分累積,因此Boosting很不穩(wěn)定,但其在通常情況下,其泛化能力是最理想的集成算法之一。
你得自己去查文獻,別來這問,這沒人做學(xué)術(shù)的,我也是偶爾看到你的提問。
二、機器學(xué)習(xí)一般常用的算法有哪些?
機器學(xué)習(xí)是人工智能的核心技術(shù),是學(xué)習(xí)人工智能必不可少的環(huán)節(jié)。機器學(xué)習(xí)中有很多算法,能夠解決很多以前難以企的問題,機器學(xué)習(xí)中涉及到的算法有不少,下面小編就給大家普及一下這些算法。
一、線性回歸
一般來說,線性回歸是統(tǒng)計學(xué)和機器學(xué)習(xí)中最知名和最易理解的算法之一。這一算法中我們可以用來預(yù)測建模,而預(yù)測建模主要關(guān)注最小化模型誤差或者盡可能作出最準確的預(yù)測,以可解釋性為代價。我們將借用、重用包括統(tǒng)計學(xué)在內(nèi)的很多不同領(lǐng)域的算法,并將其用于這些目的。當然我們可以使用不同的技術(shù)從數(shù)據(jù)中學(xué)習(xí)線性回歸模型,例如用于普通最小二乘法和梯度下降優(yōu)化的線性代數(shù)解。就目前而言,線性回歸已經(jīng)存在了200多年,并得到了廣泛研究。使用這種技術(shù)的一些經(jīng)驗是盡可能去除非常相似(相關(guān))的變量,并去除噪音。這是一種快速、簡單的技術(shù)。
二、Logistic 回歸
它是解決二分類問題的首選方法。Logistic 回歸與線性回歸相似,目標都是找到每個輸入變量的權(quán)重,即系數(shù)值。與線性回歸不同的是,Logistic 回歸對輸出的預(yù)測使用被稱為 logistic 函數(shù)的非線性函數(shù)進行變換。logistic 函數(shù)看起來像一個大的S,并且可以將任何值轉(zhuǎn)換到0到1的區(qū)間內(nèi)。這非常實用,因為我們可以規(guī)定logistic函數(shù)的輸出值是0和1并預(yù)測類別值。像線性回歸一樣,Logistic 回歸在刪除與輸出變量無關(guān)的屬性以及非常相似的屬性時效果更好。它是一個快速的學(xué)習(xí)模型,并且對于二分類問題非常有效。
三、線性判別分析(LDA)
在前面我們介紹的Logistic 回歸是一種分類算法,傳統(tǒng)上,它僅限于只有兩類的分類問題。而LDA的表示非常簡單直接。它由數(shù)據(jù)的統(tǒng)計屬性構(gòu)成,對每個類別進行計算。單個輸入變量的 LDA包括兩個,第一就是每個類別的平均值,第二就是所有類別的方差。而在線性判別分析,進行預(yù)測的方法是計算每個類別的判別值并對具備最大值的類別進行預(yù)測。該技術(shù)假設(shè)數(shù)據(jù)呈高斯分布,因此最好預(yù)先從數(shù)據(jù)中刪除異常值。這是處理分類預(yù)測建模問題的一種簡單而強大的方法。
四、決策樹
決策樹是預(yù)測建模機器學(xué)習(xí)的一種重要算法。決策樹模型的表示是一個二叉樹。這是算法和數(shù)據(jù)結(jié)構(gòu)中的二叉樹,沒什么特別的。每個節(jié)點代表一個單獨的輸入變量x和該變量上的一個分割點。而決策樹的葉節(jié)點包含一個用于預(yù)測的輸出變量y。通過遍歷該樹的分割點,直到到達一個葉節(jié)點并輸出該節(jié)點的類別值就可以作出預(yù)測。當然決策樹的有點就是決策樹學(xué)習(xí)速度和預(yù)測速度都很快。它們還可以解決大量問題,并且不需要對數(shù)據(jù)做特別準備。
五、樸素貝葉斯
其實樸素貝葉斯是一個簡單但是很強大的預(yù)測建模算法。而這個模型由兩種概率組成,這兩種概率都可以直接從訓(xùn)練數(shù)據(jù)中計算出來。第一種就是每個類別的概率,第二種就是給定每個 x 的值,每個類別的條件概率。一旦計算出來,概率模型可用于使用貝葉斯定理對新數(shù)據(jù)進行預(yù)測。當我們的數(shù)據(jù)是實值時,通常假設(shè)一個高斯分布,這樣我們可以簡單的估計這些概率。而樸素貝葉斯之所以是樸素的,是因為它假設(shè)每個輸入變量是獨立的。這是一個強大的假設(shè),真實的數(shù)據(jù)并非如此,但是,該技術(shù)在大量復(fù)雜問題上非常有用。所以說,樸素貝葉斯是一個十分實用的功能。
六、K近鄰算法
K近鄰算法簡稱KNN算法,KNN 算法非常簡單且有效。KNN的模型表示是整個訓(xùn)練數(shù)據(jù)集。KNN算法在整個訓(xùn)練集中搜索K個最相似實例(近鄰)并匯總這K個實例的輸出變量,以預(yù)測新數(shù)據(jù)點。對于回歸問題,這可能是平均輸出變量,對于分類問題,這可能是眾數(shù)類別值。而其中的訣竅在于如何確定數(shù)據(jù)實例間的相似性。如果屬性的度量單位相同,那么最簡單的技術(shù)是使用歐幾里得距離,我們可以根據(jù)每個輸入變量之間的差值直接計算出來其數(shù)值。當然,KNN需要大量內(nèi)存或空間來存儲所有數(shù)據(jù),但是只有在需要預(yù)測時才執(zhí)行計算。我們還可以隨時更新和管理訓(xùn)練實例,以保持預(yù)測的準確性。
七、Boosting 和 AdaBoost
首先,Boosting 是一種集成技術(shù),它試圖集成一些弱分類器來創(chuàng)建一個強分類器。這通過從訓(xùn)練數(shù)據(jù)中構(gòu)建一個模型,然后創(chuàng)建第二個模型來嘗試糾正第一個模型的錯誤來完成。一直添加模型直到能夠完美預(yù)測訓(xùn)練集,或添加的模型數(shù)量已經(jīng)達到最大數(shù)量。而AdaBoost 是第一個為二分類開發(fā)的真正成功的 boosting 算法。這是理解 boosting 的最佳起點?,F(xiàn)代 boosting 方法建立在 AdaBoost 之上,最顯著的是隨機梯度提升。當然,AdaBoost 與短決策樹一起使用。在第一個決策樹創(chuàng)建之后,利用每個訓(xùn)練實例上樹的性能來衡量下一個決策樹應(yīng)該對每個訓(xùn)練實例付出多少注意力。難以預(yù)測的訓(xùn)練數(shù)據(jù)被分配更多權(quán)重,而容易預(yù)測的數(shù)據(jù)分配的權(quán)重較少。依次創(chuàng)建模型,每一個模型在訓(xùn)練實例上更新權(quán)重,影響序列中下一個決策樹的學(xué)習(xí)。在所有決策樹建立之后,對新數(shù)據(jù)進行預(yù)測,并且通過每個決策樹在訓(xùn)練數(shù)據(jù)上的精確度評估其性能。所以說,由于在糾正算法錯誤上投入了太多注意力,所以具備已刪除異常值的干凈數(shù)據(jù)十分重要。
八、學(xué)習(xí)向量量化算法(簡稱 LVQ)
學(xué)習(xí)向量量化也是機器學(xué)習(xí)其中的一個算法??赡艽蠹也恢赖氖?,K近鄰算法的一個缺點是我們需要遍歷整個訓(xùn)練數(shù)據(jù)集。學(xué)習(xí)向量量化算法(簡稱 LVQ)是一種人工神經(jīng)網(wǎng)絡(luò)算法,它允許你選擇訓(xùn)練實例的數(shù)量,并精確地學(xué)習(xí)這些實例應(yīng)該是什么樣的。而學(xué)習(xí)向量量化的表示是碼本向量的集合。這些是在開始時隨機選擇的,并逐漸調(diào)整以在學(xué)習(xí)算法的多次迭代中最好地總結(jié)訓(xùn)練數(shù)據(jù)集。在學(xué)習(xí)之后,碼本向量可用于預(yù)測。最相似的近鄰?fù)ㄟ^計算每個碼本向量和新數(shù)據(jù)實例之間的距離找到。然后返回最佳匹配單元的類別值或作為預(yù)測。如果大家重新調(diào)整數(shù)據(jù),使其具有相同的范圍,就可以獲得最佳結(jié)果。當然,如果大家發(fā)現(xiàn)KNN在大家數(shù)據(jù)集上達到很好的結(jié)果,請嘗試用LVQ減少存儲整個訓(xùn)練數(shù)據(jù)集的內(nèi)存要求
三、基于R語言的梯度推進算法介紹
基于R語言的梯度推進算法介紹
通常來說,我們可以從兩個方面來提高一個預(yù)測模型的準確性:完善特征工程(feature engineering)或是直接使用Boosting算法。通過大量數(shù)據(jù)科學(xué)競賽的試煉,我們可以發(fā)現(xiàn)人們更鐘愛于Boosting算法,這是因為和其他方法相比,它在產(chǎn)生類似的結(jié)果時往往更加節(jié)約時間。
Boosting算法有很多種,比如梯度推進(Gradient Boosting)、XGBoost、AdaBoost、Gentle Boost等等。每一種算法都有自己不同的理論基礎(chǔ),通過對它們進行運用,算法之間細微的差別也能夠被我們所察覺。如果你是一個新手,那么太好了,從現(xiàn)在開始,你可以用大約一周的時間來了解和學(xué)習(xí)這些知識。
在本文中,筆者將會向你介紹梯度推進算法的基本概念及其復(fù)雜性,此外,文中還分享了一個關(guān)于如何在R語言中對該算法進行實現(xiàn)的例子。
快問快答每當談及Boosting算法,下列兩個概念便會頻繁的出現(xiàn):Bagging和Boosting。那么,這兩個概念是什么,它們之間究竟有什么區(qū)別呢?讓我們快速簡要地在這里解釋一下:
Bagging:對數(shù)據(jù)進行隨機抽樣、建立學(xué)習(xí)算法并且通過簡單平均來得到最終概率結(jié)論的一種方法。
Boosting:與Bagging類似,但在樣本選擇方面顯得更為聰明一些——在算法進行過程中,對難以進行分類的觀測值賦予了越來越大的權(quán)重。
我們知道你可能會在這方面產(chǎn)生疑問:什么叫做越來越大?我怎么知道我應(yīng)該給一個被錯分的觀測值額外增加多少的權(quán)重呢?請保持冷靜,我們將在接下來的章節(jié)里為你解答。
從一個簡單的例子出發(fā)假設(shè)你有一個初始的預(yù)測模型M需要進行準確度的提高,你知道這個模型目前的準確度為80%(通過任何形式度量),那么接下來你應(yīng)該怎么做呢?
有一個方法是,我們可以通過一組新的輸入變量來構(gòu)建一個全新的模型,然后對它們進行集成學(xué)習(xí)。但是,筆者在此要提出一個更簡單的建議,如下所示:
Y = M(x) + error
如果我們能夠觀測到誤差項并非白噪聲,而是與我們的模型輸出(Y)有著相同的相關(guān)性,那么我們?yōu)槭裁床煌ㄟ^這個誤差項來對模型的準確度進行提升呢?比方說:
error = G(x) + error2
或許,你會發(fā)現(xiàn)模型的準確率提高到了一個更高的數(shù)字,比如84%。那么下一步讓我們對error2進行回歸。
error2 = H(x) + error3
然后我們將上述式子組合起來:
Y = M(x) + G(x) + H(x) + error3
這樣的結(jié)果可能會讓模型的準確度更進一步,超過84%。如果我們能像這樣為三個學(xué)習(xí)算法找到一個最佳權(quán)重分配,
Y = alpha * M(x) + beta * G(x) + gamma * H(x) + error4
那么,我們可能就構(gòu)建了一個更好的模型。
上面所述的便是Boosting算法的一個基本原則,當我初次接觸到這一理論時,我的腦海中很快地冒出了這兩個小問題:
1.我們?nèi)绾闻袛嗷貧w/分類方程中的誤差項是不是白噪聲?如果無法判斷,我們怎么能用這種算法呢?
2.如果這種算法真的這么強大,我們是不是可以做到接近100%的模型準確度?
接下來,我們將會對這些問題進行解答,但是需要明確的是,Boosting算法的目標對象通常都是一些弱算法,而這些弱算法都不具備只保留白噪聲的能力;其次,Boosting有可能導(dǎo)致過度擬合,所以我們必須在合適的點上停止這個算法。
試著想象一個分類問題請看下圖:
從最左側(cè)的圖開始看,那條垂直的線表示我們運用算法所構(gòu)建的分類器,可以發(fā)現(xiàn)在這幅圖中有3/10的觀測值的分類情況是錯誤的。接著,我們給予那三個被誤分的“+”型的觀測值更高的權(quán)重,使得它們在構(gòu)建分類器時的地位非常重要。這樣一來,垂直線就直接移動到了接近圖形右邊界的位置。反復(fù)這樣的過程之后,我們在通過合適的權(quán)重組合將所有的模型進行合并。
算法的理論基礎(chǔ)我們該如何分配觀測值的權(quán)重呢?
通常來說,我們從一個均勻分布假設(shè)出發(fā),我們把它稱為D1,在這里,n個觀測值分別被分配了1/n的權(quán)重。
步驟1:假設(shè)一個α(t);
步驟2:得到弱分類器h(t);
步驟3:更新總體分布,
其中,
步驟4:再次運用新的總體分布去得到下一個分類器;
覺得步驟3中的數(shù)學(xué)很可怕嗎?讓我們來一起擊破這種恐懼。首先,我們簡單看一下指數(shù)里的參數(shù),α表示一種學(xué)習(xí)率,y是實際的回應(yīng)值(+1或-1),而h(x)則是分類器所預(yù)測的類別。簡單來說,如果分類器預(yù)測錯了,這個指數(shù)的冪就變成了1 *α, 反之則是-1*α。也就是說,如果某觀測值在上一次預(yù)測中被預(yù)測錯誤,那么它對應(yīng)的權(quán)重可能會增加。那么,接下來該做什么呢?
步驟5:不斷重復(fù)步驟1-步驟4,直到無法發(fā)現(xiàn)任何可以改進的地方;
步驟6:對所有在上面步驟中出現(xiàn)過的分類器或是學(xué)習(xí)算法進行加權(quán)平均,權(quán)重如下所示:
案例練習(xí)
最近我參加了由Analytics Vidhya組織的在線hackathon活動。為了使變量變換變得容易,在complete_data中我們合并了測試集與訓(xùn)練集中的所有數(shù)據(jù)。我們將數(shù)據(jù)導(dǎo)入,并且進行抽樣和分類。
library(caret)rm(list=ls())setwd("C:Usersts93856DesktopAV")library(Metrics)complete <- read.csv("complete_data.csv", stringsAsFactors = TRUE)train <- complete[complete$Train == 1,]score <- complete[complete$Train != 1,]set.seed(999)ind <- sample(2, nrow(train), replace=T, prob=c(0.60,0.40))trainData<-train[ind==1,]testData <- train[ind==2,]set.seed(999)ind1 <- sample(2, nrow(testData), replace=T, prob=c(0.50,0.50))trainData_ens1<-testData[ind1==1,]testData_ens1 <- testData[ind1==2,]table(testData_ens1$Disbursed)[2]/nrow(testData_ens1)#Response Rate of 9.052%
接下來,就是構(gòu)建一個梯度推進模型(Gradient Boosting Model)所要做的:
fitControl <- trainControl(method = "repeatedcv", number = 4, repeats = 4)trainData$outcome1 <- ifelse(trainData$Disbursed == 1, "Yes","No")set.seed(33)gbmFit1 <- train(as.factor(outcome1) ~ ., data = trainData[,-26], method = "gbm", trControl = fitControl,verbose = FALSE)gbm_dev <- predict(gbmFit1, trainData,type= "prob")[,2]gbm_ITV1 <- predict(gbmFit1, trainData_ens1,type= "prob")[,2]gbm_ITV2 <- predict(gbmFit1, testData_ens1,type= "prob")[,2]auc(trainData$Disbursed,gbm_dev)auc(trainData_ens1$Disbursed,gbm_ITV1)auc(testData_ens1$Disbursed,gbm_ITV2)
在上述案例中,運行代碼后所看到的所有AUC值將會非常接近0.84。我們隨時歡迎你對這段代碼進行進一步的完善。在這個領(lǐng)域,梯度推進模型(GBM)是最為廣泛運用的方法,在未來的文章里,我們可能會對GXBoost等一些更加快捷的Boosting算法進行介紹。
結(jié)束語筆者曾不止一次見識過Boosting算法的迅捷與高效,在Kaggle或是其他平臺的競賽中,它的得分能力從未令人失望,當然了,也許這要取決于你能夠把特征工程(feature engineering)做得多好了。
以上是小編為大家分享的關(guān)于基于R語言的梯度推進算法介紹的相關(guān)內(nèi)容,更多信息可以關(guān)注環(huán)球青藤分享更多干貨
四、GBDT —— 梯度提升決策樹
GBDT(Gradient Boosting Decision Tree) 又叫 MART(Multiple Additive Regression Tree),是一種迭代的決策樹算法,該算法由多棵決策樹組成,所有樹的結(jié)論累加起來做最終答案。它在被提出之初就和SVM一起被認為是泛化能力較強的算法。
GBDT中的樹是回歸樹(不是分類樹),GBDT用來做回歸預(yù)測,調(diào)整后也可以用于分類。
GBDT主要由三個概念組成:Regression Decistion Tree(即DT),Gradient Boosting(即GB),Shrinkage (算法的一個重要演進分枝,目前大部分源碼都按該版本實現(xiàn))。搞定這三個概念后就能明白GBDT是如何工作的。
提起決策樹(DT, Decision Tree) 絕大部分人首先想到的就是C4.5分類決策樹。但如果一開始就把GBDT中的樹想成分類樹,那就錯了。千萬不要以為GBDT是很多棵分類樹。決策樹分為兩大類,回歸樹和分類樹。前者用于預(yù)測實數(shù)值,如明天的溫度、用戶的年齡、網(wǎng)頁的相關(guān)程度;后者用于分類標簽值,如晴天/陰天/霧/雨、用戶性別、網(wǎng)頁是否是垃圾頁面。這里要強調(diào)的是,前者的結(jié)果加減是有意義的,如10歲+5歲-3歲=12歲,后者則無意義,如男+男+女=到底是男是女?GBDT的核心在于累加所有樹的結(jié)果作為最終結(jié)果,就像前面對年齡的累加(-3是加負3),而分類樹的結(jié)果顯然是沒辦法累加的,所以 GBDT中的樹都是回歸樹,不是分類樹 ,這點對理解GBDT相當重要(盡管GBDT調(diào)整后也可用于分類但不代表GBDT的樹是分類樹)。
回歸樹總體流程類似于分類樹,區(qū)別在于,回歸樹的每一個節(jié)點都會得一個預(yù)測值,以年齡為例,該預(yù)測值等于屬于這個節(jié)點的所有人年齡的平均值。分枝時窮舉每一個feature的每個閾值找最好的分割點,但衡量最好的標準不再是最大熵,而是最小化平方誤差。也就是被預(yù)測出錯的人數(shù)越多,錯的越離譜,平方誤差就越大,通過最小化平方誤差能夠找到最可靠的分枝依據(jù)。分枝直到每個葉子節(jié)點上人的年齡都唯一或者達到預(yù)設(shè)的終止條件(如葉子個數(shù)上限), 若最終葉子節(jié)點上人的年齡不唯一,則以該節(jié)點上所有人的平均年齡做為該葉子節(jié)點的預(yù)測年齡。
回歸樹算法如下圖(截圖來自《統(tǒng)計學(xué)習(xí)方法》5.5.1 CART生成):
梯度提升(Gradient boosting)是一種用于回歸、分類和排序任務(wù)的機器學(xué)習(xí)技術(shù) [1] ,屬于Boosting算法族的一部分。Boosting是一族可將弱學(xué)習(xí)器提升為強學(xué)習(xí)器的算法,屬于集成學(xué)習(xí)(ensemble learning)的范疇。Boosting方法基于這樣一種思想:對于一個復(fù)雜任務(wù)來說,將多個專家的判斷進行適當?shù)木C合所得出的判斷,要比其中任何一個專家單獨的判斷要好。通俗地說,就是“三個臭皮匠頂個諸葛亮”的道理。梯度提升同其他boosting方法一樣,通過集成(ensemble)多個弱學(xué)習(xí)器,通常是決策樹,來構(gòu)建最終的預(yù)測模型。
Boosting、bagging和stacking是集成學(xué)習(xí)的三種主要方法。不同于bagging方法,boosting方法通過分步迭代(stage-wise)的方式來構(gòu)建模型,在迭代的每一步構(gòu)建的弱學(xué)習(xí)器都是為了彌補已有模型的不足。Boosting族算法的著名代表是AdaBoost,AdaBoost算法通過給已有模型預(yù)測錯誤的樣本更高的權(quán)重,使得先前的學(xué)習(xí)器做錯的訓(xùn)練樣本在后續(xù)受到更多的關(guān)注的方式來彌補已有模型的不足。與AdaBoost算法不同,梯度提升方法在迭代的每一步構(gòu)建一個能夠沿著梯度最陡的方向降低損失(steepest-descent)的學(xué)習(xí)器來彌補已有模型的不足。經(jīng)典的AdaBoost算法只能處理采用指數(shù)損失函數(shù)的二分類學(xué)習(xí)任務(wù) [2] ,而梯度提升方法通過設(shè)置不同的可微損失函數(shù)可以處理各類學(xué)習(xí)任務(wù)(多分類、回歸、Ranking等),應(yīng)用范圍大大擴展。另一方面,AdaBoost算法對異常點(outlier)比較敏感,而梯度提升算法通過引入bagging思想、加入正則項等方法能夠有效地抵御訓(xùn)練數(shù)據(jù)中的噪音,具有更好的健壯性。這也是為什么梯度提升算法(尤其是采用決策樹作為弱學(xué)習(xí)器的GBDT算法)如此流行的原因,
提升樹是迭代多棵回歸樹來共同決策。當采用平方誤差損失函數(shù)時,每一棵回歸樹學(xué)習(xí)的是之前所有樹的結(jié)論和殘差,擬合得到一個當前的殘差回歸樹,殘差的意義如公式:殘差 = 真實值 - 預(yù)測值 。提升樹即是整個迭代過程生成的回歸樹的累加。 GBDT的核心就在于,每一棵樹學(xué)的是之前所有樹結(jié)論和的殘差,這個殘差就是一個加預(yù)測值后能得真實值的累加量。
提升樹利用 加法模型和前向分步算法 實現(xiàn)學(xué)習(xí)的優(yōu)化過程。當損失函數(shù)時平方損失和指數(shù)損失函數(shù)時,每一步的優(yōu)化很簡單,如平方損失函數(shù)學(xué)習(xí)殘差回歸樹。
提升方法其實是一個比adaboost概念更大的算法,因為adaboost可以表示為boosting的前向分布算法(Forward stagewise additive modeling)的一個特例,boosting最終可以表示為:
其中的w是權(quán)重,Φ是弱分類器(回歸器)的集合,其實就是一個加法模型(即基函數(shù)的線性組合)
前向分布算法 實際上是一個貪心的算法,也就是在每一步求解弱分類器Φ(m)和其參數(shù)w(m)的時候不去修改之前已經(jīng)求好的分類器和參數(shù):
OK,這也就是提升方法(之前向分布算法)的大致結(jié)構(gòu)了,可以看到其中存在變數(shù)的部分其實就是極小化損失函數(shù) 這關(guān)鍵的一步了,如何選擇損失函數(shù)決定了算法的最終效果(名字)……這一步你可以看出算法的“趨勢”,以后再單獨把“趨勢”拿出來說吧,因為我感覺理解算法的關(guān)鍵之一就是理解算法公式的“趨勢”
不同的損失函數(shù)和極小化損失函數(shù)方法決定了boosting的最終效果,我們現(xiàn)在來說幾個常見的boosting:
廣義上來講,所謂的Gradient Boosting 其實就是在更新的時候選擇梯度下降的方向來保證最后的結(jié)果最好,一些書上講的“殘差” 方法其實就是L2Boosting吧,因為它所定義的殘差其實就是L2Boosting的Derivative,接下來我們著重講一下弱回歸器(不知道叫啥了,自己編的)是決策樹的情況,也就是GBDT。
GBDT算法可以看成是由K棵樹組成的加法模型:
解這一優(yōu)化問題,可以用前向分布算法(forward stagewise algorithm)。因為學(xué)習(xí)的是加法模型,如果能夠從前往后,每一步只學(xué)習(xí)一個基函數(shù)及其系數(shù)(結(jié)構(gòu)),逐步逼近優(yōu)化目標函數(shù),那么就可以簡化復(fù)雜度。這一學(xué)習(xí)過程稱之為Boosting。具體地,我們從一個常量預(yù)測開始,每次學(xué)習(xí)一個新的函數(shù),過程如下:
舉個例子,參考自一篇博客, 該博客舉出的例子較直觀地展現(xiàn)出多棵決策樹線性求和過程以及殘差的意義。
還是年齡預(yù)測,簡單起見訓(xùn)練集只有4個人,A,B,C,D,他們的年齡分別是14,16,24,26。其中A、B分別是高一和高三學(xué)生;C,D分別是應(yīng)屆畢業(yè)生和工作兩年的員工。如果是用一棵傳統(tǒng)的回歸決策樹來訓(xùn)練,會得到如下圖1所示結(jié)果:
現(xiàn)在我們使用GBDT來做這件事,由于數(shù)據(jù)太少,我們限定葉子節(jié)點做多有兩個,即每棵樹都只有一個分枝,并且限定只學(xué)兩棵樹。我們會得到如下圖2所示結(jié)果:
在第一棵樹分枝和圖1一樣,由于A,B年齡較為相近,C,D年齡較為相近,他們被分為兩撥,每撥用平均年齡作為預(yù)測值。此時計算殘差 (殘差的意思就是: A的預(yù)測值 + A的殘差 = A的實際值) ,所以A的殘差就是16-15=1(注意,A的預(yù)測值是指前面所有樹累加的和,這里前面只有一棵樹所以直接是15,如果還有樹則需要都累加起來作為A的預(yù)測值)。進而得到A,B,C,D的殘差分別為-1,1,-1,1。然后我們拿殘差替代A,B,C,D的原值,到第二棵樹去學(xué)習(xí),如果我們的預(yù)測值和它們的殘差相等,則只需把第二棵樹的結(jié)論累加到第一棵樹上就能得到真實年齡了。這里的數(shù)據(jù)顯然是我可以做的,第二棵樹只有兩個值1和-1,直接分成兩個節(jié)點。此時所有人的殘差都是0,即每個人都得到了真實的預(yù)測值。
換句話說,現(xiàn)在A,B,C,D的預(yù)測值都和真實年齡一致了。Perfect!:
A: 14歲高一學(xué)生,購物較少,經(jīng)常問學(xué)長問題;預(yù)測年齡A = 15 – 1 = 14
B: 16歲高三學(xué)生;購物較少,經(jīng)常被學(xué)弟問問題;預(yù)測年齡B = 15 + 1 = 16
C: 24歲應(yīng)屆畢業(yè)生;購物較多,經(jīng)常問師兄問題;預(yù)測年齡C = 25 – 1 = 24
D: 26歲工作兩年員工;購物較多,經(jīng)常被師弟問問題;預(yù)測年齡D = 25 + 1 = 26
那么哪里體現(xiàn)了Gradient呢?其實回到第一棵樹結(jié)束時想一想,無論此時的cost function是什么,是均方差還是均差,只要它以誤差作為衡量標準,殘差向量(-1, 1, -1, 1)都是它的全局最優(yōu)方向,這就是Gradient。
講到這里我們已經(jīng)把GBDT最核心的概念、運算過程講完了!沒錯就是這么簡單。
該例子很直觀的能看到,預(yù)測值等于所有樹值得累加,如A的預(yù)測值 = 樹1左節(jié)點 值 15 + 樹2左節(jié)點 -1 = 14。
因此,給定當前模型 fm-1(x),只需要簡單的擬合當前模型的殘差?,F(xiàn)將回歸問題的提升樹算法敘述如下:
答案是過擬合。過擬合是指為了讓訓(xùn)練集精度更高,學(xué)到了很多”僅在訓(xùn)練集上成立的規(guī)律“,導(dǎo)致?lián)Q一個數(shù)據(jù)集當前規(guī)律就不適用了。其實只要允許一棵樹的葉子節(jié)點足夠多,訓(xùn)練集總是能訓(xùn)練到100%準確率的(大不了最后一個葉子上只有一個instance)。在訓(xùn)練精度和實際精度(或測試精度)之間,后者才是我們想要真正得到的。
我們發(fā)現(xiàn)圖1為了達到100%精度使用了3個feature(上網(wǎng)時長、時段、網(wǎng)購金額),其中分枝“上網(wǎng)時長>1.1h” 很顯然已經(jīng)過擬合了,這個數(shù)據(jù)集上A,B也許恰好A每天上網(wǎng)1.09h, B上網(wǎng)1.05小時,但用上網(wǎng)時間是不是>1.1小時來判斷所有人的年齡很顯然是有悖常識的;
相對來說圖2的boosting雖然用了兩棵樹 ,但其實只用了2個feature就搞定了,后一個feature是問答比例,顯然圖2的依據(jù)更靠譜。(當然,這里是LZ故意做的數(shù)據(jù),所以才能靠譜得如此狗血。實際中靠譜不靠譜總是相對的) Boosting的最大好處在于,每一步的殘差計算其實變相地增大了分錯instance的權(quán)重,而已經(jīng)分對的instance則都趨向于0。這樣后面的樹就能越來越專注那些前面被分錯的instance。就像我們做互聯(lián)網(wǎng),總是先解決60%用戶的需求湊合著,再解決35%用戶的需求,最后才關(guān)注那5%人的需求,這樣就能逐漸把產(chǎn)品做好,因為不同類型用戶需求可能完全不同,需要分別獨立分析。如果反過來做,或者剛上來就一定要做到盡善盡美,往往最終會竹籃打水一場空。
Shrinkage(縮減)的思想認為,每次走一小步逐漸逼近結(jié)果的效果,要比每次邁一大步很快逼近結(jié)果的方式更容易避免過擬合。即它不完全信任每一個棵殘差樹,它認為每棵樹只學(xué)到了真理的一小部分,累加的時候只累加一小部分,通過多學(xué)幾棵樹彌補不足。用方程來看更清晰,即
沒用Shrinkage時:(yi表示第i棵樹上y的預(yù)測值, y(1~i)表示前i棵樹y的綜合預(yù)測值)
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
即Shrinkage仍然以殘差作為學(xué)習(xí)目標,但對于殘差學(xué)習(xí)出來的結(jié)果,只累加一小部分(step 殘差)逐步逼近目標,step一般都比較小,如0.01~0.001(注意該step非gradient的step),導(dǎo)致各個樹的殘差是漸變的而不是陡變的。直覺上這也很好理解,不像直接用殘差一步修復(fù)誤差,而是只修復(fù)一點點,其實就是把大步切成了很多小步。 本質(zhì)上,Shrinkage為每棵樹設(shè)置了一個weight,累加時要乘以這個weight,但和Gradient并沒有關(guān)系 *。 這個weight就是step。就像Adaboost一樣,Shrinkage能減少過擬合發(fā)生也是經(jīng)驗證明的,目前還沒有看到從理論的證明。
該版本GBDT幾乎可用于所有回歸問題(線性/非線性),相對logistic regression僅能用于線性回歸,GBDT的適用面非常廣。亦可用于二分類問題(設(shè)定閾值,大于閾值為正例,反之為負例)。
參考資料:
http://blog.csdn.net/w28971023/article/details/8240756
http://blog.csdn.net/dark_scope/article/details/24863289
https://www.jianshu.com/p/005a4e6ac775
https://www.zybuluo.com/yxd/note/611571
以上就是關(guān)于boosting算法相關(guān)問題的回答。希望能幫到你,如有更多相關(guān)問題,您也可以聯(lián)系我們的客服進行咨詢,客服也會為您講解更多精彩的知識和內(nèi)容。
推薦閱讀:
facebook綁定賬號登錄失?。╢acebook賬戶登不上)
國內(nèi)手機使用facebook(國內(nèi)手機使用占比)