【scikit-learn基础】--『监督学习』之 决策树回归
决策树算法是一种既可以用于分类,也可以用于回归的算法。
决策树回归是通过对输入特征的不断划分来建立一棵决策树,每一步划分都基于当前数据集的最优划分特征。
它的目标是最小化总体误差或最大化预测精度,其构建通常采用自上而下的贪心搜索方式,通过比较不同划分标准来选择最优划分。
决策树回归广泛应用于各种回归问题,如预测房价、股票价格、客户流失等。
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的主要参数包括:
- criterion:用于衡量节点划分质量的指标。可以选择的值有'mse'(均方误差)或'mae'(平均绝对误差)。默认值为'mse',适用于大多数情况。
- splitter:用于决定节点如何进行划分的策略。可以选择的值有'best'(选择最佳划分)或'random'(随机划分)。默认值为'best'。
- max_depth:决策树的最大深度。默认值为None,表示不限制最大深度。增加最大深度有助于更好地拟合训练数据,但可能导致过拟合。
- random_state:用于设置随机数生成器的种子。默认值为None,表示使用随机数生成器。
- ccp_alpha:用于控制正则化强度的参数。默认值为None,表示不进行正则化。
- max_samples:用于控制每个节点最少需要多少样本才能进行分裂。默认值为None,表示使用整个数据集。
- min_samples_split:用于控制每个节点最少需要多少样本才能进行分裂。默认值为2,表示每个节点至少需要2个样本才能进行分裂。
- min_samples_leaf:用于控制每个叶子节点最少需要多少样本才能停止分裂。默认值为1,表示每个叶子节点至少需要1个样本才能停止分裂。
- min_weight_fraction_leaf:用于控制每个叶子节点最少需要多少样本的权重才能停止分裂。默认值为0.0,表示每个叶子节点至少需要0个样本的权重才能停止分裂。
- max_features:用于控制每个节点最多需要考虑多少个特征进行分裂。默认值为None,表示使用所有特征。
- max_leaf_nodes:用于控制决策树最多有多少个叶子节点。默认值为None,表示不限制叶子节点的数量。
- min_impurity_decrease:用于控制每个节点最少需要减少多少不纯度才能进行分裂。默认值为0.0,表示每个节点至少需要减少0个不纯度才能进行分裂。
- min_impurity_split:用于控制每个叶子节点最少需要减少多少不纯度才能停止分裂。默认值为None,表示使用min_impurity_decrease参数。
- 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基础】--『监督学习』之 决策树回归的更多相关文章
- Python基础『一』
内置数据类型 数据名称 例子 数字: Bool,Complex,Float,Integer True/False; z=a+bj; 1.23; 123 字符串: String '123456' 元组: ...
- Python基础『二』
目录 语句,表达式 赋值语句 打印语句 分支语句 循环语句 函数 函数的作用 函数的三要素 函数定义 DEF语句 RETURN语句 函数调用 作用域 闭包 递归函数 匿名函数 迭代 语句,表达式 赋值 ...
- 『cs231n』计算机视觉基础
线性分类器损失函数明细: 『cs231n』线性分类器损失函数 最优化Optimiz部分代码: 1.随机搜索 bestloss = float('inf') # 无穷大 for num in range ...
- Scikit Learn: 在python中机器学习
转自:http://my.oschina.net/u/175377/blog/84420#OSC_h2_23 Scikit Learn: 在python中机器学习 Warning 警告:有些没能理解的 ...
- [原创] 【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 ...
- 『TensorFlow』专题汇总
TensorFlow:官方文档 TensorFlow:项目地址 本篇列出文章对于全零新手不太合适,可以尝试TensorFlow入门系列博客,搭配其他资料进行学习. Keras使用tf.Session训 ...
- 『TensorFlow』批处理类
『教程』Batch Normalization 层介绍 基础知识 下面有莫凡的对于批处理的解释: fc_mean,fc_var = tf.nn.moments( Wx_plus_b, axes=[0] ...
- 『TensorFlow』梯度优化相关
tf.trainable_variables可以得到整个模型中所有trainable=True的Variable,也是自由处理梯度的基础 基础梯度操作方法: tf.gradients 用来计算导数.该 ...
- 『TensorFlow』模型保存和载入方法汇总
『TensorFlow』第七弹_保存&载入会话_霸王回马 一.TensorFlow常规模型加载方法 保存模型 tf.train.Saver()类,.save(sess, ckpt文件目录)方法 ...
- 『计算机视觉』Mask-RCNN_从服装关键点检测看KeyPoints分支
下图Github地址:Mask_RCNN Mask_RCNN_KeyPoints『计算机视觉』Mask-RCNN_论文学习『计算机视觉』Mask-RCNN_项目文档翻译『计算机视觉』Mas ...
随机推荐
- 使用MySQL存储过程提高数据库效率和可维护性
MySQL 存储过程是一种强大的数据库功能,它允许你在数据库中存储和执行一组SQL语句,类似于编程中的函数.存储过程可以大幅提高数据库的性能.安全性和可维护性.本文将详细介绍MySQL存储过程的使用. ...
- 使用TorchLens可视化一个简单的神经网络
TorchLens:可用于可视化任何PyTorch模型,一个包用于在一行代码中提取和映射PyTorch模型中每个张量运算的结果.TorchLens功能非常强大,如果能够熟练掌握,算是可视化PyTo ...
- Dubbo3应用开发—Dubbo直连开发相关概念:通信、协议、序列化
Dubbo RPC直连应用的概念 所谓的Dubbo RPC直连应用,指的就是Consumer直接访问Provider,而无需注册中心的接入. Dubbo完成的仅仅是RPC最基本的功能. 从这个角度Du ...
- 「codeforces - 185D」Visit of the Great
link. 简单提一下做法,注意到 \(k^{2^a}\equiv k^{2^b}\equiv-1\equiv (-1)^{2^{b-a}}=1\pmod{(k^{2^a}+1,k^{2^{b}}+1 ...
- Vue element-ui 动态生成自定义table表头实现数据渲染
需求:1)表头的数据是动态的,有可能字段值很长且很多.解决方案自定义动态表头,字段长使用文字提示[el-tooltip组件]: 2)需要对表格data中的数据值进行枚举转成中文值,且显示不同的颜色. ...
- Backgrounds
有人私信要背景图,所以一起放出来了qwq 感觉这个博皮的动效选深色并且带点漂浮感的背景会比较好看(? 选图基本按这个标准选的,实际上比较亮的几张图已经被我手动拉低亮度了.(不过还是不太行/kk 备注里 ...
- YXの每日挂分记录
7.11 T1 不开两倍数组 100->60. 7.18 T2 dp+矩乘 转移不判边界 100->10. 7.20 T2 人类智慧 1e6 n log n 100->10,求前 5 ...
- 使用 Jenkins + Github + dokcer-compose 部署项目-实战篇
使用 Jenkins + Github + dokcer-compose 部署项目-实战篇 需要声明的一点是,此处实现的项目自动构建原理是 Github+Jenkins 的 webhook,因此得保证 ...
- 七个很实用的开源项目「GitHub 热点速览」
本周特推的两个项目都是异常实用的项目,一个接棒上周的视频重制项目 video-retalking 这次则是直接将视频替换成另外一个语种:另外一个则是解决日志阅读问题的 tailspin,让你在成千上万 ...
- Langchain-Chatchat项目:5.1-ChatGLM3-6B工具调用
在语义.数学.推理.代码.知识等不同角度的数据集上测评显示,ChatGLM3-6B-Base 具有在10B以下的基础模型中最强的性能.ChatGLM3-6B采用了全新设计的Prompt格式,除正常 ...