机器学习(3)---决策树(回归树)


一、概述

1.1 介绍

 1. 回归树通过将输入空间划分为多个矩形区域,并在每个区域内拟合一个简单的线性模型来建立预测模型。
 2. 回归树的构建过程可以概括为以下几个步骤:

  • 选择一个特征和一个切分点,将数据集划分为两个子集。
  • 对于每个子集,计算目标变量的均值作为预测值。
  • 选择最佳的特征和切分点,使得划分后的子集的预测值与真实值之间的误差最小化。
  • 重复以上步骤,直到达到预定的停止条件。

1.2 回归树和分类树区别

 回归树用于预测连续型目标变量,如房价、销售额等。而分类树用于预测离散型目标变量,如二分类、多分类等。

二、重要参数,属性及接口

2.1 criterion

 1. 回归树衡量分枝质量的指标,支持的标准有三种:
 (1)输入"mse"使用均方误差mean squared error(MSE),父节点和叶子节点之间的均方误差的差额将被用来作为特征选择的标准,这种方法通过使用叶子节点的均值来最小化L2损失。
 (2)输入“friedman_mse”使用费尔德曼均方误差,这种指标使用弗里德曼针对潜在分枝中的问题改进后的均方误差。
 (3)输入"mae"使用绝对平均误差MAE(mean absolute error),这种指标使用叶节点的中值来最小化L1损失。
 2. 属性中最重要的依然是feature_importances_,接口依然是apply, fit, predict, score最核心。
 3. MSE公式如下:

在这里插入图片描述
注解:其中N是样本数量,i是每一个数据样本,fi是模型回归出的数值,yi是样本点i实际的数值标签。所以MSE的本质,其实是样本真实数据与回归结果的差异。在回归树中,MSE不只是我们的分枝质量衡量指标,也是我们最常用的衡量回归树回归质量的指标,当我们在使用交叉验证,或者其他方式获取回归树的结果时,我们往往选择均方误差作为我们的评估(在分类树中这个指标是score代表的预测准确率)。在回归中,我们追求的是,MSE越小越好。然而,回归树的接口score返回的是R平方,并不是MSE。
 4. R平方被定义如下:

在这里插入图片描述
注解:其中u是残差平方和(MSE * N),v是总平方和,N是样本数量,i是每一个数据样本,fi是模型回归出的数值,yi 是样本点i实际的数值标签。y帽是真实数值标签的平均数。R平方可以为正为负(如果模型的残差平方和远远大于模型的总平方和,模型非常糟糕,R平方就会为负),而均方误差永远为正。
 5. 虽然均方误差永远为正,但是sklearn当中使用均方误差作为评判标准时,却是计算负均方误差(neg_mean_squared_error)。这是因为sklearn在计算模型评估指标的时候,会考虑指标本身的性质,均方误差本身是一种误差,所以被sklearn划分为模型的一种损失(loss),因此在sklearn当中,都以负数表示。真正的均方误差MSE的数值,其实就是neg_mean_squared_error去掉负号的数字。

2.2 回归树如何工作

 1. 一个数据集代码块举例:

from sklearn.datasets import load_boston #波士顿房价数据集
from sklearn.model_selection import cross_val_score #选择交叉验证
from sklearn.tree import DecisionTreeRegressor #回归树
boston = load_boston()
regressor = DecisionTreeRegressor(random_state=0) #实例化
print(cross_val_score(regressor, boston.data, boston.target, cv=10, scoring = "neg_mean_squared_error"))

 2. 交叉验证:交叉验证是用来观察模型的稳定性的一种方法,我们将数据划分为n份,依次使用其中一份作为测试集,其他n-1份作为训练集,多次计算模型的精确性来评估模型的平均准确程度。训练集和测试集的划分会干扰模型的结果,因此用交叉验证n次的结果求出的平均值,是对模型效果的一个更好的度量。
在这里插入图片描述

三、用回归树拟合正弦曲线

3.1 绘制正弦曲线

 运行下面的代码块可得到一个正弦曲线。

from sklearn.model_selection import cross_val_score 
from sklearn.tree import DecisionTreeRegressor #回归树
import numpy as np
import matplotlib.pyplot as plt
rng = np.random.RandomState(1) #随机数种子
X = np.sort(5 * rng.rand(80,1), axis=0)
y = np.sin(X).ravel() #生成正弦曲线y值
plt.figure()
plt.scatter(X, y, s=20, edgecolor="black",c="darkorange", label="data")
plt.show()

在这里插入图片描述

3.2 为正弦曲线添加噪声

 运行下面的代码块可得到一个含噪声的正弦曲线。

y[::5] += 3 * (0.5 - rng.rand(16))

在这里插入图片描述

3.3 实例化训练模型

regr_1 = DecisionTreeRegressor(max_depth=2)
regr_2 = DecisionTreeRegressor(max_depth=5)
regr_1.fit(X, y)
regr_2.fit(X, y)

3.4 测试集导入模型

#np.arrange(开始点,结束点,步长),np.newaxis升维
X_test = np.arange(0.0, 5.0, 0.01)[:, np.newaxis]
y_1 = regr_1.predict(X_test)
y_2 = regr_2.predict(X_test)

3.5 绘制图像

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=2", linewidth=2) #画折线图
plt.plot(X_test, y_2, color="yellowgreen", label="max_depth=5", linewidth=2) #画折线图
plt.xlabel("data") #横坐标叫数据
plt.ylabel("target") #纵坐标叫标签
plt.title("Decision Tree Regression") #标题
plt.legend() #显示图例
plt.show()

在这里插入图片描述
可见:回归树学习了近似正弦曲线的局部线性回归。我们可以看到,如果树的最大深度(由max_depth参数控制)设置得太高,则决策树学习得太精细,它从训练数据中学了很多细节,包括噪声得以呈现,从而使模型偏离真实的正弦曲线,形成过拟合。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

冒冒菜菜

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

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

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

打赏作者

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

抵扣说明:

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

余额充值