Python机器学习系列之scikit-learn决策树回归问题简单实践
off999 2024-11-26 07:24 53 浏览 0 评论
1.决策树概述
在前面几期的章节中
我们分别简单介绍了一下决策树DecisionTree的原理,以及使用一个简单的案例介绍了下决策树是如何处理简单分类问题的。通过前面两个章节简单地学习,我们再次回顾下决策树的一些优缺点,总结如下:
1.1决策树的优点是:
- 易于理解和解释,树可以被可视化;
- 几乎不需要数据准备。其他算法通常需要数据标准化,需要创建虚拟变量并删除缺失值。但是,请注意,此模块不支持缺失值。
- 使用树的成本(即预测数据)是用于训练树的数据点数的对数。
- 能够处理数值型和分类型数据。其他技术通常专门分析只有一种类型变量的数据集。
- 能够处理多输出问题。
- 使用白盒模型。如果给定的情况在模型中是可以观察到的,那么对条件的解释就很容易用布尔逻辑来解释。相反,在黑箱模型中(例如,在人工神经网络中),结果可能很难解释。
- 可以使用统计测试验证模型。这样就有可能对模型的可靠性作出解释。
- 即使它的假设在某种程度上被生成数据的真实模型所违背,它也表现得很好。
1.2决策树的缺点包括:
- 决策树学习器可以创建过于复杂的树,不能很好地概括数据。这就是所谓的过拟合。为了避免这个问题,必须设置剪枝、设置叶节点所需的最小样本数或设置树的最大深度等机制。
- 决策树可能是不稳定的,因为数据中的小变化可能导致生成完全不同的树。通过集成决策树来缓解这个问题。
- 学习最优决策树的问题在最优性的几个方面都是NP-complete的,甚至对于简单的概念也是如此。因此,实际的决策树学习算法是基于启发式算法,如贪婪算法,在每个节点上进行局部最优决策。这种算法不能保证返回全局最优决策树。这可以通过训练多棵树再集成一个学习器来缓解,其中特征和样本被随机抽取并替换。
- 有些概念很难学习,因为决策树不能很容易地表达它们,例如异或、奇偶校验或多路复用器问题。
- 如果某些类占主导地位,则决策树学习者会创建有偏见的树。因此,建议在拟合决策树之前平衡数据集。
1.3决策树相关概念
我们先来回归一下决策树的几个相关概念:
节点 | 说明 |
根节点 | 没有进边,有出边 |
中间节点 | 既有进边也有出边,但进边有且只有一条,出边也可以有很多条 |
叶节点 | 只有进边,没有出边,进边有且只有一条,每个页节点都是一个类别标签 |
父节点和字节点 | 在两个相连的节点中,更靠近根节点的是父节点,另一个则是子节点,两者是相对的 |
2.CART算法
2.1什么是CART算法?
CART是英文Classification And Regression Tree的简写,又称为分类回归树。从它的名字我们就可以看出,它是一个很强大的算法,既可以用于分类还可以用于回归,所以非常值得我们来学习。
CART算法使用的就是二元切分法,这种方法可以通过调整树的构建过程,使其能够处理连续型变量。
具体的处理方法是:如果特征值大于给定值就走左子树,否则就走右子树。
CART算法分为两步:
- 决策树生成:递归地构建二叉决策树的过程,基于训练数据集生成决策树,生成的决策树要尽量的大;自上而下从根开始构建节点,在每个节点处要选择一个最好的属性来分裂,使得字节点中的训练集尽量的纯;
- 决策树剪枝:用验证数据集对已生成的树进行剪枝并选择最优子树,这时损失函数最小作为剪枝的标准;
不同的算法使用不同的指标来定义“最好”:
算法 | 指标 |
ID3 信息增益 |
|
C4.5 信息增益比 |
|
CART 基尼系数 |
|
三种方法本质上都相同,在类别分布均衡时达到最大值,而当所有记录都属于同一个类别时达到最小值。换而言之,在纯度较高时三个指数均较低,而当纯度较低时,三个指数都比较大,且可以计算得出,熵在0-1区间内分布,而Gini指数和分类误差均在0-0.5区间内分布。
CART树的构建过程:首先找到最佳的列来切分数据集,每次都执行二元切分法,如果特征值大于给定值就走左子树,否则就走右子树,当节点不能再分时就将该节点保存为叶节点。
3.回归树的sklearn实现
3.1 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这样的参数。
3.2 重要参数,属性和接口
回归树衡量分枝质量的指标,支持的标准有三种:
- 输入"mse"使用均方误差mean squared error(MSE),父节点和叶子节点之间的均方误差的差额将被用来作为特征选择的标准,这种方法通过使用叶子节点的均值来最小化L2损失;
- 输入“friedman_mse”使用费尔德曼均方误差,这种指标使用弗里德曼针对潜在分枝中的问题改进后的均方误差;
- 输入"mae"使用绝对平均误差MAE(mean absolute error),这种指标使用叶节点的中值来最小化L1损失;
属性中最重要的依然是feature_importances_,接口依然是apply, fit, predict, score最核心。
在回归树中,MSE不只是我们的分枝质量衡量指标,也是我们最常用的衡量回归树回归质量的指标,当我们在使用交叉验证,或者其他方式获取回归树的结果时,我们往往选择均方误差作为我们的评估(在分类树中这个指标是score代表的预测准确率)。在回归中,我们追求的是,MSE越小越好。
然而,回归树的接口score返回的是R平方,并不是MSE。
虽然均方误差永远为正,但是sklearn当中使用均方误差作为评判标准时,却是计算”负均方误差“(neg_mean_squared_error)。这是因为sklearn在计算模型评估指标的时候,会考虑指标本身的性质,均方误差本身是一种误差,所以被sklearn划分为模型的一种损失(loss),因此在sklearn当中,都以负数表示。真正的均方误差MSE的数值,其实就是neg_mean_squared_error去掉负号的数字。
3.3 简单看看回归树是怎样工作的
接下来我们到二维平面上来观察决策树是怎样拟合一条曲线的。我们用回归树来拟合正弦曲线,并添加一些噪声来观察回归树的表现。
import numpy as np
from sklearn.tree import DecisionTreeRegressor
import matplotlib.pyplot as plt导入处理二维矩阵的numpy,回归树DecisionTreeRegressor以及画图的matplotlib等必要的模块;
rng = np.random.RandomState(1)
X = np.sort(5 * rng.rand(80, 1), axis=0)
y = np.sin(X).ravel()
y[::5] += 3 * (0.5 - rng.rand(16))使用随机数函数生成带有噪声的数据集;
# 建立回归树模型并且训练
regr_1 = DecisionTreeRegressor(max_depth=2)
regr_2 = DecisionTreeRegressor(max_depth=5)
regr_1.fit(X, y)
regr_2.fit(X, y)
# 使用回归树模型进行预测
X_test = np.arange(0.0, 5.0, 0.01)[:, np.newaxis]
y_1 = regr_1.predict(X_test)
y_2 = regr_2.predict(X_test)建立两个回归树模型,回归树的深度分别是2和5,分别用上面生成的数据集训练这两个回归树模型,然后用一组测试数据集分别对这两个回归树模型进行预测。
plt.figure(figsize=(16, 9))
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.savefig('DecisionTreeRegressor.jpg')
plt.show()使用matplotlib模块将上面生成的数据集和回归树预测后的数据进行绘制到一张图像中,运行效果如下:
通过上面运行效果图我们可以清楚地发现,回归树学习了近似正弦曲线的局部线性回归。我们可以看到,如果树的最大深度(由max_depth参数控制)设置得太高,则决策树学习得太精细,它从训练数据中学了很多细节,包括噪声得呈现,从而使模型偏离真实的正弦曲线,形成过拟合。
3.4简单探索下回归树DecisionTreeRegressor模型DecisionTreeRegressor
我们使用sklearn自带的交叉验证函数来看看我们上面建立的两棵回归树的均方误差是怎样的?
from sklearn.model_selection import cross_val_score
val_score1 = cross_val_score(regr_1, X, y, cv=10, scoring = "neg_mean_squared_error")
val_score1
val_score2 = cross_val_score(regr_2, X, y, cv=10, scoring = "neg_mean_squared_error")
val_score2我们分别对回归树模型regr_1和regr_2进行10次交叉验证,验证指标为均方误差,该函数返回一个包含10个浮点数的数组,数组里面的每一个浮点数表示一次验证的均方误差值。我们再对10次计算的均方误差进行一次求均值运输,就能够得到一个浮点数。运行效果如下:
交叉验证是用来观察模型的稳定性的一种方法,我们将数据划分为n份,依次使用其中一份作为测试集,其他n-1份作为训练集,多次计算模型的精确性来评估模型的平均准确程度。训练集和测试集的划分会干扰模型的结果,因此用交叉验证n次的结果求出的平均值,是对模型效果的一个更好的度量。
下面我们通过画一组学习曲线,来看看上面构建的回归树DecisionTreeRegressor和该回归树在上面我们生成的数据集训练后,max_depth与均方误差的关系
scores=[]
for i in range(10):
clf = DecisionTreeRegressor(max_depth=i+1,
random_state=10)
val_score = -cross_val_score(clf, X, y, cv=10, scoring = "neg_mean_squared_error").mean()
scores.append(val_score)我们经过10次循环,分别建立10棵max_depth不一样的回归树模型,每一颗回归树进行10次交叉验证,并且将交叉验证的结果进行求均值。
plt.plot(range(1,11),scores,color="red",label="max_depth")
plt.ylabel("neg_mean_squared_error")
plt.grid()
plt.legend()
plt.savefig('Regressor_max_depth.jpg')
plt.show()使用matplotlib模块绘制曲线,上面代码块运行效果如下图
通过上图我们可以清晰的知道,当回归树其他参数保持不变的情况下,max_depth为2的时候,均方误差MSE最小,该回归树在数据集上的拟合性也越好;因为在回归树中,我们追求的是均方误差MSE越小越好。
不积跬步,无以至千里;
不积小流,无以成江海;
参考资料:
https://scikit-learn.org/stable/modules/tree.html
相关推荐
- 购买的音乐u盘音乐保护(音乐u盘有病毒吗)
-
方法一:硬件写保护 硬件写保护比较简单,一般U盘上均有物理开关,拨开即可。 方法二:转换U盘格式 一般用户的U盘都是FAT32格式的,因此我们先要将U盘转换成NTFS格式,FAT32转NTFS数...
- win10要什么配置才能装(win10要什么配置才能装系统)
-
Windows10的最低配置要求包括:1GHz或更快的处理器、1GBRAM(32位)或2GBRAM(64位)、16GB可用存储空间(32位)或20GB(64位)、DirectX9兼容显卡以及8...
- 笔记本电脑没有无线网络连接
-
我们经常会需要用笔记本电脑进行上网等操作来获取到外界信息,不过有网友遇到了上网问题,笔记本电脑无internet连接WiFi怎么回事?网络连接WiFi显示无internet怎么办?下面就教下大家笔记本...
-
- 电脑上的文件夹如何设置密码
-
要在电脑桌面上的文件夹上设置密码,需要借助第三方软件或操作系统自带的加密工具。可以使用WinRAR、7-Zip等压缩解压软件的加密功能,对文件夹进行压缩并设置密码。也可以使用Windows自带的加密文件系统(EFS)对文件夹进行加密,只需在...
-
2026-01-09 22:51 off999
- 电脑配置单4000左右(电脑配置推荐4000)
-
2、3599元这款配置采用的是AMD的Ryzen53500X处理器,如果你不喜欢英特尔的话,选择这款配置自然更佳,价格虽然比上款配置贵了七百元,但是在CPU方面提升较大。AMD的3500X处理器为6...
- win10wifi驱动程序下载(win10wifi驱动官方下载)
-
win10安装wifi驱动方法如下1/4同时按住Windows键和R键,打开运行框。键入devmgmt.msc,然后按确定打开设备管理器。 2/4展开"网...
- 为什么电脑蓝屏了(电脑为什么蓝屏怎么解决)
-
1、电脑使用过度,温度过高过度使用电脑会导致电脑硬件发生损坏,系统超载,内部运算过多,cpu温度急剧升高,会发生系统错误。建议更换散热系统,更新“小风扇”设备,并合理使用电脑。2、内存条灰尘积压,或...
- 电脑耳机没声音(电脑耳机没声音怎么解决)
-
1、可能是耳机没有完全插入电脑音频接口,重新插入再确认是否有声音。2、可能是耳机差错音频接口(插成麦克风接口),更换接口再插入确认。为什么耳机连接电脑没有声音耳机连接电脑没有声音的原因3、可能是电脑...
- 0xc000000e(电脑蓝屏0xc000000e)
-
方法一、断开外部设备的连接0xc000000e错误可能是由于硬件故障或不兼容。要检验是不是这个原因,你可以先断开电脑最近连接的外部设备。另外,拔掉电脑或主机上的存储设备,比如U盘、读卡器,还有CD、D...
- wifi不可上网怎么办(明明连接上wifi,却显示不可上网)
-
一般都是路由器不稳定造成的wifi连接是不能上网,可以先把家里的路由器断电源之后再重新设备启动,通常都可以正常使用了;也有可能是出现故障导致wifi连接上不能上网,可以打电话给宽带客服查询是否欠费,若...
- 微软官网正版win10系统价格(微软官网正版win10系统价格表)
-
微软官网下载的win10,只有用正版密钥激活后才是正版的。如果用工具激活就是盗版的。微软操作系统是美国微软开发的Windows系列视窗化操作系统。个人版目前最高版本为Windows11,因为微软的个...
- 什么主板最好(i714700kf配什么主板最好)
-
1.华硕主板:是全球知名的主板制造商,定位一线品牌,市场占有率最大。2.技嘉主板:技嘉科技是全球一线主板制造,产品包括电脑、通讯与消费性电子产品,技嘉主板的出货量仅次于华硕主板,同属一线品牌。3.微星...
- 五笔输入法哪个最好用
-
我是一个五笔爱好者,曾经用过“王码五笔字型输入法86版”、“极品五笔”、“搜狗五笔”、“QQ五笔”、“海峰五笔”。最后我选择了“QQ五笔”,并且现在一直在用。我感觉QQ五笔各方面做的都很好,用了以后,...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
python入门到脱坑 输入与输出—str()函数
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
失业程序员复习python笔记——条件与循环
-
系统u盘安装(win11系统u盘安装)
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
