當前位置:
首頁 > 最新 > 使用R語言建立一個決策樹回歸模型

使用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:數據龜 |