机器学习系列(三十六)——回归决策树与决策树总结

本篇主要内容:回归决策树原理、回归树学习曲线、决策树总结

回归决策树原理

回归决策树树是用于回归的决策树模型,回归决策树主要指CART算法, 同样也为二叉树结构。以两个特征预测输出的回归问题为例,回归树的原理是将特征平面划分成若干单元,每一个划分单元都对应一个特定的输出。因为每个结点都是yes和no的判断,所以划分的边界是平行于坐标轴的。对于测试数据,我们只要将特征按照决策过程将其归到某个单元,便得到对应的回归输出值。

决策回归
回归树

如上图所示的划分和相应的回归树,如果现在新来一个数据的特征是(6,7.5),按照回归树,它对应的回归结果就是C5。节点的划分的过程也就是树的建立过程,每划分一次,随即确定划分单元对应的输出,也就多了一个结点。当根据相应的约束条件终止划分的时候,最终每个单元的输出也就确定了,输出也就是叶结点。这看似和分类树差不多,实则有很大的区别。划分点的寻找和输出值的确定是回归决策树的两个核心问题。
一个输入空间的划分的误差是用真实值和划分区域的预测值的最小二乘来衡量的:
\sum_{x_{i}\in R_{m}}(y_{i}-f(x_{i}))^2

其中,f(x_i)是每个划分单元的预测值,这个预测值是该单元内每个样本点的值的某种组合,比如可取均值:
f(x_{i})=c_{m}=ave(y_{i}|x_{i}\in R_{m})

(输入特征空间划分为R_1,R_2,...,R_m
那么求解最优划分即是求解最优化问题:
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是每次划分形成的两个区域。
关于该最优化问题的求解这里不再介绍,下面直接使用skleaen中的决策回归树来看一下决策树的回归效果,数据集使用Boston房价数据:

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,显然这是不太好的结果,但是一个有趣的现象是,在训练集上:

训练集R方

R方值是1.0,也就是在训练集上决策树预测的回归结果完全吻合毫无偏差,这显然是过拟合。这个例子也说明了决策树算法是非常容易产生过拟合的,当然我们可以通过调参来缓解过拟合。


学习曲线

下面绘制学习曲线来直观看一下决策树回归模型的表现,首先绘制基于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方的学习曲线

上面两种都是在默认情况下也就是不进行决策树深度和叶子节点个数等条件的限制得到的结果。发现在训练集上,如果不进行限制,可以做到0偏差,这是明显的过拟合。接下来调节参数再绘制学习曲线,为节约篇幅,只调节决策树深度这一个参数,而且只绘制基于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

随着深度的增加,模型复杂度越来越高,过拟合现象也越来越明显,可以测试,当max_depth=20时,在训练集上又为一条y=1的无偏差直线。有兴趣的仍然可以修改其它参数绘制学习曲线。


决策树总结

决策树的局限性:

  • 决策树最严重的局限性是决策树生成的决策边界是平行于坐标轴的直线的组合,旋转数据集则决策边界会改变,因此决策不稳定;
  • 另外决策树对个别数据敏感。(这几乎是所有非参数学习算法的弊端之一)

使用本系列上篇文章中的鸢尾花数据,来看一下决策树对个别数据敏感会导致的结果,在本系列上篇文章中,使用信息熵划分,其余参数默认情况下绘制的决策边界是:

决策边界1

接着我们删除索引为138的数据,再来绘制决策边界:

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)#用数据训练模型

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

发现此时的决策边界已经完全不同了,而这仅仅只是一个数据点的影响。


综上我们知道决策树实际是一种不够稳定的算法,它的表现极度依赖调参和数据,不过虽然决策树本身不是一种高效的机器学习算法,但是它们基于集成学习的组合——随机森林(RF)却是一个很鲁棒的机器学习算法,这将在下篇开始介绍。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容