使用R語言建立一個決策樹回歸模型
決策樹是一種簡單但使用廣泛的分類演算法,根據目標變數的類型,決策樹分為分類決策樹(目標變數為因子型)與回歸決策樹(目標變數為連續數值型)。在這裡,我們使用R建議一個回歸決策樹模型。
決策樹簡單介紹
對於一個分類問題,我們可能需要多個屬性值來構建問題,通過回答這些問題(比如長度大於多少,寬度大於多少,重量大於多少),有序地得到問題的答案,並重複問題到我們得到最後的分類,把上面的過程(問題、答案)有組織的組合在一起,就能形成類似倒立的樹結構。
圖1:摘自《數據挖掘導論》
上面是摘自《數據挖掘導論》決策樹章節,我們根據不同的屬性特徵,對動物進行分類。
問題1:體溫特徵是什麼?
答案1:冷血非哺乳動物;恆溫問題2;
問題2:是否為胎生?
答案2:胎生哺乳動物;非胎生:非哺乳動物;
這就是一個簡單的決策樹,我們通過不停得提出問題,根據問題的答案又提出新的問題,不斷重複直到得到我們的分類類別。這個過程稱為決策樹的生長,而第一個問題(問題1)我們稱為根節點,其餘問題(問題2,問題3,...,問題i)稱為內部節點,最後的類別(哺乳動物、非哺乳動物)則稱為葉結點。
什麼是修枝?
決策樹是一種監督下學習演算法,需要提供變數與類別值(目標變數)。隨著變數的增加,決策樹也生長成一棵巨大的樹,我們的內部節點也會非常多。這時候我們會發現這個內部節點的描述(問題n)可能就變成這樣了:年收入大於50000元、年齡大於50歲、姓名叫張三的人購買了此產品。越多的限定條件(規則),越能夠擬合訓練集,但使用上面的限定條件來預測未知測試集。我們就會發現預測的結果非常不理想(根本沒有名字叫張三的人年收入在50000且年齡大於50),這就是模型的過擬合。
為了避免模型過擬合,我們要對決策樹進行修枝。很形象的說法,對於一棵枝葉茂盛的樹,我們通過修枝讓樹枝按我們想要的方向生長。而在決策樹種,通過修枝,我們把限定條件適當的減去(比如把名字叫張三這個內部節點刪去),防止模型過擬合。常用的修枝方法有:
預修枝;
後修枝;
預修枝:在建立模型之前,我們就指定了決策樹的最大深度(內部節點數),或者最小樣本量。但是需要我們對變數的業務理解較深,且要反覆試驗,才能取到「最優值」。注意:無論是最大深度過淺還是過深,都會造成糟糕的預測結果。
後修枝:預先設定的最大錯誤率,在決策樹充分生長後再修剪,每減少一個內部節點就檢驗模型的錯誤率,當模型的錯誤率大於預先設定值時,停止修剪。
根據修枝的不同策略,決策樹演算法可以分為:C4.5、C5.0、CHAID、CART和QUEST。
回歸決策樹
當目標變數為連續型數值型時,決策樹為回歸決策樹。對於連續型數值型來說,如何來劃分類別呢?
圖2:摘自《數據挖掘導論》
假設我們有變數x,y,我們要預測出目標變數z。圖2中的點為目標變數z在二維平面的投影。劃分步驟如下:
1、根節點:x
0.43???為什麼是0.43?0.43是根據一些準則算出來的,比如Gini指標、熵、分類誤差等。如下圖3,我們根據Gini指標,選擇最佳劃分值。
圖3:摘自《數據挖掘導論》
首先,我們將x變數按順序排序,取相鄰兩個觀測值的均值作為劃分依據(劃分點),同時計算其Gini指標,根據這些Gini指標,選擇最優的劃分值。
ps:Gini指標越小越好,所以圖3選擇了97作為劃分值。
2、內部節點:y
重複上面劃分值的選擇,在x不同劃分下,分別選出y的最佳劃分點。
3、葉結點
葉結點將z變數分成了四類。
好了,根據決策樹模型,我們將x,y分成四類,那麼我們如何預測未知值呢?假設我們現在有一個未知觀測(x1,y1),根據模型,該觀測歸於類1,那麼其z1值則為所有類1的均值。
R建立模型
在上一篇文章中,我們使用了SVR模型預測了面試者的年薪來判斷面試者的要求是否合理,在這裡,我仍使用該數據,但我們使用回歸決策樹來預測面試者的年薪。
數據集的介紹與散點圖請點擊這裡查看,在這裡就不重複了。下面直接使用rpart包來建立一個回歸決策樹模型。
與其他建模函數類似,rpart()函數使用formula參數就能創建一個簡單的決策樹。我們試著繪製出這個決策樹。
發現出錯了!!!發現我們的模型只生長出一個根節點。我們試著把這曲線繪製出來。
很明顯,我們的模型將所有的Level都歸於一類,結果預測值為salary的均值。
我們的模型需要修改。
control參數用以控制演算法的細節。minsplit:一個內部節點最少包含多少條觀測值,默認值為20,由於我們的數據集才10條,所以會將所有觀測歸於一類。
重新建模後,我們再繪製來看看。margin參數:防止因圖形過大而被遮擋一部分圖形。
好了,我們的回歸決策樹將Salary分為四類,我們可以看出來,第一次Level的劃分點為8.5,接下來兩個劃分點分別為6.5與9.5。
我們也可以直接列印出rpart對象,返回了文字形式的結果。
其中:*號標識葉結點。
接下來,我們使用這個模型來預測一下,看看預測結果與面試者的要求相差多遠。
預測結果為250K,遠高於面試者的要求,也與我們使用SVR的結果相差較大。
我們來看看曲線。
從上圖也可以看出來,我們將Level變數分為四類,預測值為每一類的均值。而我們的未知值(6.5),整好是劃分點,同時將其歸到了類[6.5,8.5)中,所以預測結果為觀測點7、8的均值。
沒錯,從圖中來看,預測結果偏差較大。是否可以通過剪枝來優化模型呢?rpart包提供了複雜度損失修剪的修剪方法,printcp()會告訴分裂到每一層,cp是多少,平均相對誤差是多少,交叉驗證的估計誤差(「xerror」列),以及標準誤差(「xstd」列),平均相對誤差=xerror±xstd。
通過分析上面的各分裂層的確定cp值。這裡我們取cp = 0.1。
可以看出來,我們把level
我們建了兩個模型,結果相差較遠,那我們可不可以綜合這兩個模型,取其平均值當做預測結果呢?答案是肯定可以的,這就是我們接下要講的隨機森林演算法,詳細將在隨機森林介紹。
總結
我們了解了什麼是決策樹,決策樹如何構成,如何劃分變數,簡單介紹了什麼是修枝。接著我們使用R語言建立了一個回歸決策樹模型,並將我們的模型可視化。通過修枝,我們建立了第二模型,並引出了隨機森林。
參考:
《數據挖掘導論》第四章
決策樹(回歸樹)分析及應用建模:
http://blog.sina.com.cn/s/blog_7147f6870102vzb6.html
R語言 決策樹和隨機森林 回歸分析:
https://yq.aliyun.com/ziliao/11983
掃一掃,關注我的個人公眾號:DataTurtle,獲取源碼,更有各種數據分析視頻免費獲取。
TAG:數據龜 |