CART之回归树构建

转自:https://cethik.vip/2016/09/21/machineCAST/


问题提出

在看李航的《统计学习方法》的决策树那一章节,提到了CART算法,讲解了如何分别构建分类树和回归树,文章的侧重点好像在分类树上,对回归树只是提了一下,让我很是不解,于是google了下,大家基本上都在讲怎么构建CART分类树,好像回归树不存在似得,所以根据我手头现有的资料和查找到的文献,为大家以一个例子的方式讲解如何生存CART回归树。

概念

先来回顾下关于CART回归树概念性的东西吧。

首先要强调的是CART假设决策树是二叉树,内部结点特征的取值只有“是”和“否”,左分支是取值为“是”的分支,有分支则相反。这样的决策树等价于递归地二分每个特征。

CART生成

决策树的生成就是递归地构建二叉决策树的过程,对回归树用平方误差最小化准则,对分类树用基尼指数最小化准则,进行特征选择,生成二叉树

回归树的生成

最小二叉回归树生成算法

输入:训练数据集D;
输出:回归树f(x)

算法:

在训练数据集所在的输入空间中,递归地将每个区域划分为两个子区域并决定每个子区域上输出值,构建二叉决策树:

  1. 择最优切分变量j切分点s,求解
    minj,s[minc1xiR1(j,s)(yic1)2+minc2xiR2(j,s)(yic2)2]minj,s[minc1∑xi∈R1(j,s)(yi−c1)2+minc2∑xi∈R2(j,s)(yi−c2)2]
    遍历变量jj,对固定的切分变量jj扫描切分点ss,选择使上式最小值的对(j,s)(j,s)。其中RmRm是被划分的输入空间,cmcm是空间RmRm对应的固定输出值。
  2. 用选定的对(j,s)(j,s)划分区域并决定相应的输出值:
    R1(j.s)={xx(j)s},R2(j,s)={xx(j)>sc^m=1NmxiRm(j,s)yi,xRm,m=1,2R1(j.s)={x∣x(j)≤s},R2(j,s)={x∣x(j)>sc^m=1Nm∑xi∈Rm(j,s)yi,x∈Rm,m=1,2
  3. 继续对两个子区域调用步骤(1),(2),直至满足停止条件。
  4. 将输入空间划分为M个区域R1,R2,,RMR1,R2,…,RM,生成决策树:
    f(x)=m=1Mc^mI(xR)f(x)=∑m=1Mc^mI(x∈R)

示例

上面的东西有点难以理解,下面举个例子来说明。

训练数据见下表,xx的取值范围为区间[0.5,10.5][0.5,10.5],yy的取值范围为区间[5.0,10.0][5.0,10.0],学习这个回归问题的最小二叉回归树。

xixi 1 2 3 4 5 6 7 8 9 10
yiyi 5.56 5.70 5.91 6.40 6.80 7.05 8.90 8.70 9.00 9.05

首先来看这个优化问题

minj,s[minc1xiR1(j,s)(yic1)2+minc2xiR2(j,s)(yic2)2]minj,s[minc1∑xi∈R1(j,s)(yi−c1)2+minc2∑xi∈R2(j,s)(yi−c2)2]
求解训练数据的切分点ss:
R1={xxs},R2={xx>s}R1={x∣x≤s},R2={x∣x>s}
容易求得在R1R1,R2R2内部使得平方损失误差达到最小值的c1c1,c2c2为:
c1=1N1xiR1yi,c2=1N2xiR2yic1=1N1∑xi∈R1yi,c2=1N2∑xi∈R2yi
这里N1N1,N2N2R1R1,R2R2的样本点数。

求训练数据的切分点,根据所给数据,考虑如下切分点:

1.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.51.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.5
对各切分点,不难求出相应的R1R1 , R2R2 , c1c1 , c2c2
m(s)=minj,s[minc1xiR1(j,s)(yic1)2+minc2xiR2(j,s)(yic2)2]m(s)=minj,s[minc1∑xi∈R1(j,s)(yi−c1)2+minc2∑xi∈R2(j,s)(yi−c2)2]
例如,当s=1.5s=1.5时,R1={1}R1={1} , R2={2,3,,10}R2={2,3,…,10} , c1=5.56c1=5.56 , c2=7.50c2=7.50 ,
m(s)=minj,s[minc1xiR1(j,s)(yic1)2+minc2xiR2(j,s)(yic2)2]=0+15.72=15.72m(s)=minj,s[minc1∑xi∈R1(j,s)(yi−c1)2+minc2∑xi∈R2(j,s)(yi−c2)2]=0+15.72=15.72
现将ssm(s)m(s)的计算结果列表如下:
ss 1.5 2.5 3.5 4.5 5.5 6.5 7.5 8.5 9.5
m(s)m(s) 15.72 12.07 8.36 5.78 3.91 1.93 8.01 11.73 15.74

由上表可知,当x=6.5x=6.5的时候达到最小值,此时R1={1,2,,6}R1={1,2,…,6} , R2=7,8,9,10R2=7,8,9,10 , c1=6.24c1=6.24 , c2=8.9c2=8.9 , 所以回归树T1(x)T1(x)为:

T1(x)={6.24,8.91,x<6.5x6.5T1(x)={6.24,x<6.58.91,x≥6.5

f1(x)=T1(x)f1(x)=T1(x)
f1(x)f1(x)拟合训练数据的残差见下表,表中r2i=yif1(xi),i=1,2,,10r2i=yi−f1(xi),i=1,2,…,10
xixi 1 2 3 4 5 6 7 8 9 10
yiyi -0.68 -0.54 -0.33 0.16 0.56 0.81 -0.01 -0.21 0.09 0.14

f1(x)f1(x)拟合训练数据的平方误差:

L(y,f1(x))=i=110(yif1(xi))2=1.93L(y,f1(x))=∑i=110(yi−f1(xi))2=1.93
第2步求T2(x)T2(x).方法与求T1(x)T1(x)一样,只是拟合的数据是上表的残差,可以得到:
T2(x)={0.52,0.22,x<3.5x3.5T2(x)={−0.52,x<3.50.22,x≥3.5

f2(x)=f1(x)+T2(x)=5.72,6.46,9.13,x<3.53.5x<6.5x6.5f2(x)=f1(x)+T2(x)={5.72,x<3.56.46,3.5≤x<6.59.13,x≥6.5
f2(x)f2(x)拟合训练数据的平方误差是:
L(y,f2(x))=i=110(yif2(xi))2=0.79L(y,f2(x))=∑i=110(yi−f2(xi))2=0.79
继续求得
T3(x)={0.15,0.22,x<6.5x6.5L(y,f3(x))=0.47,T3(x)={0.15,x<6.5−0.22,x≥6.5L(y,f3(x))=0.47,

T4(x)={0.16,0.11,x<4.5x4.5L(y,f3(x))=0.30,T4(x)={−0.16,x<4.50.11,x≥4.5L(y,f3(x))=0.30,

T5(x)={0.07,0.11,x<6.5x6.5L(y,f3(x))=0.23,T5(x)={0.07,x<6.5−0.11,x≥6.5L(y,f3(x))=0.23,

T6(x)={0.15,0.04,x<2.5x2.5T6(x)={−0.15,x<2.50.04,x≥2.5

f6(x)=f5(x)+T6(x)=T1(x)++T5(x)+T6(x)=5.63,5.82,6.56,6.83,8.95,x<2.52.5x<3.53.5x<4.54.5x<6.5x6.5f6(x)=f5(x)+T6(x)=T1(x)+…+T5(x)+T6(x)={5.63,x<2.55.82,2.5≤x<3.56.56,3.5≤x<4.56.83,4.5≤x<6.58.95,x≥6.5
f6(x)f6(x)拟合训练数据的平方损失误差是
L(y,f6(x))=i=110(yif6(xi))2=0.71L(y,f6(x))=∑i=110(yi−f6(xi))2=0.71
假设此时已经满足误差要求,那么f(x)=f6(x)f(x)=f6(x)即为所求的回归树。


### 使用CART算法构建决策树回归模型 CART(Classification and Regression Trees)是一种经典的决策树算法,可以用于解决分类回归问题。在回归任务中,CART通过递归分裂数据集,以最小化每个节点的不纯度来构建一棵二叉树。以下是如何使用CART算法构建决策树回归模型的具体步骤。 #### 1. 数据准备 首先需要准备好训练数据,包括特征目标变量。通常将数据划分为训练集测试集,以便评估模型性能。 ```python from sklearn.model_selection import train_test_split import pandas as pd # 假设加载一个CSV文件作为示例数据 data = pd.read_csv('your_data.csv') # 分离特征目标变量 X = data.drop('target_column', axis=1) # 特征 y = data['target_column'] # 目标变量 # 将数据划分为训练集测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) ``` #### 2. 构建CART回归模型 使用Scikit-learn库中的`DecisionTreeRegressor`类,可以轻松地实现CART回归模型。该类默认使用均方误差(MSE)作为分裂准则。 ```python from sklearn.tree import DecisionTreeRegressor # 创建决策树回归模型实例 model = DecisionTreeRegressor(random_state=42) # 拟合训练数据 model.fit(X_train, y_train) ``` #### 3. 模型评估 训练完成后,可以通过测试集评估模型性能。常用的回归评估指标包括均方误差(MSE)决定系数(R²)。 ```python from sklearn.metrics import mean_squared_error, r2_score # 在测试集上进行预测 y_pred = model.predict(X_test) # 计算均方误差 mse = mean_squared_error(y_test, y_pred) print(f"Mean Squared Error: {mse}") # 计算R²得分 r2 = r2_score(y_test, y_pred) print(f"R^2 Score: {r2}") ``` #### 4. 模型保存与加载 训练好的模型可以保存到磁盘,以便后续直接加载并使用。 ```python from joblib import dump, load # 保存模型 dump(model, 'cart_regression_model.joblib') # 加载模型 loaded_model = load('cart_regression_model.joblib') ``` #### 5. 进行预测 加载模型后,可以使用它对新数据进行预测。 ```python # 示例预测对象 jack = { 'Feature1': [value1], 'Feature2': [value2], ... } # 转换为DataFrame格式 df_predict = pd.DataFrame(jack) # 进行预测 prediction = loaded_model.predict(df_predict) print(prediction) ``` #### 6. 参数调优 可以通过调整超参数来优化模型性能,例如设置最大深度、最小样本分割数等。 ```python # 创建带有自定义参数的决策树回归模型 model = DecisionTreeRegressor(max_depth=5, min_samples_split=10, random_state=42) # 再次拟合数据 model.fit(X_train, y_train) ``` #### 7. 树结构可视化 如果希望直观查看决策树的结构,可以使用`plot_tree`函数进行可视化。 ```python from sklearn.tree import plot_tree import matplotlib.pyplot as plt plt.figure(figsize=(20,10)) plot_tree(model, feature_names=X.columns, filled=True, fontsize=10) plt.show() ``` ###
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值