機器學習系列(三十六)——回歸決策樹與決策樹總結

本篇主要內(nèi)容:回歸決策樹原理、回歸樹學習曲線徊都、決策樹總結

回歸決策樹原理

回歸決策樹樹是用于回歸的決策樹模型沪斟,回歸決策樹主要指CART算法, 同樣也為二叉樹結構暇矫。以兩個特征預測輸出的回歸問題為例主之,回歸樹的原理是將特征平面劃分成若干單元,每一個劃分單元都對應一個特定的輸出李根。因為每個結點都是yes和no的判斷槽奕,所以劃分的邊界是平行于坐標軸的。對于測試數(shù)據(jù)房轿,我們只要將特征按照決策過程將其歸到某個單元粤攒,便得到對應的回歸輸出值。

決策回歸
回歸樹

如上圖所示的劃分和相應的回歸樹囱持,如果現(xiàn)在新來一個數(shù)據(jù)的特征是(6,7.5)夯接,按照回歸樹,它對應的回歸結果就是C5纷妆。節(jié)點的劃分的過程也就是樹的建立過程盔几,每劃分一次,隨即確定劃分單元對應的輸出掩幢,也就多了一個結點逊拍。當根據(jù)相應的約束條件終止劃分的時候,最終每個單元的輸出也就確定了粒蜈,輸出也就是葉結點顺献。這看似和分類樹差不多,實則有很大的區(qū)別枯怖。劃分點的尋找和輸出值的確定是回歸決策樹的兩個核心問題注整。
一個輸入空間的劃分的誤差是用真實值和劃分區(qū)域的預測值的最小二乘來衡量的:
\sum_{x_{i}\in R_{m}}(y_{i}-f(x_{i}))^2

其中,f(x_i)是每個劃分單元的預測值,這個預測值是該單元內(nèi)每個樣本點的值的某種組合肿轨,比如可取均值:
f(x_{i})=c_{m}=ave(y_{i}|x_{i}\in R_{m})

(輸入特征空間劃分為R_1,R_2,...,R_m
那么求解最優(yōu)劃分即是求解最優(yōu)化問題:
min_{j,s}[min_{c_{1}}\sum_{x_{i}\in R_{1}(j,s)}(y_{i}-c_{1})^2+min_{c_{2}}\sum_{x_{i}\in R_{2}(j,s)}(y_{i}-c_{2})^2]

其中寿冕,R_1(j,s)=\langle x|x^{j}\leq s\rangleR_2(j,s)=\langle x|x^{j}\leq s\rangle是每次劃分形成的兩個區(qū)域。
關于該最優(yōu)化問題的求解這里不再介紹椒袍,下面直接使用skleaen中的決策回歸樹來看一下決策樹的回歸效果驼唱,數(shù)據(jù)集使用Boston房價數(shù)據(jù):

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
boston=datasets.load_boston()
x=boston.data
y=boston.target

from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(x,y,random_state=666)
from sklearn.tree import DecisionTreeRegressor
dt_reg=DecisionTreeRegressor()
dt_reg.fit(x_train,y_train)
dt_reg.score(x_test,y_test)
R方

不進行調參的話,可以看到在測試集上R方是0.59驹暑,顯然這是不太好的結果玫恳,但是一個有趣的現(xiàn)象是,在訓練集上:

訓練集R方

R方值是1.0优俘,也就是在訓練集上決策樹預測的回歸結果完全吻合毫無偏差京办,這顯然是過擬合。這個例子也說明了決策樹算法是非常容易產(chǎn)生過擬合的帆焕,當然我們可以通過調參來緩解過擬合惭婿。


學習曲線

下面繪制學習曲線來直觀看一下決策樹回歸模型的表現(xiàn),首先繪制基于MSE的學習曲線:

from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_squared_error

def plot_learning_curve(algo, X_train, X_test, y_train, y_test):
    train_score = []
    test_score = []
    for i in range(1, len(X_train)+1):
        algo.fit(X_train[:i], y_train[:i])
    
        y_train_predict = algo.predict(X_train[:i])
        train_score.append(mean_squared_error(y_train[:i], y_train_predict))
    
        y_test_predict = algo.predict(X_test)
        test_score.append(mean_squared_error(y_test, y_test_predict))
        
    plt.plot([i for i in range(1, len(X_train)+1)], 
                               np.sqrt(train_score), label="train")
    plt.plot([i for i in range(1, len(X_train)+1)], 
                               np.sqrt(test_score), label="test")
    plt.legend()
    plt.show()
    
plot_learning_curve(DecisionTreeRegressor(), X_train, X_test, y_train, y_test)

學習曲線如下:

基于MSE的學習曲線

再繪制基于R方的學習曲線:

from sklearn.metrics import r2_score
def plot_learning_curve_r2(algo, X_train, X_test, y_train, y_test):
    train_score = []
    test_score = []
    for i in range(1, len(X_train)+1):
        algo.fit(X_train[:i], y_train[:i])
    
        y_train_predict = algo.predict(X_train[:i])
        train_score.append(r2_score(y_train[:i], y_train_predict))
    
        y_test_predict = algo.predict(X_test)
        test_score.append(r2_score(y_test, y_test_predict))
        
    plt.plot([i for i in range(1, len(X_train)+1)], 
                               train_score, label="train")
    plt.plot([i for i in range(1, len(X_train)+1)], 
                               test_score, label="test")
    plt.legend()
    plt.axis([0, len(X_train)+1, -0.1, 1.1])
    plt.show()
    
plot_learning_curve_r2(DecisionTreeRegressor(), X_train, X_test, y_train, y_test)
基于R方的學習曲線

上面兩種都是在默認情況下也就是不進行決策樹深度和葉子節(jié)點個數(shù)等條件的限制得到的結果叶雹。發(fā)現(xiàn)在訓練集上财饥,如果不進行限制,可以做到0偏差折晦,這是明顯的過擬合钥星。接下來調節(jié)參數(shù)再繪制學習曲線,為節(jié)約篇幅筋遭,只調節(jié)決策樹深度這一個參數(shù)打颤,而且只繪制基于R方的學習曲線:
max_depth=1時

plot_learning_curve_r2(DecisionTreeRegressor(max_depth=1), X_train, X_test, y_train, y_test)
md=1

max_depth=3時

plot_learning_curve_r2(DecisionTreeRegressor(max_depth=3), X_train, X_test, y_train, y_test)
md=3

max_depth=5時

plot_learning_curve_r2(DecisionTreeRegressor(max_depth=5), X_train, X_test, y_train, y_test)
md=5

隨著深度的增加,模型復雜度越來越高漓滔,過擬合現(xiàn)象也越來越明顯编饺,可以測試,當max_depth=20時响驴,在訓練集上又為一條y=1的無偏差直線透且。有興趣的仍然可以修改其它參數(shù)繪制學習曲線。


決策樹總結

決策樹的局限性:

  • 決策樹最嚴重的局限性是決策樹生成的決策邊界是平行于坐標軸的直線的組合豁鲤,旋轉數(shù)據(jù)集則決策邊界會改變秽誊,因此決策不穩(wěn)定;
  • 另外決策樹對個別數(shù)據(jù)敏感琳骡。(這幾乎是所有非參數(shù)學習算法的弊端之一)

使用本系列上篇文章中的鳶尾花數(shù)據(jù)锅论,來看一下決策樹對個別數(shù)據(jù)敏感會導致的結果,在本系列上篇文章中楣号,使用信息熵劃分最易,其余參數(shù)默認情況下繪制的決策邊界是:

決策邊界1

接著我們刪除索引為138的數(shù)據(jù)怒坯,再來繪制決策邊界:

X_new = np.delete(x,138,axis=0)
y_new = np.delete(y,138)
dt_clf2 = DecisionTreeClassifier(max_depth=2,criterion="entropy")
dt_clf2.fit(X_new,y_new)#用數(shù)據(jù)訓練模型

plot_decision_boundary(dt_clf2,axis=[0.5,7.5,0,3])
plt.scatter(x[y==0,0],x[y==0,1])
plt.scatter(x[y==1,0],x[y==1,1])
plt.scatter(x[y==2,0],x[y==2,1])
plt.show()
決策邊界2

發(fā)現(xiàn)此時的決策邊界已經(jīng)完全不同了,而這僅僅只是一個數(shù)據(jù)點的影響藻懒。


綜上我們知道決策樹實際是一種不夠穩(wěn)定的算法剔猿,它的表現(xiàn)極度依賴調參和數(shù)據(jù),不過雖然決策樹本身不是一種高效的機器學習算法嬉荆,但是它們基于集成學習的組合——隨機森林(RF)卻是一個很魯棒的機器學習算法归敬,這將在下篇開始介紹。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鄙早,一起剝皮案震驚了整個濱河市汪茧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌限番,老刑警劉巖陆爽,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異扳缕,居然都是意外死亡,警方通過查閱死者的電腦和手機别威,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門躯舔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人省古,你說我怎么就攤上這事粥庄。” “怎么了豺妓?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵惜互,是天一觀的道長。 經(jīng)常有香客問我琳拭,道長训堆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任白嘁,我火速辦了婚禮坑鱼,結果婚禮上,老公的妹妹穿的比我還像新娘絮缅。我一直安慰自己鲁沥,他們只是感情好,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布耕魄。 她就那樣靜靜地躺著画恰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吸奴。 梳的紋絲不亂的頭發(fā)上允扇,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天缠局,我揣著相機與錄音,去河邊找鬼蔼两。 笑死甩鳄,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的额划。 我是一名探鬼主播妙啃,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼俊戳!你這毒婦竟也來了揖赴?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤抑胎,失蹤者是張志新(化名)和其女友劉穎燥滑,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阿逃,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡铭拧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了恃锉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片搀菩。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖破托,靈堂內(nèi)的尸體忽然破棺而出肪跋,到底是詐尸還是另有隱情,我是刑警寧澤土砂,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布州既,位于F島的核電站,受9級特大地震影響萝映,放射性物質發(fā)生泄漏吴叶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一序臂、第九天 我趴在偏房一處隱蔽的房頂上張望晤郑。 院中可真熱鬧,春花似錦贸宏、人聲如沸造寝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诫龙。三九已至,卻和暖如春鲫咽,著一層夾襖步出監(jiān)牢的瞬間签赃,已是汗流浹背谷异。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留锦聊,地道東北人歹嘹。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像孔庭,于是被迫代替她去往敵國和親尺上。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容