【机器学习笔记】【决策树】【回归树】

目录

一、什么是回归树

回归树的衡量指标

什么是交叉验证

二、交叉验证的简单使用

1.导入相关的数据包

 2.查看我们的数据

3.实例化并使用交叉验证

三、一维回归的图像绘制

1.导入相关的库

2.创建一条含有噪声的正弦曲线

了解ravel降维的用法 

3.创建回归模型

4.导入测试集 

5.预测测试集的数据

6.用预测出来的数据绘制图像 


一、什么是回归树

DecisionTreeRegressor回归树
class sklearn.tree.DecisionTreeRegressor (criterion=’mse’, splitter=’best’, max_depth=None,
min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None,
random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, presort=False)
几乎所有参数,属性及接口都和分类树一模一样。需要注意的是,在回归树种,没有标签分布是否均衡的问题,因此没有class_weight这样的参数。

回归树的衡量指标

criterion
对于回归树来说是处理连续型变量和分类型变量,所以不再是像之前分类树的不纯度指标了(1.信息熵,2.基尼系数),而是采用下面三种衡量回归树分枝质量的指标
1)输入"mse"使用均方误差mean squared error(MSE),父节点和叶子节点之间的均方误差的差额将被用来作为特征选择的标准,这种方法通过使用叶子节点的均值来最小化L2损失
2)输入“friedman_mse”使用费尔德曼均方误差,这种指标使用弗里德曼针对潜在分枝中的问题改进后的均方误差
3)输入"mae"使用绝对平均误差MAE(mean absolute error),这种指标使用叶节点的中值来最小化L1损失属性中最重要的依然是feature_importances_,接口依然是apply, fit, predict, score最核心。

(mae在0.20等更新的版本里可能才会有)
这些计算的方法在我们使用sklearn的时候是无法干预的

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

其中u是残差平方和(MSE * N),v是总平方和,N是样本数量,i是每一个数据样本,fi是模型回归出的数值,yi是样本点i实际的数值标签。y帽是真实数值标签的平均数。R平方可以为正为负(如果模型的残差平方和远远大于模型的总平方和,模型非常糟糕,R平方就会为负),而均方误差永远为正。

值得一提的是,虽然均方误差永远为正,但是sklearn当中使用均方误差作为评判标准时,却是计算”负均方误差“(neg_mean_squared_error)。这是因为sklearn在计算模型评估指标的时候,会考虑指标本身的性质,均方误差本身是一种误差,所以被sklearn划分为模型的一种损失(loss),因此在sklearn当中,都以负数表示。真正的均方误差MSE的数值,其实就是neg_mean_squared_error去掉负号的数字。

什么是交叉验证

由于我们的数据都是在我们的训练集上跑出来的,从而形成了我们的模型,但是我们知道数据集的划分都是随机的,我们怎么能够保证我们当前的模型在其他的数据集上跑出来的结果还是相似的呢?怎么才能知道我们当前模型的泛化性到底有多强呢?

交叉验证是用来观察模型的稳定性的一种方法,我们将数据划分为n份,依次使用其中一份作为测试集,其他n-1份作为训练集,多次计算模型的精确性来评估模型的平均准确程度。训练集和测试集的划分会干扰模型的结果,因此用交叉验证n次的结果求出的平均值,是对模型效果的一个更好的度量。
这就好比是我们之前的种苹果树的例子,我们同样多次做实验,然后求一个平均的效果,来看看我们的模型到底有多么稳定

二、交叉验证的简单使用

1.导入相关的数据包

#导入波士顿房价数据。因为回归处理的是连续性变量,而我们之前的红酒并不是连续性变量
from sklearn.datasets import load_boston
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeRegressor
#交叉验证cross_val_score的用法

 2.查看我们的数据

#查看波士顿房价
boston=load_boston()
boston

#查看波士顿房价的数据
boston.data

 

#查看波士顿数据集的特征矩阵,将标签取出来
boston.target

 

3.实例化并使用交叉验证

#实例化,regressor是回归的意思,
regressor = DecisionTreeRegressor(random_state=0)
#第一个参数是哦我们实例化好之后的模型
#第二个参数是完整的数据集的数据,不需要划分测试集和训练集
#因为我们的交叉验证会自动帮助我们划分测试集和训练集的,所以我们需要传一个完整的数据
#第三个参数是波士顿数据的标签,同样也是一个完整的标签,不用划分成测试集的标签和训练集的标签
#第四个参数cv是告诉我们的机器,交叉验证需要进行十次,将数据分成十份,每一次取一份作为我们的测试集,剩下的九份作为我们的训练集
#第五个参数scoring,交叉验证返回的结果是最后的分数打分,下面的代码也就是在说用neg_mean_squared_error对我们的数据集进行打分
#这里我们将我们的交叉验证划分为十份,也就是说我们会有10个不同的打分,如果不填写的话,默认打分是使用R^2,(数据结果越接近1越好)
#但是我们上述中所说的,我们回归最常用的是均方误差,并且最好用负的均方误差
cross_val_score(regressor, boston.data, boston.target, cv=10,
                scoring = "neg_mean_squared_error")

三、一维回归的图像绘制

1.导入相关的库

#实例:一维回归的图像绘制
#1.导入相关的库
#numpy是帮助我们生成图上需要的数据点的
import numpy as np
from sklearn.tree import DecisionTreeRegressor
#是用来画图的
import matplotlib.pyplot as plt

2.创建一条含有噪声的正弦曲线

在这一步,我们的基本思路是,先创建一组随机的,分布在0~5上的横坐标轴的取值(x),然后将这一组值放到sin函数中去生成纵坐标的值(y),接着再到y上去添加噪声。全程我们会使用numpy库来为我们生成这个正弦曲线。

#使用numpy生成一个随机数种子
rng = np.random.RandomState(1)
rng

 

#生成八十行一列的随机数,然后将每一个数据的值都乘上5,然后再将这些数据排序,axis=0,逐行按列进行排序
#为什么一定要生成一个二维的数据?
#因为到时候我们要把我们的八十行数据分成测试集和训练集,我们要把测试集中的数据导入回归树中,让回归树进行拟合
#但是拟合的这些接口都是需要传入二维的数据的,如果真的只有一个特征值的话,也需要使用reshape(-1,1)进行升维
X = np.sort(5 * rng.rand(80,1), axis=0)
X

#使用numpy中的正弦函数,但是这个正弦的数据我们希望是一维的,也就是说我们需要将其降维,也就是使用函数ravel(),将我们的数据降成一维
#X是我们的标签,x可以是多维的,可以是两列,但是我们的y不可以,因为我们处理的是单标签问题,所以我们的y的数据只能是一维的
y = np.sin(X).ravel()
y

 

#在Python中一维数组不分行列,对于下面的y只能说是带了80个数据的对象
y.shape

 

 

plt.figure()
#将我们的x,y的数据传入,s是散点图中点的大小,设置边框的颜色是黑色(edgecolor="black"),设置点的颜色是暗橙色的(c="darkorange"),标签是data,也就是纵坐标轴的名字
plt.scatter(X, y, s=20, edgecolor="black",c="darkorange", label="data")

#给我们的y数据加上噪声
#为什么要加上噪声?
#因为我们现实中真实的数据不可能都是符合我们上面的这么完全的sin函数的图像的,必然存在一些不符合情况的数据
#加上噪声的方法就是给其中的某一些数据加上或者减去一些数据,从而让部分数据偏离原来的sin函数的位置
#对y进行切片,按照步长5进行切片,每5个取一个数据,也就是取出来16个,每个数据都是间隔为5的
#我们让这些数据随机加上rng.rand(16),也就是十六个取出来的数据加上十六个对应位置的随机数
#为什么要用0.5去减去我们的随机数呢,因为我们的rand的取值是[0,1)数据,中值是0.5
#使用0.5减去之后就让有的数据是负,有的数据是正,这样的取值范围就变成了[-0.5,0.5)
#因为这个数很小,所以我们将这个数乘上3,将其变大一点
y[::5] += 3 * (0.5 - rng.rand(16))
y
#np.random.rand(数组结构),生成随机数组的函数

 

plt.figure()
plt.scatter(X, y, s=20, edgecolor="black",c="darkorange", label="data")

 

了解ravel降维的用法 

#了解降维函数ravel()的用法
#ravel()将n维的数据降成n-1维,多次运行的话可以一直降到一维为止
np.random.random((2,1))

np.random.random((2,1)).shape

 

np.random.random((2,1)).ravel()

 

np.random.random((2,1)).ravel().shape

 

3.创建回归模型

#这里我们建了两个不同的模型。因为我们想查看在不同的拟合效果下,回归树是怎么表现的
#最大深度小的话会限制模型对于训练集的拟合,剪枝越严重,可以防止过拟合
regr_1 = DecisionTreeRegressor(max_depth=2)
regr_2 = DecisionTreeRegressor(max_depth=5)
regr_1.fit(X, y)
regr_2.fit(X, y)

4.导入测试集 

#导入测试集
#np.arange是生成有序的数列,第一个点是起始点,第二个点是结束点,第三个点是步长,
#np.arange(0.0, 5.0, 0.01),也就是从0.0开始每加上0.01取一个数据,一直到4.99为止
#相当于是x轴上的无数个点
#为了将测试集放入我们的回归树中,我们的数据至少是二维的,所以我们需要对我们arange生成的一维的数据进行增维
#当然.reshape(-1,1)也可以增维
#但是我们也可以使用下面的[:, np.newaxis]
#np.newaxis就是用于升维的,如果是[:, np.newaxis],对于一维的数据,就会生成n行1列的二维数据集
#如果是[ np.newaxis,:]就会生成1行n列的数据
X_test = np.arange(0.0, 5.0, 0.01)[:, np.newaxis]
X_test

X_test.shape

 

5.预测测试集的数据

#将测试集导入我们的模型中进行使用,这里我们用到了回归树的接口predict
#predict也就是输入测试集之后,得到每个测试样本点的回归(或者分类的结果)
#也就是输入x,他给你预测y
#因为这里我们有两个模型所以需要做两次
y_1 = regr_1.predict(X_test)
y_2 = regr_2.predict(X_test)
y_1

 

y_2

6.用预测出来的数据绘制图像 

#创建画布
plt.figure()
#将我们的x,y的数据传入,s是散点图中点的大小,设置边框的颜色是黑色(edgecolor="black"),设置点的颜色是暗橙色的(c="darkorange"),标签是data,也就是纵坐标轴的名字
plt.scatter(X, y, s=20, edgecolor="black",c="darkorange", label="data")
#画折线图,分别传入x轴和y轴的数据,其一一对应,在画布上生成点,并且指定线的颜色,指定线的标签,设置线的宽度
#颜色分别为玉米花的蓝色和黄绿色
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()
#从下面的图中可以看到我们最大深度为2,也就是蓝色的线对于我们的数据拟合程度较好
#但是我们最大深度为5的线受到噪声的干扰比较大,模拟到了很多的噪音上
#所以最大深度为5的这一个模型发生了过拟合

 

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>