本篇主要內(nèi)容:回歸決策樹原理、回歸樹學習曲線徊都、決策樹總結
回歸決策樹原理
回歸決策樹樹是用于回歸的決策樹模型沪斟,回歸決策樹主要指CART算法, 同樣也為二叉樹結構暇矫。以兩個特征預測輸出的回歸問題為例主之,回歸樹的原理是將特征平面劃分成若干單元,每一個劃分單元都對應一個特定的輸出李根。因為每個結點都是yes和no的判斷槽奕,所以劃分的邊界是平行于坐標軸的。對于測試數(shù)據(jù)房轿,我們只要將特征按照決策過程將其歸到某個單元粤攒,便得到對應的回歸輸出值。
如上圖所示的劃分和相應的回歸樹囱持,如果現(xiàn)在新來一個數(shù)據(jù)的特征是(6,7.5)夯接,按照回歸樹,它對應的回歸結果就是C5纷妆。節(jié)點的劃分的過程也就是樹的建立過程盔几,每劃分一次,隨即確定劃分單元對應的輸出掩幢,也就多了一個結點逊拍。當根據(jù)相應的約束條件終止劃分的時候,最終每個單元的輸出也就確定了粒蜈,輸出也就是葉結點顺献。這看似和分類樹差不多,實則有很大的區(qū)別枯怖。劃分點的尋找和輸出值的確定是回歸決策樹的兩個核心問題注整。
一個輸入空間的劃分的誤差是用真實值和劃分區(qū)域的預測值的最小二乘來衡量的:
其中,是每個劃分單元的預測值,這個預測值是該單元內(nèi)每個樣本點的值的某種組合肿轨,比如可取均值:
(輸入特征空間劃分為)
那么求解最優(yōu)劃分即是求解最優(yōu)化問題:
其中寿冕,和
是每次劃分形成的兩個區(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方是0.59驹暑,顯然這是不太好的結果玫恳,但是一個有趣的現(xiàn)象是,在訓練集上:
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)
學習曲線如下:
再繪制基于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)
上面兩種都是在默認情況下也就是不進行決策樹深度和葉子節(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)
max_depth=3時
plot_learning_curve_r2(DecisionTreeRegressor(max_depth=3), X_train, X_test, y_train, y_test)
max_depth=5時
plot_learning_curve_r2(DecisionTreeRegressor(max_depth=5), X_train, X_test, y_train, y_test)
隨著深度的增加,模型復雜度越來越高漓滔,過擬合現(xiàn)象也越來越明顯编饺,可以測試,當max_depth=20時响驴,在訓練集上又為一條y=1的無偏差直線透且。有興趣的仍然可以修改其它參數(shù)繪制學習曲線。
決策樹總結
決策樹的局限性:
- 決策樹最嚴重的局限性是決策樹生成的決策邊界是平行于坐標軸的直線的組合豁鲤,旋轉數(shù)據(jù)集則決策邊界會改變秽誊,因此決策不穩(wěn)定;
- 另外決策樹對個別數(shù)據(jù)敏感琳骡。(這幾乎是所有非參數(shù)學習算法的弊端之一)
使用本系列上篇文章中的鳶尾花數(shù)據(jù)锅论,來看一下決策樹對個別數(shù)據(jù)敏感會導致的結果,在本系列上篇文章中楣号,使用信息熵劃分最易,其余參數(shù)默認情況下繪制的決策邊界是:
接著我們刪除索引為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()
發(fā)現(xiàn)此時的決策邊界已經(jīng)完全不同了,而這僅僅只是一個數(shù)據(jù)點的影響藻懒。
綜上我們知道決策樹實際是一種不夠穩(wěn)定的算法剔猿,它的表現(xiàn)極度依賴調參和數(shù)據(jù),不過雖然決策樹本身不是一種高效的機器學習算法嬉荆,但是它們基于集成學習的組合——隨機森林(RF)卻是一個很魯棒的機器學習算法归敬,這將在下篇開始介紹。