一文深刻理解决策树(系列三)

前面已经讲到,关于数据类型,我们主要可以把其分为两类,连续型数据和离散型数据。在面对不同数据时,决策树也可以分为两大类型:分类决策树和回归决策树。前者主要用于处理离散型数据,后者主要用于处理连续型数据。

1.原理概述

不管是回归决策树还是分类决策树,都会存在两个核心问题:

  • 如何选择划分点?
  • 如何决定叶节点的输出值?

一个回归树对应着输入空间(即特征空间)的一个划分以及在划分单元上的输出值。分类树中,我们采用信息论中的方法,通过计算选择最佳划分点。

而在回归树中,采用的是启发式的方法。**假如我们有n个特征,每个特征有 s i ( i ∈ ( 1 , n ) ) s_i(i∈(1,n)) si(i(1,n))个取值,那我们遍历所有特征,尝试该特征所有取值,对空间进行划分,直到取到特征 j 的取值 s,使得损失函数最小,这样就得到了一个划分点。**描述该过程的公式如下:

损失

假设将输入空间划分为M个单元: R 1 , R 2 , . . . , R m R_1,R_2,...,R_m R1,R2,...,Rm 那么每个区域的输出值就是: c m = a v g ( y i ∣ x i ∈ R m ) c_m=avg(y_i|x_i∈R_m) cm=avg(yixiRm)也就是该区域内所有点y值的平均数。

举例:

如下图,假如我们想要对楼内居民的年龄进行回归,将楼划分为3个区域 R 1 , R 2 , R 3 R_1,R_2,R_3 R1,R2,R3(红线),那么 R 1 R_1 R1的输出就是第一列四个居民年龄的平均值, R 2 R_2 R2的输出就是第二列四个居民年龄的平均值, R 3 R_3 R3的输出就是第三、四列八个居民年龄的平均值。

image-20191114144520332

2.算法描述(小结)

  • 输入:训练数据集D:
  • 输出:回归树 f ( x ) f(x) f(x).
  • 在训练数据集所在的输入空间中,递归的将每个区域划分为两个子区域并决定每个子区域上的输出值,构建二叉决策树:
    • (1)选择最优切分特征 j j j与切分点 s s s,求解image-20191113142934512遍历特征 j j j,对固定的切分特征 j j j扫描切分点 s s s,选择使得上式达到最小值的对 ( j , s ) (j,s) (j,s).
    • (2)用选定的对 ( j , s ) (j,s) (j,s)划分区域并决定相应的输出值:image-20191113143419846
    • (3)继续对两个子区域调用步骤(1)和(2),直至满足停止条件。
    • (4)将输入空间划分为M个区域 R 1 , R 2 , … … , R M R_1, R_2, ……, R_M R1,R2,,RM, 生成决策树:image-20191113143611418

3.简单实例

为了易于理解,接下来通过一个简单实例加深对回归决策树的理解。

训练数据见下表,目标是得到一棵最小二乘回归树。

x12345678910
y5.565.75.916.46.87.058.98.799.05

3.1 实例计算过程

确定第一个问题:选择最优切分变量j与最优切分点s

在本数据集中,只有一个特征,因此最优切分特征自然是x。

确定第二个问题:我们考虑9个切分点 [ 1.5 , 2.5 , 3.5 , 4.5 , 5.5 , 6.5 , 7.5 , 8.5 , 9.5 ] [1.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.5] [1.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.5]

损失函数定义为平方损失函数 L o s s ( y , f ( x ) ) = ( f ( x ) − y ) 2 Loss(y,f(x))=(f(x)−y)^2 Loss(y,f(x))=(f(x)y)2,将上述9个切分点依此代入下面的公式,其中 c m = a v g ( y i ∣ x i ∈ R m ) c_m=avg(y_i|x_i∈R_m) cm=avg(yixiRm)

例如,取 s=1.5。此时 R 1 = 1 , R 2 = 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 R_1={1},R_2={2,3,4,5,6,7,8,9,10} R1=1,R2=2,3,4,5,6,7,8,9,10,这两个区域的输出值分别为:
c 1 = 5.56 , c 2 = ( 5.7 + 5.91 + 6.4 + 6.8 + 7.05 + 8.9 + 8.7 + 9 + 9.05 ) / 9 = 7.50 c_1=5.56,c_2=(5.7+5.91+6.4+6.8+7.05+8.9+8.7+9+9.05)/9=7.50 c1=5.56,c2=(5.7+5.91+6.4+6.8+7.05+8.9+8.7+9+9.05)/9=7.50

得到下表:

s1.52.53.54.55.56.57.58.59.5
c15.565.635.725.896.076.246.626.887.11
c27.57.737.998.258.548.918.929.039.05

c 1 , c 2 c1,c2 c1c2的值代入到上式,如: m ( 1.5 ) = 0 + 15.72 = 15.72 m(1.5)=0+15.72=15.72 m(1.5)=0+15.72=15.72。同理,可获得下表:

s1.52.53.54.55.56.57.58.59.5
m(s)15.7212.078.365.783.911.938.0111.7315.74

显然取 s=6.5时,m(s)最小。因此,第一个划分变量j=x,s=6.5

  1. 用选定的(j,s)划分区域,并决定输出值;两个区域分别是: R 1 = { 1 , 2 , 3 , 4 , 5 , 6 } , R 2 = { 7 , 8 , 9 , 10 } R1=\{1,2,3,4,5,6\},R2=\{7,8,9,10\} R1={1,2,3,4,5,6},R2={7,8,9,10}输出值 c m = a v g ( y i ∣ x i ∈ R m ) , c 1 = 6.24 , c 2 = 8.91 c_m=avg(yi|xi∈Rm),c1=6.24,c2=8.91 cm=avg(yixiRm),c1=6.24,c2=8.91
  2. 对R1继续进行划分:
x123456
y5.565.75.916.46.87.05

取切分点[1.5,2.5,3.5,4.5,5.5],则各区域的输出值c如下表

s1.52.53.54.55.5
c15.565.635.725.896.07
c26.376.546.756.937.05

计算m(s):

s1.52.53.54.55.5
m(s)1.30870.7540.27710.43681.0644

s=3.5时,m(s)最小。

  1. 生成回归树

假设在生成3个区域之后停止划分,那么最终生成的回归树形式如下:

image-20191203101150898

3.2 回归决策树和线性回归对比

import numpy as np
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeRegressor
from sklearn import linear_model

# Data set
x = np.array(list(range(1, 11))).reshape(-1, 1)
y = np.array([5.56, 5.70, 5.91, 6.40, 6.80, 7.05, 8.90, 8.70, 9.00, 9.05]).ravel()

# Fit regression model
model1 = DecisionTreeRegressor(max_depth=1)
model2 = DecisionTreeRegressor(max_depth=3)
model3 = linear_model.LinearRegression()
model1.fit(x, y)
model2.fit(x, y)
model3.fit(x, y)

# Predict
X_test = np.arange(0.0, 10.0, 0.01)[:, np.newaxis]
y_1 = model1.predict(X_test)
y_2 = model2.predict(X_test)
y_3 = model3.predict(X_test)

# Plot the results
plt.figure()
plt.scatter(x, y, s=20, edgecolor="black",
            c="darkorange", label="data")
plt.plot(X_test, y_1, color="cornflowerblue",
         label="max_depth=1", linewidth=2)
plt.plot(X_test, y_2, color="yellowgreen", label="max_depth=3", linewidth=2)
plt.plot(X_test, y_3, color='red', label='liner regression', linewidth=2)
plt.xlabel("data")
plt.ylabel("target")
plt.title("Decision Tree Regression")
plt.legend()
plt.show()

结果展示

image-20191203101309057

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

【文言】

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值