sklearn学习笔记(菜菜——回归树DTR)

sklearn学习笔记(菜菜——回归树DTR)

一、回归树相关知识

'''
mse:均方误差mean squared error(MSE),
父节点和叶子节点之间的均方误差的差额将被用来作为特征选择的标准,
这种方法通过使用叶子节点的均值来最小化L2损失

friedman_mse:费尔德曼均方误差,
这种指标使用弗里德曼针对潜在分枝中的问题改进后的均方误差

mae:绝对平均误差MAE(mean absolute error),
这种指标使用叶节点的中值来最小化L1损失,
属性中最重要的依然是feature_importances_,接口依然是apply, fit, predict, score最核心。
'''

'''
在回归树中,MSE不只是我们的分枝质量衡量指标,也是我们最常用的衡量回归树回归质量的指标,
在回归中,我们追求的是,MSE越小越好。
然而,回归树的接口score返回的是R平方,并不是MSE。

虽然均方误差永远为正,但是sklearn当中使用均方误差作为评判标准时,却是计算"负均方误差"(neg_mean_squared_error)
真正的均方误差MSE的数值,其实就是neg_mean_squared_error去掉负号的数字
'''

二、代码

(1)数据概况

使用boston数据集

from sklearn.datasets import load_boston
#使用波士顿房价数据
boston=load_boston()

boston

在这里插入图片描述

从target看出,标签不再是离散型数字,而是连续型


print(boston.data.shape)
print(boston.target.shape)

在这里插入图片描述


(2)回归树

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)

#交叉验证
'''
cross_val_score用于执行交叉验证并返回每个测试集上的评分,一个包含每个测试集上评分的数组
可以根据需要选择不同的评分指标,例如 'accuracy'、'precision'、'recall' 等

cross_val_score 函数参数:
estimator (估计器),
X (特征矩阵),
y (目标变量),
cv (交叉验证折数),
scoring (评分指标),
n_jobs (并行处理数),
verbose (详细程度),
fit_params (拟合参数)
'''
cross_val_score(regressor,boston.data,boston.target,cv=10,
                #负均方误差,越近0越好(score默认R平方,其越接近1越好)
                scoring="neg_mean_squared_error"
                )

在这里插入图片描述


(3)一维回归图像绘制

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

#创建一条含有噪声的正弦曲线
'''
基本思路:
先创建一组随机的,分布在0~5上的横坐标轴的取值(x),
然后将这一组值放到sin函数中去生成纵坐标的值(y),
接着再到y上去添加噪声
(用numpy库生成正弦曲线)
'''

#创建一个特定种子的随机数生成器
'''
np.random.RandomState是 NumPy 中用于创建伪随机数生成器(Pseudo-random number generator)的类
这个类允许创建一个特定种子的随机数生成器,以便在相同种子下生成相同的随机数序列
这样的控制随机性的方式对于实验的可重复性和结果的稳定性很有用
'''
rng=np.random.RandomState(1)

#生成数据
'''
rng.rand(x,[y])用于生成指定形状的在 [0.0, 1.0) 范围内均匀分布的随机数
x:生成的随机数的行数(个数)
y(可选):生成的随机数的列数。如果不指定y,则生成一个包含x个随机数的一维数组
'''

'''
np.sort()是NumPy 中用于对数组进行排序的函数,
它返回数组的排序副本,而不修改原始数组

参数:
axis(指定排序的轴,对多维数组进行排序时使用。默认是 -1,表示沿着最后一个轴排序)
kind(指定排序算法的种类,可以是 'quicksort'、'mergesort'、'heapsort' 中的一个。默认是 'quicksort')
order(用于结构化数组,指定排序的字段)
'''
x=np.sort(5*rng.rand(80,1),axis=0)
print("x=",x)
print("------------------------------------------------------------------")
'''
sin() 函数生成一个正弦函数的数组
ravel() 函数用于转换为一维数组
'''
y=np.sin(x).ravel()
'''
对数组 y 进行修改,对每隔5个元素的位置上的值,加上一些随机噪声
'''
y[::5]+=3*(0.5-rng.rand(16))
print("y=",y)

在这里插入图片描述
在这里插入图片描述


#实例化&训练模型
regr_1=DecisionTreeRegressor(max_depth=2)
regr_2=DecisionTreeRegressor(max_depth=5)
regr_1.fit(x,y)
regr_2.fit(x,y)

#测试集导入模型,预测结果
'''
np.arange(0.0, 5.0, 0.01): 创建一个从0.0到5.0,以0.01为步长的一维数组

[:, np.newaxis]: 使用切片和 np.newaxis 将一维数组变成一个列向量(二维数组),
其中
 : 表示选择所有行,
 np.newaxis 表示在第二个维度上添加一个新的轴,从而将一维数组变为列向量。
'''
x_test=np.arange(0.0,5.0,0.01)[:,np.newaxis]
print("x_test",x_test)
print("---------------------------------------------------------------")
y_1=regr_1.predict(x_test)
y_2=regr_2.predict(x_test)

在这里插入图片描述


#绘制图像
'''
plt.figure():用于创建一个新的图形Figure
可以在其中添加子图subplots
'''
plt.figure()
'''
plt.scatter:用于绘制散点图
参数:
x: 散点图的横坐标数据。
y: 散点图的纵坐标数据。
s: 点的大小。可以是一个标量,表示所有点的相同大小,也可以是一个数组,表示每个点的大小。
edgecolor: 点的边缘颜色。
c: 点的颜色。可以是一个颜色名称,也可以是一个颜色的 RGB 或 RGBA 值。
label: 用于图例的标签,表示这些散点的标签。
'''
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参数控制)设置得太高,则决策树学习得太精细,它从训练数据中学了很多细节,包括噪声得呈现,从而使模型偏离真实的正弦曲线,形成过拟合。


  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值