机器学习面试中常考的知识点,附代码实现(二)
決策樹
什么是決策樹1.決策樹的基本思想
其實用一下圖片能更好的理解LR模型和決策樹模型算法的根本區(qū)別,我們可以思考一下一個決策問題:是否去相親,一個女孩的母親要給這個女海介紹對象。
大家都看得很明白了吧!LR模型是一股腦兒的把所有特征塞入學習,而決策樹更像是編程語言中的if-else一樣,去做條件判斷,這就是根本性的區(qū)別。
2.“樹”的成長過程
決策樹基于“樹”結(jié)構進行決策的,這時我們就要面臨兩個問題 :
- “樹”怎么長。
- 這顆“樹”長到什么時候停。
弄懂了這兩個問題,那么這個模型就已經(jīng)建立起來了,決策樹的總體流程是“分而治之”的思想,一是自根至葉的遞歸過程,一是在每個中間節(jié)點尋找一個“劃分”屬性,相當于就是一個特征屬性了。接下來我們來逐個解決以上兩個問題。
這顆“樹”長到什么時候停
- 當前結(jié)點包含的樣本全屬于同一類別,無需劃分;例如:樣本當中都是決定去相親的,屬于同一類別,就是不管特征如何改變都不會影響結(jié)果,這種就不需要劃分了。
- 當前屬性集為空,或是所有樣本在所有屬性上取值相同,無法劃分;例如:所有的樣本特征都是一樣的,就造成無法劃分了,訓練集太單一。
- 當前結(jié)點包含的樣本集合為空,不能劃分。
3."樹"怎么長
在生活當中,我們都會碰到很多需要做出決策的地方,例如:吃飯地點、數(shù)碼產(chǎn)品購買、旅游地區(qū)等,你會發(fā)現(xiàn)在這些選擇當中都是依賴于大部分人做出的選擇,也就是跟隨大眾的選擇。其實在決策樹當中也是一樣的,當大部分的樣本都是同一類的時候,那么就已經(jīng)做出了決策。
我們可以把大眾的選擇抽象化,這就引入了一個概念就是純度,想想也是如此,大眾選擇就意味著純度越高。好,在深入一點,就涉及到一句話:信息熵越低,純度越高。我相信大家或多或少都聽說過“熵”這個概念,信息熵通俗來說就是用來度量包含的“信息量”,如果樣本的屬性都是一樣的,就會讓人覺得這包含的信息很單一,沒有差異化,相反樣本的屬性都不一樣,那么包含的信息量就很多了。
一到這里就頭疼了,因為馬上要引入信息熵的公式,其實也很簡單:
Pk表示的是:當前樣本集合D中第k類樣本所占的比例為Pk。
信息增益
廢話不多說直接上公式:
看不懂的先不管,簡單一句話就是:劃分前的信息熵--劃分后的信息熵。表示的是向純度方向邁出的“步長”。
好了,有了前面的知識,我們就可以開始“樹”的生長了。
3.1 ID3算法
解釋:在根節(jié)點處計算信息熵,然后根據(jù)屬性依次劃分并計算其節(jié)點的信息熵,用根節(jié)點信息熵--屬性節(jié)點的信息熵=信息增益,根據(jù)信息增益進行降序排列,排在前面的就是第一個劃分屬性,其后依次類推,這就得到了決策樹的形狀,也就是怎么“長”了。
如果不理解的,可以查看我分享的圖片示例,結(jié)合我說的,包你看懂:
不過,信息增益有一個問題:對可取值數(shù)目較多的屬性有所偏好,例如:考慮將“編號”作為一個屬性。為了解決這個問題,引出了另一個 算法C4.5。
3.2 C4.5
為了解決信息增益的問題,引入一個信息增益率:
其中:
屬性a的可能取值數(shù)目越多(即V越大),則IV(a)的值通常就越大。**信息增益比本質(zhì):是在信息增益的基礎之上乘上一個懲罰參數(shù)。特征個數(shù)較多時,懲罰參數(shù)較小;特征個數(shù)較少時,懲罰參數(shù)較大。不過有一個缺點:
- 缺點:信息增益率偏向取值較少的特征。
使用信息增益率:基于以上缺點,并不是直接選擇信息增益率最大的特征,而是現(xiàn)在候選特征中找出信息增益高于平均水平的特征,然后在這些特征中再選擇信息增益率最高的特征。
3.3 CART算法
數(shù)學家真實聰明,想到了另外一個表示純度的方法,叫做基尼指數(shù)(討厭的公式):
表示在樣本集合中一個隨機選中的樣本被分錯的概率。舉例來說,現(xiàn)在一個袋子里有3種顏色的球若干個,伸手進去掏出2個球,顏色不一樣的概率,這下明白了吧。Gini(D)越小,數(shù)據(jù)集D的純度越高。
舉個例子
假設現(xiàn)在有特征 “學歷”,此特征有三個特征取值:“本科”,“碩士”, “博士”,
當使用“學歷”這個特征對樣本集合D進行劃分時,劃分值分別有三個,因而有三種劃分的可能集合,劃分后的子集如下:
1.劃分點:“本科”,劃分后的子集合 :{本科},{碩士,博士}
2.劃分點:“碩士”,劃分后的子集合 :{碩士},{本科,博士}
3.劃分點:“碩士”,劃分后的子集合 :{博士},{本科,碩士}}
對于上述的每一種劃分,都可以計算出基于 劃分特征= 某個特征值 將樣本集合D劃分為兩個子集的純度:
因而對于一個具有多個取值(超過2個)的特征,需要計算以每一個取值作為劃分點,對樣本D劃分之后子集的純度Gini(D,Ai),(其中Ai 表示特征A的可能取值)
然后從所有的可能劃分的Gini(D,Ai)中找出Gini指數(shù)最小的劃分,這個劃分的劃分點,便是使用特征A對樣本集合D進行劃分的最佳劃分點。到此就可以長成一棵“大樹”了。
3.4 三種不同的決策樹
- ID3:取值多的屬性,更容易使數(shù)據(jù)更純,其信息增益更大。 訓練得到的是一棵龐大且深度淺的樹:不合理。
- C4.5:采用信息增益率替代信息增益。
- CART:以基尼系數(shù)替代熵,最小化不純度,而不是最大化信息增益。
樹形結(jié)構為什么不需要歸一化?
因為數(shù)值縮放不影響分裂點位置,對樹模型的結(jié)構不造成影響。按照特征值進行排序的,排序的順序不變,那么所屬的分支以及分裂點就不會有不同。而且,樹模型是不能進行梯度下降的,因為構建樹模型(回歸樹)尋找最優(yōu)點時是通過尋找最優(yōu)分裂點完成的,因此樹模型是階躍的,階躍點是不可導的,并且求導沒意義,也就不需要歸一化。
既然樹形結(jié)構(如決策樹、RF)不需要歸一化,那為何非樹形結(jié)構比如Adaboost、SVM、LR、Knn、KMeans之類則需要歸一化。
對于線性模型,特征值差別很大時,運用梯度下降的時候,損失等高線是橢圓形,需要進行多次迭代才能到達最優(yōu)點。但是如果進行了歸一化,那么等高線就是圓形的,促使SGD往原點迭代,從而導致需要的迭代次數(shù)較少。
分類決策樹和回歸決策樹的區(qū)別
Classification And Regression Tree(CART)是決策樹的一種,CART算法既可以用于創(chuàng)建分類樹(Classification Tree),也可以用于創(chuàng)建回歸樹(Regression Tree),兩者在建樹的過程稍有差異。
回歸樹:
CART回歸樹是假設樹為二叉樹,通過不斷將特征進行分裂。比如當前樹結(jié)點是基于第j個特征值進行分裂的,設該特征值小于s的樣本劃分為左子樹,大于s的樣本劃分為右子樹。
而CART回歸樹實質(zhì)上就是在該特征維度對樣本空間進行劃分,而這種空間劃分的優(yōu)化是一種NP難問題,因此,在決策樹模型中是使用啟發(fā)式方法解決。典型CART回歸樹產(chǎn)生的目標函數(shù)為:
因此,當我們?yōu)榱饲蠼庾顑?yōu)的切分特征j和最優(yōu)的切分點s,就轉(zhuǎn)化為求解這么一個目標函數(shù):
所以我們只要遍歷所有特征的的所有切分點,就能找到最優(yōu)的切分特征和切分點。最終得到一棵回歸樹。
參考文章:經(jīng)典算法詳解--CART分類決策樹、回歸樹和模型樹
決策樹如何剪枝
決策樹的剪枝基本策略有 預剪枝 (Pre-Pruning) 和 后剪枝 (Post-Pruning)。
- 預剪枝:其中的核心思想就是,在每一次實際對結(jié)點進行進一步劃分之前,先采用驗證集的數(shù)據(jù)來驗證如果劃分是否能提高劃分的準確性。如果不能,就把結(jié)點標記為葉結(jié)點并退出進一步劃分;如果可以就繼續(xù)遞歸生成節(jié)點。
- 后剪枝:后剪枝則是先從訓練集生成一顆完整的決策樹,然后自底向上地對非葉結(jié)點進行考察,若將該結(jié)點對應的子樹替換為葉結(jié)點能帶來泛化性能提升,則將該子樹替換為葉結(jié)點。
參考文章:決策樹及決策樹生成與剪枝
代碼實現(xiàn):
https://github.com/NLP-LOVE/ML-NLP/blob/master/Machine%20Learning/3.Desition%20Tree/DecisionTree.ipynb
隨機森林
什么是隨機森林1.Bagging思想
Bagging是bootstrap aggregating。思想就是從總體樣本當中隨機取一部分樣本進行訓練,通過多次這樣的結(jié)果,進行投票獲取平均值作為結(jié)果輸出,這就極大可能的避免了不好的樣本數(shù)據(jù),從而提高準確度。因為有些是不好的樣本,相當于噪聲,模型學入噪聲后會使準確度不高。
舉個例子:
假設有1000個樣本,如果按照以前的思維,是直接把這1000個樣本拿來訓練,但現(xiàn)在不一樣,先抽取800個樣本來進行訓練,假如噪聲點是這800個樣本以外的樣本點,就很有效的避開了。重復以上操作,提高模型輸出的平均值。
2.隨機森林
Random Forest(隨機森林)是一種基于樹模型的Bagging的優(yōu)化版本,一棵樹的生成肯定還是不如多棵樹,因此就有了隨機森林,解決決策樹泛化能力弱的特點。(可以理解成三個臭皮匠頂過諸葛亮)
而同一批數(shù)據(jù),用同樣的算法只能產(chǎn)生一棵樹,這時Bagging策略可以幫助我們產(chǎn)生不同的數(shù)據(jù)集。Bagging策略來源于bootstrap aggregation:從樣本集(假設樣本集N個數(shù)據(jù)點)中重采樣選出Nb個樣本(有放回的采樣,樣本數(shù)據(jù)點個數(shù)仍然不變?yōu)镹),在所有樣本上,對這n個樣本建立分類器(ID3C4.5CARTSVMLOGISTIC),重復以上兩步m次,獲得m個分類器,最后根據(jù)這m個分類器的投票結(jié)果,決定數(shù)據(jù)屬于哪一類。
每棵樹的按照如下規(guī)則生成:
一開始我們提到的隨機森林中的“隨機”就是指的這里的兩個隨機性。兩個隨機性的引入對隨機森林的分類性能至關重要。由于它們的引入,使得隨機森林不容易陷入過擬合,并且具有很好得抗噪能力(比如:對缺省值不敏感)。
總的來說就是隨機選擇樣本數(shù),隨機選取特征,隨機選擇分類器,建立多顆這樣的決策樹,然后通過這幾課決策樹來投票,決定數(shù)據(jù)屬于哪一類(投票機制有一票否決制、少數(shù)服從多數(shù)、加權多數(shù))
隨機森林分類效果的影響因素
- 森林中任意兩棵樹的相關性:相關性越大,錯誤率越大;
- 森林中每棵樹的分類能力:每棵樹的分類能力越強,整個森林的錯誤率越低。
減小特征選擇個數(shù)m,樹的相關性和分類能力也會相應的降低;增大m,兩者也會隨之增大。所以關鍵問題是如何選擇最優(yōu)的m(或者是范圍),這也是隨機森林唯一的一個參數(shù)。
隨機森林有什么優(yōu)缺點
優(yōu)點:
- 在當前的很多數(shù)據(jù)集上,相對其他算法有著很大的優(yōu)勢,表現(xiàn)良好。
- 它能夠處理很高維度(feature很多)的數(shù)據(jù),并且不用做特征選擇(因為特征子集是隨機選擇的)。
- 在訓練完后,它能夠給出哪些feature比較重要。
- 訓練速度快,容易做成并行化方法(訓練時樹與樹之間是相互獨立的)。
- 在訓練過程中,能夠檢測到feature間的互相影響。
- 對于不平衡的數(shù)據(jù)集來說,它可以平衡誤差。
- 如果有很大一部分的特征遺失,仍可以維持準確度。
缺點:
- 隨機森林已經(jīng)被證明在某些噪音較大的分類或回歸問題上會過擬合。
- 對于有不同取值的屬性的數(shù)據(jù),取值劃分較多的屬性會對隨機森林產(chǎn)生更大的影響,所以隨機森林在這種數(shù)據(jù)上產(chǎn)出的屬性權值是不可信的。
隨機森林如何處理缺失值?
根據(jù)隨機森林創(chuàng)建和訓練的特點,隨機森林對缺失值的處理還是比較特殊的。
- 首先,給缺失值預設一些估計值,比如數(shù)值型特征,選擇其余數(shù)據(jù)的中位數(shù)或眾數(shù)作為當前的估計值
- 然后,根據(jù)估計的數(shù)值,建立隨機森林,把所有的數(shù)據(jù)放進隨機森林里面跑一遍。記錄每一組數(shù)據(jù)在決策樹中一步一步分類的路徑.
- 判斷哪組數(shù)據(jù)和缺失數(shù)據(jù)路徑最相似,引入一個相似度矩陣,來記錄數(shù)據(jù)之間的相似度,比如有N組數(shù)據(jù),相似度矩陣大小就是N*N
- 如果缺失值是類別變量,通過權重投票得到新估計值,如果是數(shù)值型變量,通過加權平均得到新的估計值,如此迭代,直到得到穩(wěn)定的估計值。
其實,該缺失值填補過程類似于推薦系統(tǒng)中采用協(xié)同過濾進行評分預測,先計算缺失特征與其他特征的相似度,再加權得到缺失值的估計,而隨機森林中計算相似度的方法(數(shù)據(jù)在決策樹中一步一步分類的路徑)乃其獨特之處。
什么是OOB?隨機森林中OOB是如何計算的,它有什么優(yōu)缺點?
OOB:
上面我們提到,構建隨機森林的關鍵問題就是如何選擇最優(yōu)的m,要解決這個問題主要依據(jù)計算袋外錯誤率oob error(out-of-bag error)。
bagging方法中Bootstrap每次約有1/3的樣本不會出現(xiàn)在Bootstrap所采集的樣本集合中,當然也就沒有參加決策樹的建立,把這1/3的數(shù)據(jù)稱為袋外數(shù)據(jù)oob(out of bag),它可以用于取代測試集誤差估計方法。
袋外數(shù)據(jù)(oob)誤差的計算方法如下:
- 對于已經(jīng)生成的隨機森林,用袋外數(shù)據(jù)測試其性能,假設袋外數(shù)據(jù)總數(shù)為O,用這O個袋外數(shù)據(jù)作為輸入,帶進之前已經(jīng)生成的隨機森林分類器,分類器會給出O個數(shù)據(jù)相應的分類
- 因為這O條數(shù)據(jù)的類型是已知的,則用正確的分類與隨機森林分類器的結(jié)果進行比較,統(tǒng)計隨機森林分類器分類錯誤的數(shù)目,設為X,則袋外數(shù)據(jù)誤差大小=X/O
優(yōu)缺點:
這已經(jīng)經(jīng)過證明是無偏估計的,所以在隨機森林算法中不需要再進行交叉驗證或者單獨的測試集來獲取測試集誤差的無偏估計。
隨機森林的過擬合問題你已經(jīng)建了一個有10000棵樹的隨機森林模型。在得到0.00的訓練誤差后,你非常高興。但是,驗證錯誤是34.23。到底是怎么回事?你還沒有訓練好你的模型嗎?
答:該模型過度擬合,因此,為了避免這些情況,我們要用交叉驗證來調(diào)整樹的數(shù)量。
7.代碼實現(xiàn):
https://github.com/NLP-LOVE/ML-NLP/blob/master/Machine%20Learning/3.1%20Random%20Forest/RandomForestRegression.ipynb
梯度提升決策樹(GBDT)
解釋一下GBDT算法的過程
GBDT(Gradient Boosting Decision Tree),全名叫梯度提升決策樹,使用的是Boosting的思想。
1.Boosting思想
Boosting方法訓練基分類器時采用串行的方式,各個基分類器之間有依賴。它的基本思路是將基分類器層層疊加,每一層在訓練的時候,對前一層基分類器分錯的樣本,給予更高的權重。測試時,根據(jù)各層分類器的結(jié)果的加權得到最終結(jié)果。
Bagging與Boosting的串行訓練方式不同,Bagging方法在訓練過程中,各基分類器之間無強依賴,可以進行并行訓練。
2.GBDT原來是這么回事
GBDT的原理很簡單,就是所有弱分類器的結(jié)果相加等于預測值,然后下一個弱分類器去擬合誤差函數(shù)對預測值的殘差(這個殘差就是預測值與真實值之間的誤差)。當然了,它里面的弱分類器的表現(xiàn)形式就是各棵樹。
舉一個非常簡單的例子,比如我今年30歲了,但計算機或者模型GBDT并不知道我今年多少歲,那GBDT咋辦呢?
- 它會在第一個弱分類器(或第一棵樹中)隨便用一個年齡比如20歲來擬合,然后發(fā)現(xiàn)誤差有10歲;
- 接下來在第二棵樹中,用6歲去擬合剩下的損失,發(fā)現(xiàn)差距還有4歲;
- 接著在第三棵樹中用3歲擬合剩下的差距,發(fā)現(xiàn)差距只有1歲了;
- 最后在第四課樹中用1歲擬合剩下的殘差,完美。
- 最終,四棵樹的結(jié)論加起來,就是真實年齡30歲(實際工程中,gbdt是計算負梯度,用負梯度近似殘差)。
為何gbdt可以用用負梯度近似殘差呢?
回歸任務下,GBDT 在每一輪的迭代時對每個樣本都會有一個預測值,此時的損失函數(shù)為均方差損失函數(shù),
那此時的負梯度是這樣計算的
所以,當損失函數(shù)選用均方損失函數(shù)是時,每一次擬合的值就是(真實值 - 當前模型預測的值),即殘差。此時的變量是,即“當前預測模型的值”,也就是對它求負梯度。
訓練過程
簡單起見,假定訓練集只有4個人:A,B,C,D,他們的年齡分別是14,16,24,26。其中A、B分別是高一和高三學生;C,D分別是應屆畢業(yè)生和工作兩年的員工。如果是用一棵傳統(tǒng)的回歸決策樹來訓練,會得到如下圖所示結(jié)果:
現(xiàn)在我們使用GBDT來做這件事,由于數(shù)據(jù)太少,我們限定葉子節(jié)點做多有兩個,即每棵樹都只有一個分枝,并且限定只學兩棵樹。我們會得到如下圖所示結(jié)果:
在第一棵樹分枝和圖1一樣,由于A,B年齡較為相近,C,D年齡較為相近,他們被分為左右兩撥,每撥用平均年齡作為預測值。
- 此時計算殘差(殘差的意思就是:A的實際值 - A的預測值 = A的殘差),所以A的殘差就是實際值14 - 預測值15 = 殘差值-1。
- 注意,A的預測值是指前面所有樹累加的和,這里前面只有一棵樹所以直接是15,如果還有樹則需要都累加起來作為A的預測值。
然后拿它們的殘差-1、1、-1、1代替A B C D的原值,到第二棵樹去學習,第二棵樹只有兩個值1和-1,直接分成兩個節(jié)點,即A和C分在左邊,B和D分在右邊,經(jīng)過計算(比如A,實際值-1 - 預測值-1 = 殘差0,比如C,實際值-1 - 預測值-1 = 0),此時所有人的殘差都是0。殘差值都為0,相當于第二棵樹的預測值和它們的實際值相等,則只需把第二棵樹的結(jié)論累加到第一棵樹上就能得到真實年齡了,即每個人都得到了真實的預測值。
換句話說,現(xiàn)在A,B,C,D的預測值都和真實年齡一致了。Perfect!
- A: 14歲高一學生,購物較少,經(jīng)常問學長問題,預測年齡A = 15 – 1 = 14
- B: 16歲高三學生,購物較少,經(jīng)常被學弟問問題,預測年齡B = 15 + 1 = 16
- C: 24歲應屆畢業(yè)生,購物較多,經(jīng)常問師兄問題,預測年齡C = 25 – 1 = 24
- D: 26歲工作兩年員工,購物較多,經(jīng)常被師弟問問題,預測年齡D = 25 + 1 = 26
所以,GBDT需要將多棵樹的得分累加得到最終的預測得分,且每一次迭代,都在現(xiàn)有樹的基礎上,增加一棵樹去擬合前面樹的預測結(jié)果與真實值之間的殘差。
梯度提升和梯度下降的區(qū)別和聯(lián)系是什么?
下表是梯度提升算法和梯度下降算法的對比情況。可以發(fā)現(xiàn),兩者都是在每 一輪迭代中,利用損失函數(shù)相對于模型的負梯度方向的信息來對當前模型進行更 新,只不過在梯度下降中,模型是以參數(shù)化形式表示,從而模型的更新等價于參 數(shù)的更新。而在梯度提升中,模型并不需要進行參數(shù)化表示,而是直接定義在函 數(shù)空間中,從而大大擴展了可以使用的模型種類。
GBDT的優(yōu)點和局限性有哪些?
1.優(yōu)點
2.局限性
RF(隨機森林)與GBDT之間的區(qū)別與聯(lián)系
相同點:
都是由多棵樹組成,最終的結(jié)果都是由多棵樹一起決定。
不同點:
- 組成隨機森林的樹可以分類樹也可以是回歸樹,而GBDT只由回歸樹組成
- 組成隨機森林的樹可以并行生成,而GBDT是串行生成
- 隨機森林的結(jié)果是多數(shù)表決表決的,而GBDT則是多棵樹累加之和
- 隨機森林對異常值不敏感,而GBDT對異常值比較敏感
- 隨機森林是減少模型的方差,而GBDT是減少模型的偏差
- 隨機森林不需要進行特征歸一化。而GBDT則需要進行特征歸一化
代碼實現(xiàn):
https://github.com/NLP-LOVE/ML-NLP/blob/master/Machine%20Learning/3.2%20GBDT/GBDT_demo.ipynb
總結(jié)
以上是生活随笔為你收集整理的机器学习面试中常考的知识点,附代码实现(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 干货整理!深度学习相关的面试考点
- 下一篇: .htaccess:正则表达式、重定向代