当前位置: 首页 > news >正文

机器学习——决策树(DecisionTree)


决策树(Decision Tree)详解:原理、构建、剪枝与实践

在机器学习算法中,决策树(Decision Tree) 是一种经典、直观且易于解释的监督学习方法。它模拟人类的思维过程,通过“是/否”问题逐步将数据划分,最终形成一棵可以用于分类或回归的“树”。

本文将系统介绍决策树的核心原理、构建流程、剪枝技巧、优缺点以及代码实践


一、什么是决策树?

决策树是一种树形结构模型,每个内部节点表示对一个特征的判断,每个分支代表判断结果,每个叶子节点表示一个类别或预测值。

  • 用于分类任务:称为分类树(Classification Tree)

  • 用于回归任务:称为回归树(Regression Tree)


二、决策树的核心思想

构建决策树的核心是:选择最佳特征将样本空间划分得最“纯净”。常见的划分标准有:

划分准则用途描述
信息增益(ID3)分类衡量划分后信息的不确定性减少了多少
信息增益比(C4.5)分类解决ID3偏好多值特征的问题
基尼指数(Gini Index,CART)分类衡量节点的不纯度
均方差(MSE)回归衡量预测值与真实值之间的误差

三、决策树的构建过程

以分类树为例,整体流程如下:

  1. 选择最优划分特征:根据信息增益、基尼指数等指标

  2. 节点划分数据集

  3. 对每个子集递归调用决策树构建算法

  4. 设置停止条件

    • 达到最大深度

    • 节点样本数量小于阈值

    • 所有样本标签相同


四、剪枝(Pruning):防止过拟合

决策树容易过拟合训练集,为了提高泛化能力,需要剪枝

✅ 预剪枝(Pre-pruning)

在构建过程中提前停止划分,例如:

  • 最大深度限制(max_depth

  • 最小样本分裂数(min_samples_split

  • 最小叶子节点样本数(min_samples_leaf

🔁 后剪枝(Post-pruning)

先生成整棵树,再自底向上剪去一些子树。例如:

  • 使用验证集判断剪枝效果

  • 成本复杂度剪枝(Cost Complexity Pruning)


五、决策树的优缺点

✅ 优点

  • 简单直观,容易理解

  • 不需要特征标准化

  • 可处理离散和连续特征

  • 对缺失值不敏感

  • 可用于分类与回归

❌ 缺点

  • 容易过拟合

  • 对小样本数据不稳定

  • 对类别不平衡敏感

  • 可解释性好但精度可能不如集成方法(如随机森林、XGBoost)


六、决策树实战代码(分类)

品种 (三个品种共150条)花萼长度(cm)花萼宽度(cm)花瓣长度(cm)花瓣宽度(cm)
山鸢尾(Iris-setosa)*505.13.51.40.2
变色鸢尾(Iris-versicolor)*507.03.24.71.4
维吉尼亚鸢尾(Iris-virginica)*506.33.36.02.5
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report
from sklearn import tree
import matplotlib.pyplot as plt# 1. 加载数据(以鸢尾花为例)
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
y = iris.target# 2. 拆分训练集与测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 3. 创建并训练模型
clf = DecisionTreeClassifier(criterion='gini', max_depth=3, random_state=0)
clf.fit(X_train, y_train)# 4. 预测与评估
y_pred = clf.predict(X_test)
print(classification_report(y_test, y_pred))# 5. 可视化树结构
plt.figure(figsize=(10,6))
tree.plot_tree(clf, filled=True, feature_names=iris.feature_names, class_names=iris.target_names)
plt.show()

全是1.00,因为数据导致而已


七、超参数说明(分类器)

参数名类型默认值说明
criterionstrgini

划分标准:

'gini':基尼不纯度(CART)

'entropy':信息增益(ID3)

splitterstrbest

分裂策略:

'best':贪婪地选择最优分裂

'random':在特征的随机子集上选择

max_depthint or NoneNone树的最大深度,限制深度可以防止过拟合
min_samples_splitint or float2内部节点再划分所需的最小样本数(整数或比例)
min_samples_leafint or float1叶子节点所需的最小样本数(整数或比例)
min_weight_fraction_leaffloat0.0每个叶子节点所需的最小权重比例(对样本加权时有用)
max_featuresint, float, str, or NoneNone

每次分裂考虑的最大特征数

int:具体数量

float:比例

'sqrt':√特征数

'log2':log2(特征数)

max_leaf_nodesint or NoneNone限制叶节点总数,控制模型复杂度
min_impurity_decreasefloat0.0节点划分的最小信息增益,低于则不分裂
参数名类型默认值说明
random_stateint or NoneNone随机数种子,确保结果可复现
class_weightdict, 'balanced', or NoneNone

类别权重设置,常用于处理类别不平衡

'balanced':自动按频率反比调整

参数名类型默认值说明
ccp_alphafloat0.0

成本复杂度剪枝参数(Cost Complexity Pruning)

• 大于 0 时会自动剪枝,推荐配合交叉验证调参


八、应用场景

  • 客户流失预测

  • 信贷风险评估

  • 疾病诊断

  • 销售策略优化

  • 决策支持系统


九、与其它模型的对比

模型可解释性性能是否易过拟合
决策树⭐⭐⭐⭐⭐⭐容易
随机森林⭐⭐⭐⭐⭐⭐不易
支持向量机⭐⭐⭐⭐⭐⭐适中
神经网络⭐⭐⭐⭐⭐可能

十、总结

决策树是一个适合入门的机器学习模型,其直观性和解释能力在很多实际场景中都有广泛应用。虽然它存在过拟合等问题,但通过剪枝或集成方法(如随机森林、XGBoost)可以有效改进。

📌 学会决策树,不仅能加深对机器学习本质的理解,也为进一步掌握集成学习打下了坚实基础!

http://www.dtcms.com/a/313289.html

相关文章:

  • 分享两个问题及其解决方法:发送AT没反应和wifi模块连接不上热点
  • Java设计模式之行为型模式(访问者模式)应用场景分析
  • MATLAB小波分析工具包进行时间序列的小波功率谱分析
  • 基于Matlab的深度学习智能行人检测与统计系统
  • FastAPI入门:安全性
  • 网安-逻辑漏洞-23登陆验证
  • 【系统编程】错误处理、读写缓冲区及位图
  • 文章分享---《Keil 再升级,修复了这些bug》
  • [自动化Adapt] 录制引擎
  • Nginx 相关实验(1)
  • C语言数据结构(7)贪吃蛇项目2.贪吃蛇项目实现
  • 分离还是统一,这是个问题
  • STM32F103_Bootloader程序开发13 - 巧用逆向拷贝,实现固件更新的“准原子”操作,无惧升级中的意外掉电
  • 时间空间复杂度
  • 高质量数据集|从武汉光谷《面向科技情报大模型的高质量数据集建设》招标项目谈起
  • 实现游戏排行榜
  • SpringBoot项目数据脱敏(自定义注解)
  • 关于corn
  • SpringAI无人机智能灌溉、本地化AI推理、分析气象站、分析球场草皮系统实践
  • Python操作Excel——从入门到精通
  • QML 将一个qml文件定义为公共的全局单例
  • 外设数据到昇腾310推理卡 之五 3403ATU
  • 【分析学】Hilbert 空间
  • python脚本-ATE测试数据stdf文件自动处理之概率分布图、直方图、数据分布图
  • 说说对泛型的理解?
  • 数据资产——解读2025 数据提供合同(示范文本)【附全文阅读】
  • linux扩展磁盘容量到home下
  • Python篇---import
  • 线段树学习笔记 - 区间最值操作
  • 实战案例:容器数据卷四部曲(三)目录数据卷