決策樹(shù)
有的人可能聽(tīng)過(guò)一個(gè)詞:CART,這個(gè)代表的意思是Classification And Regression Tree。它是一個(gè)分類(lèi)和回歸的決策樹(shù)。它被分為兩類(lèi),一類(lèi)是分類(lèi)決策樹(shù)(Classification Trees),另一個(gè)類(lèi)是回歸決策樹(shù)(Regression Trees)。也就是我們要用這個(gè)決策樹(shù)解決兩類(lèi)問(wèn)題,一個(gè)分類(lèi)問(wèn)題一個(gè)回歸問(wèn)題。

對(duì)于分類(lèi)決策樹(shù),一般來(lái)說(shuō)用于一些分類(lèi)離散的數(shù)據(jù),比如說(shuō)人的性別是男或者女,水果的種類(lèi)有蘋(píng)果梨子等等都是離散的。反之回歸決策樹(shù),那么對(duì)應(yīng)的場(chǎng)景就是連續(xù)的數(shù)據(jù),比如人的年齡或者室外的溫度。當(dāng)我們進(jìn)行分類(lèi)問(wèn)題時(shí),分類(lèi)的組之間是無(wú)序的。這里首先介紹下什么是有序,可以舉個(gè)例子比如年齡,又年齡大或者年齡小。那么對(duì)于性別問(wèn)題,男或女,它是沒(méi)有順序的。本文要講的是分類(lèi)問(wèn)題在決策樹(shù)上的應(yīng)用。
來(lái)看個(gè)例子,在一個(gè)二維平面上有兩個(gè)顏色分組的數(shù)據(jù),我們要用決策樹(shù)算法來(lái)構(gòu)建分類(lèi)器。這里的決策樹(shù)算法要做的事情就是不斷用水平和豎直的線(xiàn)不斷對(duì)平面進(jìn)行分隔,直到某一個(gè)區(qū)域類(lèi)只有紅類(lèi)或者綠類(lèi)。如圖所示,我們畫(huà)出幾條線(xiàn)對(duì)平面進(jìn)行分隔。

這樣圖中的紅組和藍(lán)組的數(shù)據(jù)點(diǎn)就被這些數(shù)據(jù)分隔開(kāi)來(lái)了,但這組數(shù)據(jù)是為了方便展示而特地畫(huà)成這個(gè)樣子的,實(shí)際情況并不一定會(huì)出現(xiàn)這種比較清晰的分割線(xiàn)。那我們先看看第一條分割線(xiàn),將其分割成了上下兩塊區(qū)域,雖然兩邊都是既有紅色又有藍(lán)色,但我們可以說(shuō)分類(lèi)的結(jié)果還是比較純的。用復(fù)雜點(diǎn)的數(shù)學(xué)語(yǔ)言來(lái)說(shuō)就是,我們正在尋找一條分隔線(xiàn),可以是水平的也可以是豎直的,我們想要做一個(gè)優(yōu)化的問(wèn)題,需要最小化分隔后的基尼不純度。什么叫純,指的是分隔后的一邊如果只有紅點(diǎn)或者綠點(diǎn),那么可以說(shuō)這個(gè)分隔的結(jié)果是非常純的,那么如果兩邊既有紅也有藍(lán),那么就是不純的。我們希望當(dāng)我們添加一條分割線(xiàn)后,想要將兩邊的純度和最小化。那么每一條的分割線(xiàn)的尋找實(shí)際上就是在做一個(gè)優(yōu)化的問(wèn)題,那么優(yōu)化的對(duì)象可以是基尼不純度,也可以是信息學(xué)中的熵。這里不做過(guò)多解釋?zhuān)皇钦故鞠聸Q策樹(shù)是如果運(yùn)作的。
畫(huà)出第一條分隔線(xiàn)后如圖可以得到兩組分類(lèi)結(jié)果,一個(gè)是x2小于或者不小于60,再然后我們畫(huà)出第二條分割線(xiàn),看出x1<50是綠組,否則就是紅組,接著再畫(huà)出第三條分割線(xiàn),x1<70都是紅組,再對(duì)x1>70分隔,得出紅組和綠組數(shù)據(jù)。

如圖其實(shí)就是上述所說(shuō)的工作流程,我們得到的每一片葉子都是比較純的結(jié)果,如果在實(shí)際實(shí)際生活中,數(shù)據(jù)可能非常復(fù)雜,那么我們的樹(shù)可能就非常非常大,枝節(jié)非常非常多。那么有的時(shí)候,有的枝節(jié)不一定非要到最后知道yes or no,也許可能在前面某個(gè)枝節(jié)就停止了。比如對(duì)于x2<20這里不再繼續(xù)分割,假設(shè)有個(gè)新的數(shù)據(jù)點(diǎn)落在了這個(gè)區(qū)域,它落在綠色的區(qū)域的概率比落在紅色的概率要大,那么我們就可以把這一部分都劃分到綠色組中,也就是說(shuō)可以剪掉多余的枝節(jié),也許它對(duì)于訓(xùn)練集是有意義的,但對(duì)于更多其他的數(shù)據(jù)來(lái)說(shuō),它可能就是個(gè)噪音,我們不需要知道這么詳細(xì)的信息。那最終就沒(méi)有這兩片葉子,到前面一步就結(jié)束了。
決策樹(shù)算法是個(gè)很經(jīng)典的機(jī)器學(xué)習(xí)算法,很多年以前是比較流行的。但到了20世紀(jì)初已經(jīng)逐漸被其他算法所取代。直到最近又發(fā)現(xiàn)這個(gè)算法中一些新的精妙的東西,比如說(shuō)隨機(jī)森林,就是以決策樹(shù)為根本來(lái)展開(kāi)的。還有提升梯度(Gradient Boosting)等等都是在決策樹(shù)算法之上我們加上了一些新的元素。
代碼實(shí)現(xiàn)
由于這次決策樹(shù)算法,我們沒(méi)有使用歐式距離,也就是說(shuō)可以不用進(jìn)行特征縮放。但最終畫(huà)圖像時(shí)之前模版中定義的步距可能就過(guò)大或者過(guò)小,所以這里就妥協(xié)一下保留特征縮放的代碼。分類(lèi)器改成決策樹(shù)算法的DecisionTreeClassifier。這個(gè)方法的參數(shù)criterion指的就是標(biāo)準(zhǔn),默認(rèn)gini,即基尼指數(shù)或者說(shuō)基尼不純度。它和熵都是表示分類(lèi)時(shí)劃分質(zhì)量的好壞。這里我們使用熵。其他的參數(shù)暫時(shí)用不到,random_state依然只是用來(lái)大家如果想得到相同的結(jié)果時(shí)就設(shè)置為相同的值即可。
from sklearn.tree import DecisionTreeClassifier
classifier = DecisionTreeClassifier(criterion='entropy',random_state=)
classifier.fit(X_train, y_train)
隨機(jī)森林
在開(kāi)始講隨機(jī)森林之前我們先講一個(gè)更為廣義的概念: Ensemble Learning,集成學(xué)習(xí)。它的意思是我們使用多個(gè)分類(lèi)器對(duì)我們的結(jié)果進(jìn)行預(yù)測(cè),最后再對(duì)分類(lèi)結(jié)果進(jìn)行一個(gè)組合,以達(dá)到最終的結(jié)果。這個(gè)組合的方式有很多種,比如平均,加權(quán)平均或者投票等等。這個(gè)集成學(xué)習(xí)的作用就是,我們覺(jué)得任何一個(gè)單獨(dú)的分類(lèi)器去分類(lèi)結(jié)果回感覺(jué)有誤差,這時(shí)可以用成百上千個(gè)分類(lèi)器都進(jìn)行預(yù)測(cè),然后再對(duì)結(jié)果進(jìn)行一個(gè)組合,可以減少預(yù)測(cè)結(jié)果的浮動(dòng)率。下面來(lái)看看隨機(jī)森林算法的步驟。
首先,隨機(jī)采用訓(xùn)練集合中的數(shù)據(jù),相當(dāng)于裝袋的過(guò)程,構(gòu)建自己新的訓(xùn)練集;然后用這些數(shù)據(jù)訓(xùn)練決策樹(shù)分類(lèi)器;再然后實(shí)際上就是重復(fù)第一第二步,但每一次得到的結(jié)果是不同的,因?yàn)樵诘谝徊街形覀內(nèi)〉玫臄?shù)據(jù)都是隨機(jī)的。對(duì)于一個(gè)新的數(shù)據(jù)點(diǎn),我們用已經(jīng)訓(xùn)練好的多個(gè)訓(xùn)練器分別對(duì)這個(gè)新數(shù)據(jù)的分類(lèi)進(jìn)行預(yù)測(cè),最后進(jìn)行一個(gè)投票,擁有最大投票數(shù)量的分類(lèi)結(jié)果勝出就使用這個(gè)分類(lèi)結(jié)果。

前文講述了如何構(gòu)建一棵決策樹(shù),現(xiàn)在擁有成百上千棵決策樹(shù)來(lái)幫助我們解決分類(lèi)問(wèn)題。這個(gè)分類(lèi)算法還有不少數(shù)學(xué)上的一些細(xì)節(jié)問(wèn)題,比如Boosting(提升),還有當(dāng)我們有高維度的情況時(shí),我們每次選取數(shù)據(jù)時(shí)可能只選取部分維度,這樣可以避免個(gè)別維度比其他維度大的多情況。
代碼實(shí)現(xiàn)
這里依然開(kāi)始先套用分類(lèi)的模版,然后換成隨機(jī)森林分類(lèi)器,這里的參數(shù)n_estimators指的是決策樹(shù)的數(shù)量,這里暫時(shí)設(shè)置成10 criterion依然設(shè)置為entropy。
from sklearn.ensemble import RandomForestClassifier
classifier = RandomForestClassifier(n_estimators=10, criterion='entropy', random_state=0)
classifier.fit(X_train, y_train)
通過(guò)結(jié)果觀(guān)察,這里使用隨機(jī)森林分類(lèi)器是會(huì)出現(xiàn)過(guò)擬合的情況。對(duì)比這幾篇文章中的分類(lèi)器,實(shí)際上最適合的是核svm和樸素貝葉斯,線(xiàn)性分類(lèi)器準(zhǔn)確度不夠,隨機(jī)森林分類(lèi)器會(huì)出現(xiàn)過(guò)擬合,而這兩者它們保證了擬合的準(zhǔn)確率,并且也不會(huì)出現(xiàn)過(guò)擬合的問(wèn)題。
以上,就是關(guān)于決策樹(shù)和隨機(jī)森林相關(guān)的基礎(chǔ)知識(shí)。