决策树算法是一种既可以用于分类,也可以用于回归的算法。

决策树回归是通过对输入特征的不断划分来建立一棵决策树,每一步划分都基于当前数据集的最优划分特征。
它的目标是最小化总体误差或最大化预测精度,其构建通常采用自上而下的贪心搜索方式,通过比较不同划分标准来选择最优划分。

决策树回归广泛应用于各种回归问题,如预测房价、股票价格、客户流失等。

1. 算法概述

决策树相关的诸多算法之中,有一种CART算法,全称是 classification and regression tree(分类与回归树)。
顾名思义,这个算法既可以用来分类,也可以用来回归,本篇主要介绍其在回归问题上的应用。

决策树算法的核心在于生成一棵决策树过程中,如何划分各个特征到树的不同分支上去。
CART算法是根据基尼系数(Gini)来划分特征的,每次选择基尼系数最小的特征作为最优切分点。

其中基尼系数的计算方法:\(gini(p) = \sum_{i=1}^n p_i(1-p_i)=1-\sum_{i=1}^n p_i^2\)

2. 创建样本数据

这次的回归样本数据,我们用 scikit-learn 自带的玩具数据集中的糖尿病数据集
关于玩具数据集的内容,可以参考:TODO

from sklearn.datasets import load_diabetes

# 糖尿病数据集
diabetes = load_diabetes()
X = diabetes.data
y = diabetes.target

这个数据集中大约有400多条数据。

3. 模型训练

训练之前,为了减少算法误差,先对数据进行标准化处理。

from sklearn import preprocessing as pp

# 数据标准化
X = pp.scale(X)
y = pp.scale(y)

接下来分割训练集测试集

from sklearn.model_selection import train_test_split

# 分割训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1)

然后用scikit-learn中的DecisionTreeRegressor模型来训练:

from sklearn.tree import DecisionTreeRegressor

# 定义决策树回归模型
reg = DecisionTreeRegressor(max_depth=2) # 训练模型
reg.fit(X_train, y_train) # 在测试集上进行预测
y_pred = reg.predict(X_test)

DecisionTreeRegressor的主要参数包括:

  1. criterion:用于衡量节点划分质量的指标。可以选择的值有'mse'(均方误差)或'mae'(平均绝对误差)。默认值为'mse',适用于大多数情况。
  2. splitter:用于决定节点如何进行划分的策略。可以选择的值有'best'(选择最佳划分)或'random'(随机划分)。默认值为'best'。
  3. max_depth:决策树的最大深度。默认值为None,表示不限制最大深度。增加最大深度有助于更好地拟合训练数据,但可能导致过拟合。
  4. random_state:用于设置随机数生成器的种子。默认值为None,表示使用随机数生成器。
  5. ccp_alpha:用于控制正则化强度的参数。默认值为None,表示不进行正则化。
  6. max_samples:用于控制每个节点最少需要多少样本才能进行分裂。默认值为None,表示使用整个数据集。
  7. min_samples_split:用于控制每个节点最少需要多少样本才能进行分裂。默认值为2,表示每个节点至少需要2个样本才能进行分裂。
  8. min_samples_leaf:用于控制每个叶子节点最少需要多少样本才能停止分裂。默认值为1,表示每个叶子节点至少需要1个样本才能停止分裂。
  9. min_weight_fraction_leaf:用于控制每个叶子节点最少需要多少样本的权重才能停止分裂。默认值为0.0,表示每个叶子节点至少需要0个样本的权重才能停止分裂。
  10. max_features:用于控制每个节点最多需要考虑多少个特征进行分裂。默认值为None,表示使用所有特征。
  11. max_leaf_nodes:用于控制决策树最多有多少个叶子节点。默认值为None,表示不限制叶子节点的数量。
  12. min_impurity_decrease:用于控制每个节点最少需要减少多少不纯度才能进行分裂。默认值为0.0,表示每个节点至少需要减少0个不纯度才能进行分裂。
  13. min_impurity_split:用于控制每个叶子节点最少需要减少多少不纯度才能停止分裂。默认值为None,表示使用min_impurity_decrease参数。
  14. class_weight:用于设置类别权重的字典或方法。默认值为None,表示使用均匀权重。

最后验证模型的训练效果:

from sklearn import metrics

# 在测试集上进行预测
y_pred = reg.predict(X_test) mse, r2, m_error = 0.0, 0.0, 0.0
y_pred = reg.predict(X_test)
mse = metrics.mean_squared_error(y_test, y_pred)
r2 = metrics.r2_score(y_test, y_pred)
m_error = metrics.median_absolute_error(y_test, y_pred) print("均方误差:{}".format(mse))
print("复相关系数:{}".format(r2))
print("中位数绝对误差:{}".format(m_error)) # 运行结果
均方误差:0.5973573097746598
复相关系数:0.5153160857515913
中位数绝对误差:0.5496418600646286

从预测的误差来看,训练的效果还不错
这里用DecisionTreeRegressor训练模型时使用了参数max_depth=2
我从max_depth=1逐个尝试到了max_depth=10,发现max_depth=2时误差最小。

4. 总结

决策树回归具有直观、易于理解、易于实现等优点。
生成的决策树可以直观地展示出输入特征与输出结果之间的关系,因此对于非专业人士来说也易于理解。
此外,决策树回归算法相对简单,易于实现,且对数据的预处理要求较低。

然而,决策树回归也存在一些缺点。
首先,它容易过拟合训练数据,特别是当训练数据量较小时;
其次,决策树的性能受划分标准选择的影响较大,不同的划分标准可能会导致生成的决策树性能差异较大;
此外,决策树回归在处理大规模数据时可能会比较耗时,因为需要遍历整个数据集进行训练和预测。

【scikit-learn基础】--『监督学习』之 决策树回归的更多相关文章

  1. Python基础『一』

    内置数据类型 数据名称 例子 数字: Bool,Complex,Float,Integer True/False; z=a+bj; 1.23; 123 字符串: String '123456' 元组: ...

  2. Python基础『二』

    目录 语句,表达式 赋值语句 打印语句 分支语句 循环语句 函数 函数的作用 函数的三要素 函数定义 DEF语句 RETURN语句 函数调用 作用域 闭包 递归函数 匿名函数 迭代 语句,表达式 赋值 ...

  3. 『cs231n』计算机视觉基础

    线性分类器损失函数明细: 『cs231n』线性分类器损失函数 最优化Optimiz部分代码: 1.随机搜索 bestloss = float('inf') # 无穷大 for num in range ...

  4. Scikit Learn: 在python中机器学习

    转自:http://my.oschina.net/u/175377/blog/84420#OSC_h2_23 Scikit Learn: 在python中机器学习 Warning 警告:有些没能理解的 ...

  5. [原创] 【2014.12.02更新网盘链接】基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装

    [原创] [2014.12.02更新网盘链接]基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装 joinlidong 发表于 2014-11-29 14:25:50 ...

  6. 『TensorFlow』专题汇总

    TensorFlow:官方文档 TensorFlow:项目地址 本篇列出文章对于全零新手不太合适,可以尝试TensorFlow入门系列博客,搭配其他资料进行学习. Keras使用tf.Session训 ...

  7. 『TensorFlow』批处理类

    『教程』Batch Normalization 层介绍 基础知识 下面有莫凡的对于批处理的解释: fc_mean,fc_var = tf.nn.moments( Wx_plus_b, axes=[0] ...

  8. 『TensorFlow』梯度优化相关

    tf.trainable_variables可以得到整个模型中所有trainable=True的Variable,也是自由处理梯度的基础 基础梯度操作方法: tf.gradients 用来计算导数.该 ...

  9. 『TensorFlow』模型保存和载入方法汇总

    『TensorFlow』第七弹_保存&载入会话_霸王回马 一.TensorFlow常规模型加载方法 保存模型 tf.train.Saver()类,.save(sess, ckpt文件目录)方法 ...

  10. 『计算机视觉』Mask-RCNN_从服装关键点检测看KeyPoints分支

    下图Github地址:Mask_RCNN       Mask_RCNN_KeyPoints『计算机视觉』Mask-RCNN_论文学习『计算机视觉』Mask-RCNN_项目文档翻译『计算机视觉』Mas ...

随机推荐

  1. SpringBoot进阶 CommandLineRunner 初始化配置

    在Spring Boot中,CommandLineRunner接口用于在应用程序启动后执行一些特定的命令行操作.通过实现CommandLineRunner接口,您可以在Spring Boot应用程序运 ...

  2. 如何配置.h头文件include“”相对路径

    编译工程时,找的是当前main.c文件下的.h文件,如果当前路径下没有就会报错,当前路径用.\表示,上一级目录用..\表示. 如果你的main.h文件在main.c的上一级目录中Include 文件夹 ...

  3. Shell 文件或目录操作符(-e、-d、-f、-r、-w、-x)

    操作符 操作符 含义-e 判断对象是否存在(Exist),若存在则结果为真-d 判断对象是否为目录(Directory),是则为真-f 判断对象是否为一般文件(File),是则为真-r 判断对象是否有 ...

  4. PostgreSQL学习笔记-3.基础知识:CROSS、INNER、LEFT OUTER、RIGHT OUTER、FULL OUTER、UNION

    PostgreSQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段. 在 PostgreSQL 中,JOIN 有五种连接类型: CROSS JOIN :交叉连接INNER ...

  5. python-手机自动化环境部署

    关于ui-automator,google的官方介绍: https://developer.android.google.cn/training/testing/ui-automator https: ...

  6. 关于fdisk -l

    摘取:https://blog.csdn.net/digitalkee/article/details/104226846 # fdisk -l Disk /dev/hda: 160.0 GB, 16 ...

  7. 关于Xftp7和Xshell7是最新版本但是报错这件事

    以win11为例,仅供参考.只能说捣鼓这么久还是建议各位转用MobaXterm. 先说一下,我的解决方法只能说是跳过问题,不是解决问题. <要继续使用此程序 您必须应用最新的更新或使用新版本&g ...

  8. idea的mybatis插件free mybatis plugin(或 Free MyBatis Tool),很好用

    为大家推荐一个idea的mybatis插件----free mybatis plugin(或 Free MyBatis Tool),很好用(个人觉得free mybatis plugin更好用一点,可 ...

  9. 从DPlayer说起,有哪些开源的H5播放器

    引言 ​ H5指的是HTML5,也就是介绍网页播放器(只是列出而已).首先我不是什么大佬,并没有完全体验过以下我会介绍的全部播放器:其次,因为我水平比较低,主要介绍拥有中文文档的播放器,不了解开发的朋 ...

  10. 二分图--AcWing刷题

    S 城现有两座监狱,一共关押着 N 名罪犯,编号分别为 1∼N. 他们之间的关系自然也极不和谐. 很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突. 我们用"怨气值"( ...