機器學習A-Z~決策樹與隨機森林

決策樹

有的人可能聽過一個詞:CART,這個表明的意思是Classification And Regression Tree。它是一個分類和迴歸的決策樹。它被分爲兩類,一類是分類決策樹(Classification Trees),另外一個類是迴歸決策樹(Regression Trees)。也就是咱們要用這個決策樹解決兩類問題,一個分類問題一個迴歸問題。python

決策樹

對於分類決策樹,通常來講用於一些分類離散的數據,好比說人的性別是男或者女,水果的種類有蘋果梨子等等都是離散的。反之迴歸決策樹,那麼對應的場景就是連續的數據,好比人的年齡或者室外的溫度。當咱們進行分類問題時,分類的組之間是無序的。這裏首先介紹下什麼是有序,能夠舉個例子好比年齡,又年齡大或者年齡小。那麼對於性別問題,男或女,它是沒有順序的。本文要講的是分類問題在決策樹上的應用。算法

來看個例子,在一個二維平面上有兩個顏色分組的數據,咱們要用決策樹算法來構建分類器。這裏的決策樹算法要作的事情就是不斷用水平和豎直的線不斷對平面進行分隔,直到某一個區域類只有紅類或者綠類。如圖所示,咱們畫出幾條線對平面進行分隔。dom

這樣圖中的紅組和藍組的數據點就被這些數據分隔開來了,但這組數據是爲了方便展現而特意畫成這個樣子的,實際狀況並不必定會出現這種比較清晰的分割線。那咱們先看看第一條分割線,將其分割成了上下兩塊區域,雖然兩邊都是既有紅色又有藍色,但咱們能夠說分類的結果仍是比較純的。用複雜點的數學語言來講就是,咱們正在尋找一條分隔線,能夠是水平的也能夠是豎直的,咱們想要作一個優化的問題,須要最小化分隔後的基尼不純度。什麼叫純,指的是分隔後的一邊若是隻有紅點或者綠點,那麼能夠說這個分隔的結果是很是純的,那麼若是兩邊既有紅也有藍,那麼就是不純的。咱們但願當咱們添加一條分割線後,想要將兩邊的純度和最小化。那麼每一條的分割線的尋找實際上就是在作一個優化的問題,那麼優化的對象能夠是基尼不純度,也能夠是信息學中的熵。這裏不作過多解釋,只是展現下決策樹是若是運做的。機器學習

畫出第一條分隔線後如圖能夠獲得兩組分類結果,一個是x2小於或者不小於60,再而後咱們畫出第二條分割線,看出x1<50是綠組,不然就是紅組,接着再畫出第三條分割線,x1<70都是紅組,再對x1>70分隔,得出紅組和綠組數據。學習

如圖其實就是上述所說的工做流程,咱們獲得的每一片葉子都是比較純的結果,若是在實際實際生活中,數據可能很是複雜,那麼咱們的樹可能就很是很是大,枝節很是很是多。那麼有的時候,有的枝節不必定非要到最後知道yes or no,也許可能在前面某個枝節就中止了。好比對於x2<20這裏再也不繼續分割,假設有個新的數據點落在了這個區域,它落在綠色的區域的機率比落在紅色的機率要大,那麼咱們就能夠把這一部分都劃分到綠色組中,也就是說能夠剪掉多餘的枝節,也許它對於訓練集是有意義的,但對於更多其餘的數據來講,它可能就是個噪音,咱們不須要知道這麼詳細的信息。那最終就沒有這兩片葉子,到前面一步就結束了。優化

決策樹算法是個很經典的機器學習算法,不少年之前是比較流行的。但到了20世紀初已經逐漸被其餘算法所取代。直到最近又發現這個算法中一些新的精妙的東西,好比說隨機森林,就是以決策樹爲根原本展開的。還有提高梯度(Gradient Boosting)等等都是在決策樹算法之上咱們加上了一些新的元素。spa

代碼實現

因爲此次決策樹算法,咱們沒有使用歐式距離,也就是說能夠不用進行特徵縮放。但最終畫圖像時以前模版中定義的步距可能就過大或者太小,因此這裏就妥協一下保留特徵縮放的代碼。分類器改爲決策樹算法的DecisionTreeClassifier。這個方法的參數criterion指的就是標準,默認gini,即基尼指數或者說基尼不純度。它和熵都是表示分類時劃分質量的好壞。這裏咱們使用熵。其餘的參數暫時用不到,random_state依然只是用來你們若是想獲得相同的結果時就設置爲相同的值便可。rest

from sklearn.tree import DecisionTreeClassifier
classifier = DecisionTreeClassifier(criterion='entropy',random_state=)
classifier.fit(X_train, y_train)

隨機森林

在開始講隨機森林以前咱們先講一個更爲廣義的概念: Ensemble Learning,集成學習。它的意思是咱們使用多個分類器對咱們的結果進行預測,最後再對分類結果進行一個組合,以達到最終的結果。這個組合的方式有不少種,好比平均,加權平均或者投票等等。這個集成學習的做用就是,咱們以爲任何一個單獨的分類器去分類結果回感受有偏差,這時能夠用成百上千個分類器都進行預測,而後再對結果進行一個組合,能夠減小預測結果的浮動率。下面來看看隨機森林算法的步驟。code

首先,隨機採用訓練集合中的數據,至關於裝袋的過程,構建本身新的訓練集;而後用這些數據訓練決策樹分類器;再而後實際上就是重複第一第二步,但每一次獲得的結果是不一樣的,由於在第一步中咱們取得的數據都是隨機的。對於一個新的數據點,咱們用已經訓練好的多個訓練器分別對這個新數據的分類進行預測,最後進行一個投票,擁有最大投票數量的分類結果勝出就使用這個分類結果。對象

隨機森林

前文講述瞭如何構建一棵決策樹,如今擁有成百上千棵決策樹來幫助咱們解決分類問題。這個分類算法還有很多數學上的一些細節問題,好比Boosting(提高),還有當咱們有高維度的狀況時,咱們每次選取數據時可能只選取部分維度,這樣能夠避免個別維度比其餘維度大的多狀況。

代碼實現

這裏依然開始先套用分類的模版,而後換成隨機森林分類器,這裏的參數n_estimators指的是決策樹的數量,這裏暫時設置成10 criterion依然設置爲entropy。

from sklearn.ensemble import RandomForestClassifier
classifier = RandomForestClassifier(n_estimators=10, criterion='entropy', random_state=0)
classifier.fit(X_train, y_train)

經過結果觀察,這裏使用隨機森林分類器是會出現過擬合的狀況。對比這幾篇文章中的分類器,實際上最適合的是核svm和樸素貝葉斯,線性分類器準確度不夠,隨機森林分類器會出現過擬合,而這二者它們保證了擬合的準確率,而且也不會出現過擬合的問題。

以上,就是關於決策樹和隨機森林相關的基礎知識。

相關文章
相關標籤/搜索