【机器学习常见算法】决策树算法(含示例代码)

article/2025/11/11 1:48:48

决策树(Decision Tree)是一种非参数的有监督学习方法,它能够从一系列有特征和标签的数据中总结出决策规 则,并用树状图的结构来呈现这些规则,以解决分类和回归问题。决策树算法容易理解,适用各种数据,在解决各 种问题时都有良好表现,尤其是以树模型为核心的各种集成算法,在各个行业和领域都有广泛的应用。
几乎所有决策树有关的模型调整方法,都围绕这两个问题展开。这两个问题背后的原理十分复杂,我们会在讲解模型参数和属性的时候为大家简单解释涉及到的部分。

文章目录

      • 1、构建一棵树决策树
      • 2、确定最优的剪枝参数
      • 3、交叉验证
      • 4 实践
        • 4.1 构建一棵决策树
        • 4.2确定最优的剪枝参数
        • 4.3 交叉验证

1、构建一棵树决策树

决策树算法的本质是一种图结构,我们只需要问一系列问题就可以对数据进行分类了。
我们需要导入数据并查看数据的属性,基于导入的数据构建一棵简单的决策树来对数据进行分类,并查看各个特征的重要性。

现在我们就以scikit-learn中的红酒数据集为例,我们获取红酒数据集的特征矩阵以及标签,特征矩阵包括178个数据项,13个特征点,我们可以分析这13个特征点来对红酒进行分类。因此我们构建决策树模型,通过对决策树模型进行建模,训练,最终可以用训练好的模型预测红酒种类。从结果我们可以知道得知训练的准确度,准确度在0~1之间,越高越好。以及13个特征的重要程度,13个特征之和为1,数值表示所占比重。
1、导入需要的算法库和模块以及数据集
2、实例化数据集
3、查看数据集属性
4、划分数据
5、建立模型
6、训练模型
7、计算准确度
8、查看特征的重要性

2、确定最优的剪枝参数

在不加限制的情况下,一棵决策树会生长到衡量不纯度的指标最优,或者没有更多的特征可用为止。这样的决策树往往会过拟合,这就是说,它会在训练集上表现很好,在测试集上却表现糟糕。我们收集的样本数据不可能和整体的状况完全一致,因此当一棵决策树对训练数据有了过于优秀的解释性,它找出的规则必然包含了训练样本中的噪声,并使它对未知数据的拟合程度不足。
为了让决策树有更好的泛化性,我们要对决策树进行剪枝。剪枝策略对决策树的影响巨大,正确的剪枝策略是优化决策树算法的核心,sklearn为我们提供了不同的剪枝策略:
1、max_depth:
限制树的最大深度,超过设定深度的树枝全部剪掉。这是用得最广泛的剪枝参数,在高维度低样本量时非常有效。决策树多生长一层,对样本量的需求会增加一倍,所以限制树深度能够有效地限制过拟合。在集成算法中也非常实用。实际使用时,建议从max_depth=3开始尝试,看看拟合的效果再决定是否增加设定深度。
2、min_samples_leaf和min_samples_split:
min_samples_leaf限定一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则分枝就不会发生,或者,分枝会朝着满足每个子节点都包含min_samples_leaf个样本的方向去发生一般搭配max_depth使用。一般来说,建议从min_samples_leaf=5开始使用。对于类别不多的分类问题,min_samples_leaf=1通常就是最佳选择。
min_samples_split限定一个节点必须要包含至少min_samples_split个训练样本,这个节点才允许被分枝,否则分枝就不会发生。
那具体怎么来确定每个参数填写什么值呢?这时候,我们就要使用确定超参数的曲线来进行判断了。
超参数的学习曲线,是一条以超参数的取值为横坐标,模型的度量指标为纵坐标的曲线,它是用来衡量不同超参数取值下模型的表现的线。在我们建好的决策树里,我们的模型度量指标就是score。
我们依然是以红酒数据集为例,实例化数据,并建模,最终通过学习曲线选取最佳超参数,通过查看曲线的最大值,也就是最高精度,确定最佳超参数值。
1、导入需要的算法库和模块以及数据集
2、实例化数据集
3、划分数据
4、建立模型
5、训练模型
6、计算准确度
7、可视化超参数学习曲线

3、交叉验证

交叉验证是用来观察模型的稳定性的一种方法,我们将数据划分为n份,依次使用其中一份作为测试集,其他n-1份作为训练集,多次计算模型的精确性来评估模型的平均准确程度。训练集和测试集的划分会干扰模型的结果,因此用交叉验证n次的结果求出的平均值,是对模型效果的一个更好的度量。
在这里插入图片描述
在机器学习任务中,拿到数据后,我们首先会将原始数据集分为三部分:训练集、验证集和测试集。训练集用于训练模型,验证集用于模型的参数选择配置,测试集对于模型来说是未知数据,用于评估模型的泛化能力。这个方法操作简单,只需随机把原始数据分为三组即可。
不过如果只做一次分割,它对训练集、验证集和测试集的样本数比例,还有分割后数据的分布是否和原始数据集的分布相同等因素比较敏感,不同的划分会得到不同的最优模型,而且分成三个集合后,用于训练的数据更少了。于是有了k折交叉验证(k-fold cross validation)加以改进,
优点是训练集的样本总数和原数据集一样都是,并且仍有约1/3的数据不被训练而可以作为测试集。
我们依然是以红酒数据集为例,实例化数据,并建模,最终通过交叉验证得到模型的预测精度,精度范围在0~1之间,越高越好。
1、导入需要的算法库和模块以及数据集
2、实例化数据集
3、建立模型
4、交叉验证

4 实践

4.1 构建一棵决策树

# 1、导入需要的算法库和模块以及数据集
# 2、实例化数据集
# 3、查看数据集属性
# 4、划分数据
# 5、建立模型
# 6、训练模型
# 7、计算准确度
# 8、查看特征的重要性from sklearn.datasets import load_wine  # 红酒数据集
from sklearn import tree  # 决策树
from sklearn.model_selection import train_test_split  # 划分训练集和测试集wine = load_wine()  # 实例化数据集
print(wine.data.shape)  # 特征矩阵
print(wine.target)  # 标签Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data, wine.target, test_size=0.3)  # 将数据集的30%划分为测试集,其他的划分为训练集
clf = tree.DecisionTreeClassifier(criterion="entropy")  # 实例化树模型
clf = clf.fit(Xtrain, Ytrain)  # 训练树模型
score = clf.score(Xtest, Ytest)  # 返回预测的准确度
print("准确度:", score)
print("特征的重要性:", clf.feature_importances_)  # 查看特征的重要性

4.2确定最优的剪枝参数

# 1、导入需要的算法库和模块以及数据集
# 2、实例化数据集
# 3、划分数据
# 4、建立模型
# 5、训练模型
# 6、计算准确度
# 7、可视化超参数学习曲线from sklearn.datasets import load_wine  # 红酒数据集
from sklearn import tree  # 决策树
from sklearn.model_selection import train_test_split  # 划分训练集和测试集
import matplotlib.pyplot as pltwine = load_wine()  # 实例化数据集Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data, wine.target, test_size=0.3)  # 将数据集的30%划分为测试集,其他的划分为训练集
# 确认最优的剪枝参数
test = []  # 保存不同max_depth下计算得到的精度
for i in range(10):clf = tree.DecisionTreeClassifier(max_depth=i + 1, criterion="entropy", random_state=30,splitter="random")  # 实例化树模型clf = clf.fit(Xtrain, Ytrain)  # 训练树模型score = clf.score(Xtest, Ytest)  # 训练集上的准确度test.append(score)
print("最高精度为:", max(test), "所对应的树的深度:", test.index(max(test)) + 1)  # 输出最高精度以及所对应的树的深度
# 可视化
plt.plot(range(1, 11), test, color="red", label="max_depth")
plt.legend()  # 显示标签
plt.savefig("2.png")

4.3 交叉验证

from sklearn import tree  # 决策树
from sklearn.datasets import load_wine  # 红酒数据集
from sklearn.model_selection import cross_val_score  # 交叉验证
import matplotlib.pyplot as plt  # 可视化工具包wine = load_wine()  # 实例化数据集clf = tree.DecisionTreeClassifier(criterion="entropy")  # 实例化树模型clf_s = cross_val_score(clf, wine.data, wine.target, cv=10)  # 进行10次交叉验证得到每一次的准确度
print(clf_s)  # 十次交叉验证的结果
print(clf_s.mean())  # 十次交叉验证的平均值# 利用交叉验证确认最优的剪枝参数
test = []  # 保存不同max_depth下计算得到的精度
for i in range(10):  # 构建200次不同规模的随机森林(n_estimators表示随机森林含有多少课随机树)clf = tree.DecisionTreeClassifier(max_depth=i + 1, criterion="entropy", random_state=0,splitter="random")  # 实例化树模型rfc_s = cross_val_score(clf, wine.data, wine.target, cv=10).mean()  # 进行10次交叉验证得到准确度的平均值test.append(rfc_s)  # 将结果加入数组中
print("最高精度为:", max(test), "所对应的随机森林规模为:", test.index(max(test)) + 1)  # 输出最高精度以及所对应的最佳max_depth# 可视化
plt.plot(range(1, 11), test, color="red", label="max_depth")
plt.legend()  # 显示标签
plt.savefig("3.png")

http://chatgpt.dhexx.cn/article/gkAb04nC.shtml

相关文章

【决策树】深入浅出讲解决策树算法(原理、构建)

本文收录于《深入浅出讲解自然语言处理》专栏,此专栏聚焦于自然语言处理领域的各大经典算法,将持续更新,欢迎大家订阅!​个人主页:有梦想的程序星空​个人介绍:小编是人工智能领域硕士,全栈工程…

协方差矩阵推导

协方差定义:,其中分别为向量的均值。 设已知矩阵 则 样本自由度m-1,设,,则

协方差矩阵到底有什么用?

我们知道,线性代数,可以完成空间上的线性变换——旋转,缩放。对于协方差,我们隐约可以想到,它能解释一个随机变量,它在各个维度的变化程度。但是,这种认识其实还是处于比较浅层次的。数学嘛&…

22协方差矩阵 matlab,协方差协方差矩阵【matlab实例】

[今天看论文的时候又看到了协方差矩阵这个破东西,以前看模式分类的时候就特困扰,没想到现在还是搞不清楚,索性开始查协方差矩阵的资料,恶补之后决定马上记录下来,嘿嘿~ 协方差矩阵 协方差也只能处理二维问题,那维数多了自然就需要计算多个协方差,比如n维的数据集就需要计…

透彻理解协方差矩阵

2018-12-30 11:27:05 协方差及协方差矩阵有着特别广泛的应用,在多元高斯分布、高斯过程、卡尔曼滤波等算法中多有用到,本文从协方差、协方差矩阵讲起,并重点讲解协方差矩阵在高斯分布中的用法及意义,也是讲解高斯过程、贝叶斯优化…

使用matlab编写协方差矩阵计算矩阵

Dr.Can在他的教学视频(【卡尔曼滤波器】2_数学基础_数据融合_协方差矩阵_状态空间方程_观测器问题)中使用了足球运动员的数据介绍了协方差矩阵的概念和计算方法,原始数据如下图,那么协方差矩阵到底是什么?他有什么用&a…

PCA与协方差矩阵

一、协方差矩阵 一个维度上方差的定义: 协方差的定义: (a) 协方差就是计算了两个维度之间的相关性,即这个样本的这两个维度之间有没有关系。 协方差为0,证明这两个维度之间没有关系,协方差为正&…

浅谈协方差矩阵2

在之前的博客中介绍过一次协方差矩阵: 浅谈协方差矩阵_Yunlong_Luo的博客-CSDN博客 这次希望在之前的基础上,把协方差矩阵介绍的更清楚一些,本文的很多素材来自于: A geometric interpretation of the covariance matrix 期望和…

浅析协方差矩阵

统计学的基本概念 概率论里面有几个基本的概念,分别是:样本的均值、方差、标准差。首先,我们给定一个含有n个样本的集合,下面给出这些概念的公式描述: 均值: 标准差: 方差: 均值描述…

协方差矩阵用途

协方差两个用途: 各有缺陷 第二个用途:马氏距离(曼哈顿距离) 例如 欧式距离定义 马氏距离: 马氏距离意义: 案例: 鸢尾花案例 随机向量的变换 实际案例: 随机变量的线性组合

协方差矩阵-Covariance Matrix

首先我们要明白,协方差实际是在概率论和统计学中用于衡量两个变量的总体误差,当然方差是协方差的一种特殊情况,即当两个变量是相同情况。它表示的是两个变量的总体的误差,这与只表示一个变量误差的方差不同。如果两个变量的变化趋势一致&…

协方差矩阵(Covariance Matrix)

群体均值和协方差矩阵定义 (Population Mean and Covariance Matrix) 1、学术定义 2、常规定义 协方差矩阵中每个元素的求法 用中文来描述,就是: 协方差(i,j)(第i列的所有元素-第i列的均值)*&#xff…

超全面的协方差矩阵介绍

阅读本文需要具备一定的线性代数基础,通过本文,你将对协方差矩阵有全面的理解。 定义 一组随机变量,共n个: X ( X 1 , X 2 , . . . , X n ) T \mathbf{X}(X_1,X_2,...,X_n)^T X(X1​,X2​,...,Xn​)T 两个随机变量的协方差&am…

统计篇(四)-- 协方差矩阵的理解

本文将针对协方差矩阵做一个详细的介绍,其中包括协方差矩阵的定义、数学背景与意义、计算公式的推导、几何解释,主要整理自下面两篇博客: peghoty-关于协方差矩阵的理解:http://blog.csdn.net/itplus/article/details/11452743协…

欧拉函数的两种求法

引入:互质的概念:如果 正整数 a 与b 之间只有一个公约数1 则称a与 b 互为质数。 欧拉函数的定义: 1-N 中 与N 互质的数的个数 记作 Phi(N) 在算数基本定理中任意自然数能进行质因数拆分,那么由容斥原理&a…

求欧拉函数的方法

求欧拉函数的一般方法: 1.我们知道一个素数p的欧拉函数f(p)p-1;那么p的k次幂,即np^k,则容易证明:f(n)p^k-p^(k-1); 证明:已知少于p^k的数有p^k-1,其中与p^k不互质的数有p^(k-1)-1个&…

欧拉函数的求法(三种)

欧拉函数定义 求欧拉函数的方法 1.公式法 2.线性筛法 根据三条性质来解题的: //1、当p为质数的时候:phi(p)p-1 //2、当p与i互质时有: phi(p*i)phi(p)*phi(i) //3、当i%p0时有:phi(p*i)p*phi(i) 具体实现参考链接: 1.求欧拉函数…

欧拉函数算法

一、欧拉函数值 欧拉函数又称为Phi函数 欧拉函数的定义为:对于正整数n,他的欧拉函数值是不大于n的正整数中与n互质的正整数的个数(互质:除1外没有其他最大公约数)。 据此,可以得到求某个数欧拉值的代码&am…

数学知识:欧拉函数

文章目录 前言一、欧拉函数,欧拉定理二、例题,代码AcWing 873. 欧拉函数AC代码 AcWing 874. 筛法求欧拉函数本题解析AC代码 三、时间复杂度 前言 复习acwing算法基础课的内容,本篇为讲解数学知识:欧拉函数,关于时间复…

欧拉函数相关概念

一、欧拉函数 给定正整数n,欧拉函数φ(n)不大于n且和n互质的正整数的个数(包括1)。φ(1)1 φ ( n ) Σ i 1 n [ g c d ( i , n ) 1 ] \varphi \left( n \right) \varSigma_{i1}^{n}\left[ gcd\left( i,n \right) 1 \right] φ(n)Σi1n​[gcd(i,n)1] 完全余数集…