引言

在机器学习的算法森林中,有一对"树形兄弟"始终占据着C位——决策树像个逻辑清晰的"老教授",用可视化的树状结构把复杂决策过程拆解成"是/否"的简单判断;而它的进阶版随机森林更像一支"精英军团",通过多棵决策树的"投票表决",在准确性与抗过拟合能力上实现了质的飞跃。无论是医疗诊断中的疾病预测,还是金融风控里的违约判别,这对组合都用强大的适应性证明着自己的"算法常青树"地位。今天,我们就从原理到实战,把这对"树形CP"彻底拆解清楚。

一、决策树:像剥洋葱一样拆解问题的"逻辑树"

1.1 原理:从"分西瓜"看决策树的生长逻辑

想象一个生活场景:你要判断一个西瓜是否成熟,可能会先看"纹路是否清晰"——如果清晰,再敲一敲听"声音是否浑厚";如果不清晰,可能直接判断为未成熟。这种"特征→判断→分支"的过程,就是决策树在模拟人类的决策逻辑。

从数学角度看,决策树(Decision Tree)是一种基于特征划分的监督学习模型,核心是通过选择最优特征对数据集进行分割,直到每个子节点足够"纯"(即属于同一类别)。这个过程就像切蛋糕,每次选择最能分开不同口味的那一刀。

关键概念:如何选择"最优分割特征"?

决策树的生长依赖两个核心指标,用来衡量分割后的子集是否更"纯":

  • 信息增益(Information Gain):基于信息熵(Entropy)计算。熵是衡量数据混乱程度的指标(熵越大,数据越混乱)。信息增益=父节点熵 - 子节点熵的加权平均。增益越大,说明该特征分割效果越好。
  • 基尼不纯度(Gini Impurity):衡量随机选取两个样本,类别不同的概率。基尼值越小,数据越纯。

举个例子:假设我们有一批西瓜数据(特征:纹路清晰/模糊、敲击声浑厚/清脆;标签:成熟/未成熟)。用"纹路清晰"分割后,左子节点90%是成熟瓜,右子节点80%是未成熟瓜——这时候的信息增益就比用"敲击声"分割更大,因此算法会优先选择"纹路清晰"作为第一个分割特征。

1.2 实战:用Scikit - learn种一棵自己的决策树

在Python中,scikit - learnDecisionTreeClassifier(分类树)和DecisionTreeRegressor(回归树)已经帮我们封装好了决策树的核心逻辑。我们以经典的鸢尾花分类任务为例,一步步实现:

步骤1:准备数据——加载鸢尾花数据集

鸢尾花数据集是机器学习的"Hello World",包含3类鸢尾花(山鸢尾、杂色鸢尾、维吉尼亚鸢尾),特征为花萼长度、花萼宽度、花瓣长度、花瓣宽度4个数值型特征。

# 导入必要库
from sklearn.datasets import load_iris  # 加载内置数据集
from sklearn.model_selection import train_test_split  # 划分训练集/测试集
from sklearn.tree import DecisionTreeClassifier, plot_tree  # 决策树分类器及可视化工具
from sklearn.metrics import accuracy_score, classification_report  # 模型评估指标
import matplotlib.pyplot as plt  # 绘图库# 加载数据
iris = load_iris()
X = iris.data  # 特征矩阵(4个特征)
y = iris.target  # 标签(0/1/2三类)
feature_names = iris.feature_names  # 特征名称列表
class_names = iris.target_names  # 类别名称列表print(f"特征名称:{feature_names}")
print(f"类别名称:{class_names}")
步骤2:划分训练集与测试集

为了验证模型泛化能力,我们按7:3的比例划分训练集和测试集,并设置随机种子保证结果可复现。

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3,  # 30%作为测试集random_state = 42  # 固定随机种子,保证结果可复现
)
步骤3:训练决策树模型

DecisionTreeClassifier有很多重要参数,比如:

  • criterion:选择分割标准(‘gini’或’entropy’,默认基尼系数)
  • max_depth:树的最大深度(限制过拟合)
  • min_samples_split:节点分割所需的最小样本数(防止树过深)

这里我们先使用默认参数训练,后续再讨论参数调优。

# 初始化决策树分类器(使用默认参数)
dt_clf = DecisionTreeClassifier(random_state = 42)  # 固定随机种子保证结果一致# 训练模型(用训练集拟合)
dt_clf.fit(X_train, y_train)
步骤4:可视化决策树——看树到底"长"什么样?

通过plot_tree函数,我们可以直观看到决策树的结构。这是决策树最吸引人的特性之一——可解释性强。

# 设置画布大小
plt.figure(figsize=(15, 10))# 绘制决策树
plot_tree(dt_clf, feature_names = feature_names,  # 显示特征名称class_names = class_names,      # 显示类别名称filled = True,                  # 用颜色深度表示节点纯度(颜色越深,纯度越高)rounded = True                  # 节点边框圆角
)plt.title("训练后的鸢尾花决策树结构", fontsize = 14)
plt.show()
步骤5:模型预测与评估

用测试集验证模型效果,计算准确率、召回率等指标。

# 预测测试集
y_pred = dt_clf.predict(X_test)# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"测试集准确率:{accuracy:.4f}")  # 输出4位小数# 生成分类报告(包含精确率、召回率、F1分数)
print("\n分类报告:")
print(classification_report(y_test, y_pred, target_names = class_names))

1.3 决策树的"优缺点清单"与应用场景

优点:
  • 可解释性强:树结构直观,能清晰看到每个特征的决策逻辑(医生可以向患者解释"因为你的白细胞计数>10000,所以判断为感染")。
  • 训练速度快:基于贪心算法的特征分割,计算复杂度低。
  • 支持多类型数据:对数值型、类别型特征都友好(无需归一化)。
缺点:
  • 容易过拟合:默认情况下,决策树会生长到所有叶节点纯,导致模型在训练集上表现完美,但测试集上拉跨(就像学生只背例题,遇到新题就不会)。
  • 对数据敏感:数据中的小扰动可能导致树结构大变化(比如某样本的特征值轻微变化,可能导致分割路径完全不同)。
典型应用场景:
  • 医疗诊断:根据患者的年龄、血压、血糖等指标,判断是否患有糖尿病。
  • 金融风控:根据用户的收入、负债比、历史逾期记录,判断是否批准贷款。
  • 用户分群:根据用户的消费金额、频次、品类偏好,划分高/中/低价值客户。

二、随机森林:让"多个决策树投票"的"智慧军团"

2.1 原理:为什么"三个臭皮匠能顶诸葛亮"?

决策树的最大问题是容易过拟合,就像一个专家可能有偏见。随机森林(Random Forest)的核心思想是集成学习(Ensemble Learning)中的Bagging(Bootstrap Aggregating):通过随机采样生成多个不同的训练子集,每个子集训练一棵独立的决策树,最后通过投票(分类)或平均(回归)得到最终结果。

随机森林的"双重随机":
  • 样本随机:用Bootstrap采样(有放回抽样)从原始数据中抽取N个样本,每个决策树用不同的样本集训练(约63.2%的原始样本会被选中,剩下的36.8%作为袋外数据OOB,可用于评估)。
  • 特征随机:每个节点分割时,从所有特征中随机选择k个特征(k通常取√M,M为总特征数),避免单棵树依赖少数几个强特征。

这种"双重随机"让每棵树都"个性鲜明",但又不至于偏离太远。最终通过群体智慧,降低整体方差(抗过拟合),同时保持偏差较低(准确率高)。

2.2 实战:用Scikit - learn训练随机森林

scikit - learnRandomForestClassifier(分类)和RandomForestRegressor(回归)同样封装了随机森林的核心逻辑。我们继续用鸢尾花数据集,对比决策树和随机森林的效果。

步骤1:初始化随机森林分类器

随机森林的重要参数比决策树更多,比如:

  • n_estimators:森林中树的数量(默认100,越多模型越稳但计算越慢)
  • max_features:每个节点分割时考虑的特征数(默认√M)
  • oob_score:是否用袋外数据评估模型(默认False)
  • n_jobs:并行训练的CPU核数(-1表示使用所有核)
from sklearn.ensemble import RandomForestClassifier# 初始化随机森林分类器(设置关键参数)
rf_clf = RandomForestClassifier(n_estimators = 100,  # 100棵决策树max_features ='sqrt',  # 每个节点考虑√M个特征(M = 4时为2)oob_score = True,  # 启用袋外数据评估random_state = 42,  # 固定随机种子n_jobs = -1  # 使用所有CPU核心并行训练
)# 训练模型
rf_clf.fit(X_train, y_train)
步骤2:评估随机森林性能

除了测试集评估,还可以用袋外分数(OOB Score)初步判断模型效果(无需划分验证集)。

# 预测测试集
y_pred_rf = rf_clf.predict(X_test)# 计算测试集准确率
accuracy_rf = accuracy_score(y_test, y_pred_rf)
print(f"随机森林测试集准确率:{accuracy_rf:.4f}")# 输出袋外分数(OOB Score)
print(f"袋外数据准确率:{rf_clf.oob_score_:.4f}")# 生成分类报告
print("\n随机森林分类报告:")
print(classification_report(y_test, y_pred_rf, target_names = class_names))
步骤3:挖掘随机森林的"隐藏信息"——特征重要性

随机森林的另一个优势是能输出特征重要性(Feature Importance),帮助我们理解哪些特征对预测结果影响最大。

# 获取特征重要性分数
importances = rf_clf.feature_importances_# 生成特征 - 重要性对的列表
feature_importance = list(zip(feature_names, importances))# 按重要性降序排序
feature_importance.sort(key = lambda x: x[1], reverse = True)# 打印结果
print("特征重要性排序:")
for feature, importance in feature_importance:print(f"{feature}: {importance:.4f}")# 可视化特征重要性
plt.figure(figsize=(10, 6))
plt.barh([f[0] for f in feature_importance],  # 特征名称[f[1] for f in feature_importance],  # 重要性分数color ='skyblue'
)
plt.xlabel("重要性分数", fontsize = 12)
plt.title("随机森林特征重要性", fontsize = 14)
plt.gca().invert_yaxis()  # 让最重要的特征在顶部
plt.show()

2.3 随机森林的"优缺点清单"与应用场景

优点:
  • 抗过拟合能力强:通过多棵树的投票/平均,降低了单棵树的过拟合风险。
  • 鲁棒性高:对缺失值、噪声不敏感(因为多棵树的结果会中和异常影响)。
  • 自动特征选择:通过特征重要性分数,帮助我们快速定位关键特征。
缺点:
  • 计算成本高:需要训练多棵树,时间和空间复杂度高于单棵决策树(但现代CPU的并行计算已大幅缓解这个问题)。
  • 可解释性下降:虽然单棵树可解释,但整体森林的决策逻辑难以直观展示(适合"结果导向"的任务,不适合需要严格解释的场景)。
典型应用场景:
  • 图像识别:通过提取图像的纹理、边缘等特征,识别物体类别(如自动驾驶中的行人检测)。
  • 自然语言处理:对文本的词频、情感倾向等特征进行分类(如垃圾邮件识别)。
  • 金融预测:结合用户的交易记录、社交行为等多维度特征,预测股票走势或用户违约概率。

三、从理论到实战:决策树与随机森林的深度对比与调优技巧

3.1 核心差异对比表

维度决策树随机森林
模型结构单棵树多棵树的集成
过拟合风险高(需剪枝)低(通过Bagging降低方差)
计算速度快(单树训练)较慢(多树并行训练)
可解释性高(树结构可视化)低(整体决策逻辑复杂)
特征重要性需额外计算(如基于信息增益)直接输出(基于特征对不纯度的贡献)
对噪声敏感高(单树易受异常样本影响)低(多树结果中和噪声)

3.2 决策树的调优:剪枝的艺术

决策树的过拟合问题可以通过剪枝(Pruning)解决,常见方法有两种:

  • 预剪枝(Pre - pruning):在树生长过程中限制其深度,比如设置max_depth = 5(最大深度)、min_samples_leaf = 10(叶节点最小样本数)等参数。
  • 后剪枝(Post - pruning):先生成完整的树,再从下往上删除一些子树,以验证集误差最小为标准。

3.3 随机森林的调优:平衡树的数量与质量

随机森林的调优主要围绕两个参数:

  • n_estimators:树的数量。一般来说,数量越多,模型越稳定,但计算成本也越高。可以通过网格搜索(Grid Search)或随机搜索(Random Search)找到最优值。
  • max_features:每个节点分割时考虑的特征数。默认是√M,但不同数据集可能有不同的最优值。

总结

决策树和随机森林作为机器学习中的经典算法,各有优劣。决策树以其高可解释性和快速训练的特点,适合对模型解释要求较高、数据量较小的场景;随机森林则凭借强大的抗过拟合能力和特征选择优势,在复杂数据和大规模数据集上表现出色。在实际应用中,我们应根据具体问题和数据特点,灵活选择和调优这两种算法,让"树形家族"在不同的业务场景中发挥最大价值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/912302.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/912302.shtml
英文地址,请注明出处:http://en.pswp.cn/news/912302.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp,每次请求时,中断上次请求

1.封装uni.request import {BASE_URL} from "/config/config.js"import store from "/store/index.js"; class RequestManager {constructor() {this.requestTasks new Map() // 存储所有请求任务this.baseURL BASE_URLthis.header {Content-Type: app…

DuDuTalk | 武汉赛思云科技有限公司通过武汉市人工智能企业认定!

近日,2025年武汉市人工智能企业名单正式公布!武汉赛思云科技有限公司(以下简称赛思云科技)凭借卓越的技术实力与创新成果,成功入选武汉市人工智能企业。这是对公司长期深耕AI语音智能领域、推动数字化转型的高度认可&a…

STM32实现傅里叶变换精确计算采样电流值

以下是基于离散傅里叶变换(DFT)算法在单片机上实现精确电流值计算的全流程指南,结合硬件选型、算法优化、代码实现及实际应用场景分析,综合多篇技术文档的实践要点: ⚙️ 一、系统设计核心要点 硬件选型与配置 单片机选择:优先采用带硬件浮点单元(FPU)的STM32F4/F7系列…

python 爬虫 下载视频

测试 OK II 在开发者工具里面 直接搜索m3u8 可以直接找相对应连接地址继续分析 这个m3u8 url地址是从哪里过来的 在什么地方有 III 我们想要视频数据 <m3u8连接> 在 网页源代码里面有获取整个视频内容 --》分为N个视频片段《ts文件》-->在m3u8连接里面--> 视频播放…

希尔伯特空间:无穷维度的几何世界

希尔伯特空间&#xff1a;无穷维度的几何世界 从量子物理到信号处理&#xff0c;希尔伯特空间为现代科学与工程提供了强大的数学框架 引言&#xff1a;无限维度的舞台 在数学和物理学的广阔领域中&#xff0c;希尔伯特空间扮演着至关重要的角色。这个完备的内积空间不仅推广了…

Transformer结构与代码实现详解

参考&#xff1a; Transformer模型详解&#xff08;图解最完整版&#xff09; - 知乎https://zhuanlan.zhihu.com/p/338817680GitHub - liaoyanqing666/transformer_pytorch: 完整的原版transformer程序&#xff0c;complete origin transformer programhttps://github.com/lia…

Adobe InDesign 2025

Adobe InDesign 2025(ID2025)桌面出版软件和在线发布工具,报刊杂志印刷排版设计软件。Adobe InDesign中文版主要用于传单设计,海报设计,明信片设计,电子书设计,排版,手册设计,数字杂志,iPad应用程序和在线交互文档。它是首款支持Unicode文本处理的主流DTP应用程序,率先使用新型…

Linux下获取指定时间内某个进程的平均CPU使用率

一、引言 通过pidstat工具可以测量某个进程在两个时间点之间的平均CPU利用率。 二、pidstat工具的安装 pidstat属于sysstat套件的一部分。以Ubuntu系统为例&#xff0c;执行下面命令下载安装sysstat套件&#xff1a; apt-get install sysstat 执行完后&#xff0c;终端执行p…

1.4 蜂鸟E203处理器NICE接口详解

一、NICE接口的概念 NICE&#xff08;Nuclei Instruction Co-unit Extension&#xff09;接口是蜂鸟E203处理器中用于扩展自定义指令的协处理器接口&#xff0c;基于RISC-V标准协处理器扩展机制设计。它允许用户在不修改处理器核流水线的情况下&#xff0c;通过外部硬件加速特…

Oracle 递归 + Decode + 分组函数实现复杂树形统计进阶(第二课)

在上篇文章基础上&#xff0c;我们进一步解决层级数据递归汇总问题 —— 让上级部门的统计结果自动包含所有下级部门数据&#xff08;含多级子部门&#xff09;&#xff0c;并新增请假天数大于 3 天的统计维度。通过递归 CTE、DECODE函数与分组函数的深度结合&#xff0c;实现真…

MySQL 数据类型全面指南:详细说明与关键注意事项

MySQL 数据类型全面指南&#xff1a;详细说明与关键注意事项 MySQL 提供了丰富的数据类型&#xff0c;合理选择对数据库性能、存储效率和数据准确性至关重要。以下是所有数据类型的详细说明及使用注意事项&#xff1a; 一、数值类型 整数类型 类型字节有符号范围无符号范围说…

leetcode437-路径总和III

leetcode 437 思路 利用前缀和hash map解答 前缀和在这里的含义是&#xff1a;从根节点到当前节点的路径上所有节点值的总和 我们使用一个 Map 数据结构来记录这些前缀和及其出现的次数 具体思路如下&#xff1a; 初始化&#xff1a;创建一个 Map &#xff0c;并将前缀和 …

UI前端与数字孪生融合探索新领域:智慧家居的可视化设计与实现

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 一、引言&#xff1a;智慧家居的数字化转型浪潮 在物联网与人工智能技术的推动下&#xff0c…

数据结构知识点总结--绪论

1.1 数据结构的基本概念 1.1.1 基本概念和术语 主要涉及概念有&#xff1a; 数据、数据元素、数据对象、数据类型、数据结构 #mermaid-svg-uyyvX6J6ofC9rFSB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-uyyvX6…

pip install mathutils 安装 Blender 的 mathutils 模块时,编译失败了

你遇到的问题是因为你试图通过 pip install mathutils 安装 Blender 的 mathutils 模块时&#xff0c;编译失败了&#xff0c;主要原因是&#xff1a; 2018年 的老版本也不行 pip install mathutils2.79 ❌ 报错核心总结&#xff1a; 缺失头文件 BLI_path_util.h&#xff1a;…

编译安装交叉工具链 riscv-gnu-toolchain

参考链接&#xff1a; https://zhuanlan.zhihu.com/p/258394849 1&#xff0c;下载源码 git clone https://gitee.com/mirrors/riscv-gnu-toolchain 2&#xff0c;进入目录 cd riscv-gnu-toolchain 3&#xff0c;去掉qemu git rm qemu 4&#xff0c;初始化 git submodule…

复制 生成二维码

一、安装插件 1、复制 npm install -g copy-to-clipboard import copy from copy-to-clipboard; 2、生成二维码 & 下载 npm install -g qrcode import QRCode from qrcode.react; 二、功能&#xff1a;生成二维码 & 下载 效果图 1、常规使用&#xff08;下载图片模糊…

自由职业的经营视角

“领导力的核心是帮助他人看到自己看不到的东西。” — 彼得圣吉 最近与一些自由职业者的交流中&#xff0c;发现很多专业人士都会从专业视角来做交流&#xff0c;这也让我更加理解我们海外战略顾问庄老师在每月辅导时的提醒——经营者视角和专业人士视角的不同。这不仅让大家获…

MR30分布式 IO在物流堆垛机的应用

在现代物流行业蓬勃发展的浪潮中&#xff0c;物流堆垛机作为自动化仓储系统的核心设备&#xff0c;承担着货物的高效存取与搬运任务。它凭借自动化操作、高精度定位等优势&#xff0c;极大地提升了仓储空间利用率和货物周转效率。然而&#xff0c;随着物流行业的高速发展&#…

告别固定密钥!在单一账户下用 Cognito 实现 AWS CLI 的 MFA 单点登录

大家好&#xff0c;很多朋友&#xff0c;特别是通过合作伙伴或服务商使用 AWS 的同学&#xff0c;可能会发现自己的 IAM Identity Center 功能受限&#xff0c;无法像在组织管理账户里那样轻松配置 CLI 的 SSO (aws configure sso)。那么&#xff0c;我们就要放弃治疗&#xff…