机器学习——决策树(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)*50 5.1 3.5 1.4 0.2
变色鸢尾(Iris-versicolor)*50 7.0 3.2 4.7 1.4
维吉尼亚鸢尾(Iris-virginica)*50 6.3 3.3 6.0 2.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,因为数据导致而已


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

参数名 类型 默认值 说明
criterion str gini 划分标准: • 'gini':基尼不纯度(CART) • 'entropy':信息增益(ID3)
splitter str best 分裂策略: • 'best':贪婪地选择最优分裂 • 'random':在特征的随机子集上选择
max_depth int or None None 树的最大深度,限制深度可以防止过拟合
min_samples_split int or float 2 内部节点再划分所需的最小样本数(整数或比例)
min_samples_leaf int or float 1 叶子节点所需的最小样本数(整数或比例)
min_weight_fraction_leaf float 0.0 每个叶子节点所需的最小权重比例(对样本加权时有用)
max_features int, float, str, or None None 每次分裂考虑的最大特征数 • int:具体数量 • float:比例 • 'sqrt':√特征数 • 'log2':log2(特征数)
max_leaf_nodes int or None None 限制叶节点总数,控制模型复杂度
min_impurity_decrease float 0.0 节点划分的最小信息增益,低于则不分裂
参数名 类型 默认值 说明
random_state int or None None 随机数种子,确保结果可复现
class_weight dict, 'balanced', or None None 类别权重设置,常用于处理类别不平衡 • 'balanced':自动按频率反比调整
参数名 类型 默认值 说明
ccp_alpha float 0.0 成本复杂度剪枝参数(Cost Complexity Pruning) • 大于 0 时会自动剪枝,推荐配合交叉验证调参

八、应用场景

  • 客户流失预测

  • 信贷风险评估

  • 疾病诊断

  • 销售策略优化

  • 决策支持系统


九、与其它模型的对比

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

十、总结

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

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

相关推荐
张较瘦_1 小时前
[论文阅读] AI+软件工程(迁移)| 从JDK8到21:FreshBrew如何为AI代码迁移画上“可信句号”
论文阅读·人工智能·软件工程
Mintopia1 小时前
小样本学习在 WebAI 场景中的技术应用与局限
前端·人工智能·aigc
yueyuebaobaoxinx1 小时前
2025 AI 落地元年:从技术突破到行业重构的实践图景
人工智能·重构
说私域1 小时前
私域整体结构的顶层设计:基于“开源AI智能名片链动2+1模式S2B2C商城小程序”的体系重构
人工智能·小程序·开源
yunyun18863581 小时前
AI - 自然语言处理(NLP) - part 1
人工智能·自然语言处理
星期天要睡觉2 小时前
计算机视觉(opencv)——疲劳检测
人工智能·opencv·计算机视觉
zxsz_com_cn2 小时前
基于AI的设备健康诊断:工业设备智能运维的破局之钥
运维·人工智能
MoRanzhi12032 小时前
12. Pandas 数据合并与拼接(concat 与 merge)
数据库·人工智能·python·数学建模·矩阵·数据分析·pandas
杜子不疼.3 小时前
【Linux】进程的初步探险:基本概念与基本操作
linux·人工智能·ai
可触的未来,发芽的智生3 小时前
触摸未来2025.10.04:当神经网络拥有了内在记忆……
人工智能·python·神经网络·算法·架构