速通机器学习 08 | 决策树

发布时间:2026/9/24 17:18:15

速通机器学习 08 | 决策树 一、决策树基础概念1. 定义决策树属于有监督学习算法通过学习训练样本生成分层分类规则依靠这套规则对新样本完成预测。核心逻辑所有样本数据从根节点逐层向下判断最终落到叶子节点输出预测结果。学习决策树的目的主要是为随机森林打基础。决策树理解了随机森林就不难。树结构分为 3 类节点根节点整棵树第一个判断节点非叶子节点中间节点中间分层判断条件叶子节点无后续分支输出最终结果2. 构建决策树三大核心问题如何选定根节点、中间节点与叶子节点每个节点依据什么条件进行样本分裂节点分裂效果好坏的评判标准是什么二、三大经典决策树分类算法业界主流三种决策树算法区分核心在于样本分裂评判标准ID3 算法以信息熵为衡量指标C4.5 算法以信息增益率为衡量指标CART 算法以基尼系数为衡量指标sklearn 分类树默认使用2.1 ID3 算法信息熵1熵的含义熵代表数据集内部的混乱、不确定程度熵值越大样本类别越混杂熵值越小样本纯度越高。2熵计算公式数据集中第i类样本所占比例3实例对比集合 A集合 B对比可见集合 B 样本更混乱。2.2 C4.5 算法分裂评判标准信息增益率弥补 ID3 偏向取值多特征的缺陷。2.3 CART 算法sklearn 默认分裂评判标准基尼系数基尼值越接近 0样本纯度越高基尼值越大样本混杂度越高。sklearn 中DecisionTreeClassifier为二叉 CART 树。如何手动构建决策树可以查看开头文件。速通机器学习08-决策树资源-CSDN下载速通机器学习08-决策树资源-CSDN下载三、决策树剪枝1. 剪枝目的决策树无限制生长会过度学习训练集噪声引发过拟合剪枝删减多余分支降低模型复杂度提升泛化能力。2. 两种剪枝方式1预剪枝Sklearn 唯一原生支持建树过程中提前终止节点分裂从源头限制树规模训练速度更快。代码核心控制参数本次实战全部用到max_depth整棵树最大深度min_samples_split节点允许分裂的最少样本数少于则不分裂min_samples_leaf叶子节点最小样本数量设置基尼系数阈值分裂收益不足则停止划分2后剪枝先训练生成一棵完整无限制的大树再从底层叶子向上回溯修剪通过验证集判断若剪掉子树后模型效果不变或提升则删除该分支。优势拟合效果优于预剪枝缺点训练耗时高sklearn 无原生接口。3、核心调用代码导入决策树工具库from sklearn import tree分类决策树模型初始化调用dtr tree.DecisionTreeClassifier(criterion, max_depth, min_samples_split, min_samples_leaf)参数详解criterion节点分裂评判标准默认gini基尼系数CART算法可选entropy信息熵ID3算法用于衡量样本混乱度、筛选最优分裂特征。max_depth决策树最大深度核心预剪枝参数。限制树的生长层数数值越小模型越简单可直接限制复杂分支有效抑制过拟合。min_samples_split内部节点最小分裂样本数。当节点样本数量小于该值时停止分裂避免生成过多细碎分支。min_samples_leaf叶子节点最小样本数。分支分裂后生成的叶子节点样本数量不得小于该值杜绝单点样本分支提升模型泛化性。random_state随机种子固定模型训练随机逻辑保证每次运行训练结果一致便于参数对比、实验复现。以上参数均为核心配置模型会自动预剪枝本章K折超参数调优的核心遍历对象通过组合调参可精准平衡模型拟合能力与泛化能力。四、实战电信客户流失分类K 折交叉验证选最优预剪枝参数电信客户流失数据已经在文章开头给出。业务流程说明分层划分训练集、测试集测试集全程隔离不参与调参不做下采样直接使用原始不平衡训练数据训练5 折分层 K 折交叉验证遍历预剪枝超参数以召回率筛选最优组合最优参数训练模型分别评估训练集、测试集输出分类报告、混淆矩阵、可视化决策树完整可运行代码import pandas as pd from sklearn.model_selection import train_test_split, cross_val_score, StratifiedKFold from sklearn import tree from sklearn.metrics import classification_report, confusion_matrix import matplotlib.pyplot as plt from sklearn.tree import plot_tree 绘制混淆矩阵函数 def cm_plot(y, yp): cm confusion_matrix(y, yp) plt.matshow(cm, cmapplt.cm.Blues) plt.colorbar() for x in range(len(cm)): for y in range(len(cm)): plt.annotate(cm[x, y], xy(y, x), horizontalalignmentcenter, verticalalignmentcenter) plt.ylabel(True label) plt.xlabel(Predicted label) return plt 1.读取数据集 datas pd.read_excel(rD:\pythoncode2\bigdata_ai40\data\电信客户流失数据2.xlsx) 2.分层划分训练集、测试集先不拆分特征标签 data_train, data_test train_test_split(datas, test_size0.2, random_state42, stratifydatas.iloc[:, -1]) 移除下采样代码直接拆分训练集特征与标签 target_train data_train.iloc[:, -1] data_train data_train.iloc[:, :-1] target_test data_test.iloc[:, -1] data_test data_test.iloc[:, :-1] 3.构建5折分层交叉验证适配不平衡数据保证每折类别比例一致 skf StratifiedKFold(n_splits5, shuffleTrue, random_state42) 4.预剪枝超参数候选范围 tree_depth [1, 2, 3, 4] # max_depth 树最大深度 tree_min_leaf [1, 2, 3, 4, 5, 6, 7, 8] # min_samples_leaf 叶子最小样本 tree_min_samples [2, 3, 4, 5, 6] # min_samples_split 节点分裂最小样本 best_zuhe [0, 0, 0] best_recall 0 三重循环遍历所有参数组合K折验证取平均召回率 for l in tree_min_samples: for i in tree_depth: for j in tree_min_leaf: dtr tree.DecisionTreeClassifier( criteriongini, max_depthi, min_samples_leafj, min_samples_splitl, random_state42 ) # 交叉验证评估指标为召回率recall score cross_val_score(dtr, data_train, target_train, cvskf, scoringrecall) score_mean sum(score) / len(score) print(f深度{i},叶子最小{j},分裂最小{l}平均召回率{score_mean:.4f}) # 更新最优参数 if score_mean best_recall: best_recall score_mean best_zuhe[0] i best_zuhe[1] j best_zuhe[2] l print(*60) print(f交叉验证最优预剪枝参数组合\n树最大深度:{best_zuhe[0]}叶子最小样本:{best_zuhe[1]}节点分裂最小样本:{best_zuhe[2]}) print(f最优平均召回率{best_recall:.4f}) 5.使用最优预剪枝参数训练最终决策树模型 tr tree.DecisionTreeClassifier( criteriongini, max_depthbest_zuhe[0], min_samples_leafbest_zuhe[1], min_samples_splitbest_zuhe[2], random_state42 ) tr.fit(data_train, target_train) 6.训练集评估 train_pred tr.predict(data_train) print(\n【训练集分类评估报告】) print(classification_report(target_train, train_pred)) cm_plot(target_train, train_pred).show() 7.隔离测试集最终评估全程未参与调参模拟真实线上数据 te_pred tr.predict(data_test) print(\n【测试集最终分类评估报告】) print(classification_report(target_test, te_pred)) cm_plot(target_test, te_pred).show() 8.可视化决策树限制显示深度方便查看 plt.figure(figsize(16, 9)) plot_tree(tr, filledTrue, max_depth3) plt.show()代码分步讲解原始不平衡数据直接训练不做样本采样保留数据集真实分布分层划分保证训练、测试集流失客户占比和原数据一致。分层 K 折 StratifiedKFold普通 K 折会破坏类别比例分层 K 折保证每一折中流失、未流失客户比例和原始训练集一致交叉验证指标更可靠。三重循环遍历预剪枝超参数max_depth、min_samples_leaf、min_samples_split均为预剪枝控制参数以召回率为标准筛选最优组合防止过拟合同时保证流失客户不漏检。数据隔离规范测试集自始至终不参与交叉验证调参仅在参数确定后做一次最终验收杜绝数据泄露。决策树特性无需标准化特征不受数值量纲影响训练完成后可直接绘图每条判断规则可解释业务可读性强。五、核心注意点分类树DecisionTreeClassifier默认基尼系数回归树DecisionTreeRegressor默认 MSE 均方误差sklearn 仅支持预剪枝通过树深度、叶子样本数等参数实现无原生后剪枝 API不平衡数据集建议搭配分层划分stratify与StratifiedKFold保证类别均衡调参仅能使用训练集测试集仅做最终效果验证禁止参与交叉验证K 折交叉验证通用不止适用于决策树线性模型、集成模型均可使用不使用下采样时模型容易偏向多数类业务上可通过调整评估指标、损失函数优化本章简短总结决策树由根节点、中间节点、叶子节点构成ID3、C4.5、CART 分别依靠信息熵、信息增益率、基尼系数划分样本。为解决过拟合引入剪枝策略实操中依靠max_depth等参数实现预剪枝结合分层 K 折交叉验证筛选最优超参数。本章实战基于原始不平衡电信流失数据集移除下采样操作完整演示分层划分、参数寻优、模型评估全流程决策树可解释性优秀但单树稳定性弱下一章将学习集成学习随机森林优化该缺陷。
延伸阅读

更多相关文章

2026/9/21 14:47:04

计算机保研面试策略:从基础到工程再到交叉学科的靶向准备

1. 从“海投”到“精准定位”:我的保研面试策略复盘 又到了一年一度的保研季,最近后台和私信里收到不少学弟学妹的咨询,核心问题都差不多:“学长,我手里有几个夏令营/预推免的面试通知,该怎么准备&#xff…

2026/9/23 6:30:03

微信ClawBot技术解析:开源AI模型与微信生态的平民化AI代理实践

1. 从一只龙虾到14亿入口:ClawBot现象的本质是什么?最近,一个叫“微信ClawBot”的东西在圈子里火得不行。你可能没听过这个名字,但你大概率在微信群里见过它的“亲戚”——那些能陪你聊天、帮你查天气、甚至能写段子的机器人。Cla…

2026/9/23 10:29:22

相机标定核心:内参、外参与畸变系数的原理与OpenCV实战

1. 项目概述:从“拍个照”到“看懂世界”的数学语言我们每天都在用手机、相机拍照,记录生活,分享瞬间。但你是否想过,当你按下快门,相机是如何将三维的现实世界,准确地“翻译”成一张二维照片的&#xff1f…

2026/9/24 17:16:40

基于springboot服务器监控管理平台系统(源码+文档+部署讲解等)

联系博主 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 …

2026/9/24 17:16:40

PyOD 示例代码完全指南:从安装、运行到排查常见问题

机器学习数据分析深度学习 【免费下载链接】pyod A Python library for anomaly detection across tabular, time series, graph, text, image, and audio data. 60 detectors, benchmark-backed ADEngine orchestration, and an agentic workflow for AI agents. 项目地址&…

2026/9/24 17:16:40

基于SpringBoot的智慧泊车系统的设计与实现毕业设计项目源码

联系博主 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 …

2026/9/24 17:11:39

电碳表与碳资产管理平台:双碳目标下的智慧能源管理新范式

摘要:电碳表依托智能计量与物联网技术,实现用电全流程碳排放动态精准测算,为碳排放核算提供实时、可信的数据支撑;碳资产管理平台则以精准碳核算为基础,对接碳交易市场,助力企业盘活碳资产、创造碳收益。二…

2026/9/23 12:07:00

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/23 12:06:55

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/24 0:00:21

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:21

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:21

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/22 16:34:32

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/22 20:01:30

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/22 13:25:41

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码