news 2025/12/18 16:04:37

sklearn函数总结十 —— 决策树

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
sklearn函数总结十 —— 决策树

纯手打,代码整理中,持续更新中^-^

序号延用总结九

目录

17、决策树

17.1 决策树的结构

17.2 决策树的工作原理

17.3 数学公式:信息增益与基尼系数

1,信息增益(Information Gain)

2,基尼系数(Gini Impurity)

17.4 具体示例

任务说明

1. 计算数据集的熵

2. 计算信息增益

17.5 鸢尾花数据集的代码示例

17.6 详细参数说明

17.7决策树可视化


17、决策树

决策树(Decision Tree)是一种常见的监督学习算法,用于分类和回归任务。在分类任务中,决策树

过一系列的“决策”来判断一个样本属于哪个类别。其工作原理就像一棵树,树的每个节点表示一个“决

策”,树的叶子节点则代表最终的类别标签。

决策树的目标是通过分裂数据来尽可能纯净地划分不同的类别。

17.1决策树的结构

决策树由根节点、分支节点和叶子节点组成:

1.根节点:表示整个数据集,包含所有样本。

2.分支节点:表示特征的决策(如:是/否,真/假等)。

3.叶子节点:表示最终的类别或预测值。

17.2决策树的工作原理

决策树通过逐层分裂数据,每次选择最能“区分”不同类别的特征来进行分割。它会依据某些准则(如信

息增益、基尼系数等)选择最佳的分割特征。

1.选择最优特征:每次选择一个特征进行划分,目标是使得每一小组的类别尽可能单一(纯度高)。

2.递归分裂:对每个子集递归地进行上述操作,直到满足停止条件(如树的深度限制、最小样本数限

制等)。

3.生成树结构:最终,树的每个叶子节点代表一个类别。

17.3 数学公式:信息增益与基尼系数

1,信息增益(Information Gain)

2,基尼系数(Gini Impurity)

决策树的分裂过程(以信息增益为例)

假设我们有一个包含两个特征 A 和 B 的数据集,目标是根据这两个特征预测目标类别 C。

1.计算数据集的: 首先计算整个数据集的熵(即目标类别的不确定性)。

2.计算每个特征的条件熵: 对于每个特征(如 A 和 B),计算将数据集按特征值划分后的子集的

熵,并加权计算出该特征的条件熵。

3.计算信息增益: 信息增益是原始数据集的熵减去条件熵。选择信息增益最大的特征进行划分。

4.递归分裂: 对分裂后的每个子集重复上述步骤,直到所有子集的类别纯度足够高(或达到预设的

停止条件)。

17.4 具体示例

假设我们有以下数据集:

天气温度湿度风速类别(是否打球)
温暖
温暖
凉爽
凉爽

任务说明

我们要预测 “是否能打球”(目标变量)。

决策树算法会依次考察每个特征(天气、温度、湿度、风速)的信息增益,选择信息增益最大的特征进行分裂。

1. 计算数据集的熵

假设类别“是否打球”的分布为:3 个“是”,4 个“否”。

熵公式如下:

计算结果为:0.98

注:该值为数据集的总不确定性,越接近 1 表示越不确定。

2. 计算信息增益

假设我们选择“天气”作为第一个特征进行划分。

天气有三个取值:晴、阴、雨,分别对应不同的子集。

我们需要:

  1. 计算每个子集的熵;

  2. 对其加权求和(权重为子集大小占总数的比例);

  3. 用原熵减去加权熵,得到“天气”特征的信息增益。

然后,选择信息增益最大的特征进行分裂,如此递归下去。

17.5 鸢尾花数据集的代码示例

from sklearn.datasets import load_iris from sklearn.metrics import accuracy_score, classification_report from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier # 1, 加载数据 iris = load_iris() x = iris.data # 特征矩阵(150个样本,4个特征:萼长、萼宽、瓣长、瓣宽) y = iris.target # 特征值 目标向量(3类鸢尾花:0, 1, 2) # 2, 数据预处理 X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2) # 划分训练集和测试集 # 3, 创建和训练KNN模型 dtc = DecisionTreeClassifier() # 创建决策树分类器 dtc.fit(X_train, y_train) # 训练模型 # 4, 进行预测并评估模型 y_pred = dtc.predict(X_test) # 在测试集上进行预测 print('决策树预测值: ', y_pred) print('正确值 : ', y_test) accuracy = accuracy_score(y_test, y_pred) # 计算准确率 print(f'测试集准确率: {accuracy:.2f}') print('分类报告: \n', classification_report(y_test, y_pred, target_names=iris.target_names))

运行结果:

17.6 详细参数说明

DecisionTreeClassifier 是 scikit-learn 中用于分类任务的决策树模型,它的构造方法

init)有多个参数,可以通过这些参数来控制决策树的训练过程和模型复杂度。

DecisionTreeClassifier 构造方法的参数详解:

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, class_weight=None, ccp_alpha=0.0, splitter='best' )

1.criterion 决定用于选择分裂的质量衡量标准 默认值为 gini 基尼系数,可选 entropy 信息增益

2.splitter 控制每个节点如何选择用于分裂的特征,可选best或者random

3.max_depth 决策树的最大深度,避免模型过拟合,大深度可能是过拟合。

4.min_sample_split(默认值2)防止树的过度生长,如果一个节点的样本数小于该值,就不再继续分裂

5.min_samples_leaf (默认值:1 )可以控制树的复杂度。较大的值会使得叶子节点包含更多样本,有助于防止过拟合。

6.min_weight_fraction_leaf (默认值: 0.0 )可以防止训练数据集中某些特定样本的过度影响。一般在样本权重不均时使用。

其他略不太重要。。。

17.7决策树可视化

结合matplotlib实现决策树可视化,这样更直观,方便直观的看到具体算法数据。

先安装下matplotlib库以及jupyter库:

pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install jupyter -i https://pypi.tuna.tsinghua.edu.cn/simple

新建DecisionTreeClassifierTest.ipynb文件。

from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier # 1, 加载数据 iris = load_iris() x = iris.data # 特征矩阵(150个样本,4个特征:萼长、萼宽、瓣长、瓣宽) y = iris.target # 特征值 目标向量(3类鸢尾花:0, 1, 2) # 2, 数据预处理 X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2) # 划分训练集和测试集 # 3, 创建和训练KNN模型 dtc = DecisionTreeClassifier() # 创建决策树分类器 dtc.fit(X_train, y_train) # 训练模型 import matplotlib from sklearn.tree import plot_tree from matplotlib import pyplot as plt # 设置matplotlib使用黑体显示中文 matplotlib.rcParams['font.family'] = 'Microsoft YaHei' # 可视化决策树 plt.figure(figsize=(12, 8)) plot_tree( dtc, filled=True, feature_names=iris.feature_names, class_names=iris.target_names, rounded=True ) plt.title("决策树可视化") plt.show()

运行结果

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/15 19:27:11

底层通信架构GRPC

通过protobuf编码、基于Netty 去传输1、客户端java、服务端用的是GO,那么都可以通过GRPC远程调用。proto文件作为标准。2、底层是用netty协议,netty底层是一种长连接,性能高。netty底层是基于nio,非阻塞。3、编码格式是protobuf&a…

作者头像 李华
网站建设 2025/12/15 19:25:04

揭秘农业物联网数据瓶颈:如何用PHP优化传感器数据存储性能

第一章:农业物联网与PHP技术融合的背景随着现代农业向智能化、精细化方向发展,农业物联网(Agri-IoT)正逐步成为提升农业生产效率的核心驱动力。通过传感器、无线通信和数据处理技术,农业物联网实现了对土壤湿度、环境温…

作者头像 李华
网站建设 2025/12/15 19:24:56

2025年光学镜头器件行业MES优选厂商权威评测

光学元器件行业是光电产业中至关重要的一环,是高端装备、自动驾驶、医疗设备、消费电子等领域的“眼睛”。其产品精度要求极高,生产工艺复杂,多属于多品种、小批量的离散型制造模式。在这种对“精工细作”要求到极致的领域,MES不再…

作者头像 李华
网站建设 2025/12/15 19:24:11

自学网络安全难吗?

数字化浪潮席卷各行各业,网络攻击却日趋隐蔽化、产业化,小到个人信息泄露,大到政企系统瘫痪,安全威胁无处不在,因此网络安全需求量持续高涨。那么网络安全可以自学吗?难不难?我们来探讨一下。首先,我可以…

作者头像 李华
网站建设 2025/12/15 19:24:05

读写锁实战:淘宝“我的”页面背后的并发智慧

各类资料学习下载合集 链接:https://pan.quark.cn/s/770d9387db5f 在之前的学习中,我们掌握了互斥锁(Mutex)。互斥锁虽然安全,但比较“霸道”:无论你是想看一眼数据,还是想修改数据,它都只允许一个人进门。 试想一下淘宝的“我的”页面: 查看用户信息(读操作):每…

作者头像 李华
网站建设 2025/12/15 19:22:42

指针的补充学习

1.“双重”指针:双重指针:是指向指针的指针,即存储指针变量地址的指针。它是C/C中多级间接寻址的概念。直接上例子:结果:不能这样写因为数组退化成指针类型(Int *)而p2是Int **类型的 两者类型不…

作者头像 李华