【skLearn 分类、回归算法】DecisionTreeRegressor 回归树



DecisionTreeRegressor 回归树

class sklearn.tree.DecisionTreeClassifier (criterion=’gini’, 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这样的参数。


① 重要参数、属性及接口

  • 回归树衡量分枝质量的指标,支持的标准有三种:

    • 1)输入"mse"使用均方误差mean squared error(MSE),父节点和叶子节点之间的均方误差的差额将被用来作为特征选择的标准,这种方法通过使用叶子节点的均值来最小化L2损失
      在这里插入图片描述
      其中N是样本数量,i是每一个数据样本,fi是模型回归出的数值,yi是样本点i实际的数值标签。所以MSE的本质是样本真实数据与回归结果的差异。在回归树中,MSE不只是我们的分枝质量衡量指标,也是我们最常用的衡量回归树回归质量的指标,当我们在使用交叉验证,或者其他方式获取回归树的结果时,我们往往选择均方误差作为我们的评估(在分类树中这个指标是score代表的预测准确率)。在回归中,我们追求的是,MSE越小越好。然而,回归树的接口 score返回的是R²,并不是MSE。R平方被定义如下:
      在这里插入图片描述
      其中u是残差平方和(MSE*N),v是总平方和,N是样本数量,i是每一个数据样本,fi是模型回归出的数值,yi是样本点i实际的数值标签y帽是真实数值标签的平均数。R平方可以为正为负(如果模型的残差平方和远远大于模型的总平方和,模型非常糟糕,R平方就会为负),而均方误差永远为正。
      ★ 值得一提的是,虽然均方误差永远为正但是 sklearn当中使用均方误差作为评判标准时,却是计算负均方误差“(neg mean_squared_error)这是因为 sklearn在计算模型评估指标的时候,会考虑指标本身的性质,均方误差本身是一种误差,所以被 sklearn划分为模型的一种损失(loss)因此在sklearn当中,都以负数表示。真正的均方误差MSE的数值,其实就是 neg meansquared_error去掉负号的数字。

    • 2)输入"friedman mse"使用费尔德曼均方误差,这种指标使用弗里德曼针对潜在分枝中的问题改进后的均方误差

    • 3)输入"mae"使用绝对平均误差mae(mean absolute error),这种指标使用叶节点的中值来最小化L1损失

  • 属性中最重要的依然是 feature_importances_,接口依然是 apply、fit 、predict、 score最核心。

返回顶部


② 交叉验证

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

def cross_val_score(estimator, X, y=None, groups=None, scoring=None, cv=None,
                    n_jobs=None, verbose=0, fit_params=None,
                    pre_dispatch='2*n_jobs', error_score=np.nan):
estimator:估计方法对象(分类器) --- 训练的模型
X:数据特征(Features)
y:数据标签(Labels)
soring:调用方法(包括accuracy和mean_squared_error等等)
cv:几折交叉验证
n_jobs:同时工作的cpu个数(-1代表全部)

♦ 简单使用

from sklearn.datasets import load_boston
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeRegressor

# 加载数据集
boston = load_boston()
x = boston.data
y = boston.target

# 构建模型
regressor = DecisionTreeRegressor(random_state=0)

# 交叉验证简单使用
cross_score = cross_val_score(regressor,x,y,cv=10,scoring="neg_mean_squared_error")
cross_score

交叉验证结果:
array([-16.41568627, -10.61843137, -18.30176471, -55.36803922,
       -16.01470588, -44.70117647, -12.2148    , -91.3888    ,
       -57.764     , -36.8134    ])

返回顶部


③ 实例:正弦一维回归的图像绘制

理想完美正弦数据集

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

# 生成随机种子
rng = np.random.RandomState(1)
# 利用随机种子始终生成相同的随机数 (0-5,80个)
# 生成的时候将其升维处理 ---- sklearn不支持一维数据
# 进行图像绘制时对x进行排序(从小往大开始绘图)
x = np.sort(5*rng.rand(80,1),axis=0)
# 理想正弦下的取值
# 绘图时作为value,应当转为一维数据
# ravel() 展开多维数组
y = np.sin(x).ravel()

plt.figure(figsize=(10,6))
plt.scatter(x,y,s=20,edgecolor='black',c='darkorange',label='data')
plt.show()

在这里插入图片描述

为数据集添加噪声

# 步长为5取出一个y值增加噪声
y[::5] += 3 * (0.5 - rng.rand(16))

# 再次绘图
plt.figure(figsize=(10,6))
plt.scatter(x,y,s=20,edgecolor='black',c='darkorange',label='data')
plt.show()

通过对数据集添加噪声,两图对比,很明显就有了区分

在这里插入图片描述

创建测试集

[:,np.newaxis] 用于将一维数组升维
[np.newaxis,:] 用于将一维数组升维后并转置

# 创建测试集
xtest = np.arange(0,5,0.01)[:,np.newaxis]
xtest

在这里插入图片描述

对两个模型进行预测

  • 利用predict接口进行预测
y_1 = regr_1.predict(xtest)
y_2 = regr_2.predict(xtest)

绘图

# 绘图
plt.figure(figsize=(10,6))
plt.scatter(x,y,s=20,edgecolor='black',c='darkorange',label='data')
plt.plot(xtest,y_1,c='red',linestyle='-',linewidth=1.5)
plt.plot(xtest,y_2,c='green',linestyle='-.',linewidth=1.5)
plt.legend(['regr_1','regr_2','origin'])
plt.title('Decision Tree Regression')
plt.show()
  • 通过图像可以看出,对于树深为2的模型而言整体拟合趋势是sin()函数,而对于树深为5的模型而言虽然整体趋势相似,但是存在过拟合
    在这里插入图片描述
    可见,回归树学习了近似正弦曲线的局部线性回归。我们可以看到,如果树的最大深度(由maxdepth参数控制)设置得太高,则决策树学习得太精细,它从训练数据中学了很多细节,包括噪声得呈现,从而使模型偏离真实的正弦曲线,形成过拟合。

返回顶部


猜你喜欢

转载自blog.csdn.net/qq_45797116/article/details/113547952