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

【机器学习】机器学习的基本分类-监督学习-决策树(Decision Tree)

决策树是一种树形结构的机器学习模型,适用于分类和回归任务。它通过一系列基于特征的条件判断来将数据分割为多个子区域,从而预测目标变量的值。


1. 决策树的结构

  1. 根节点(Root Node)

    • 决策树的起点,包含所有样本。
    • 根据某个特征的分割规则分裂。
  2. 内部节点(Internal Nodes)

    • 每个节点表示一次分割(划分标准)。
    • 根据特定特征及阈值分裂为子节点。
  3. 叶子节点(Leaf Nodes)

    • 决策树的终点,包含分类结果或回归预测值。

2. 决策树的构造

划分准则(分裂规则)

构造决策树的核心是选择最优的特征和阈值进行分裂,常用的准则包括:

  1. 分类问题

    • 信息增益(Information Gain)

      IG = H(D) - \sum_{i} \frac{|D_i|}{|D|} H(D_i)
      • H(D):分裂前的熵。
      • H(D_i):分裂后每个子集的熵。
    • 基尼指数(Gini Index)

      Gini(D) = 1 - \sum_{k=1}^K p_k^2
      • p_k​:样本属于第 k 类的比例。
      • 决策树选择使基尼指数下降最多的分裂。
  2. 回归问题

    • 均方误差(Mean Squared Error, MSE)MSE = \frac{1}{N} \sum_{i=1}^N (y_i - \hat{y})^2

3. 决策树算法

  1. ID3 算法

    • 使用信息增益作为分裂准则。
    • 适用于分类问题。
  2. C4.5 算法

    • 改进 ID3,支持连续特征。
    • 使用信息增益比作为分裂准则。
  3. CART(Classification and Regression Tree)

    • 适用于分类和回归。
    • 分类使用基尼指数,回归使用均方误差。

4. 决策树的优缺点

优点
  1. 易解释:规则清晰,直观理解。
  2. 无需特征缩放:对特征的分布和尺度不敏感。
  3. 可处理非线性关系:通过分裂捕捉复杂的非线性关系。
缺点
  1. 易过拟合:树过深会导致模型对训练数据拟合过度。
  2. 对噪声敏感:数据中的异常值可能显著影响树的结构。
  3. 不稳定性:小的变化可能导致树结构发生较大改变。

5. 决策树的剪枝

为了防止过拟合,决策树通常需要剪枝

  1. 预剪枝(Pre-Pruning)

    • 在构造时提前停止分裂。
    • 条件:达到最大深度、节点样本数小于阈值、分裂带来的增益不足。
  2. 后剪枝(Post-Pruning)

    • 先构造完整树,再从底部向上剪枝。
    • 剪枝条件:剪枝后误差降低或复杂度减少。

6. 决策树在分类与回归中的应用

分类问题
  • 用于多类别或二分类任务。
  • 叶子节点存储类别标签。
回归问题
  • 用于预测连续值。
  • 叶子节点存储预测值(通常为均值)。

7. 决策树的实现

分类问题
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score# 加载数据
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3, random_state=42)# 创建决策树分类器
clf = DecisionTreeClassifier(criterion="gini", max_depth=3, random_state=42)
clf.fit(X_train, y_train)# 预测
y_pred = clf.predict(X_test)
print("Accuracy:", accuracy_score(y_test, y_pred))

输出结果

Accuracy: 1.0
回归问题
from sklearn.tree import DecisionTreeRegressor
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error# 生成数据
X, y = make_regression(n_samples=100, n_features=1, noise=0.1, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 创建决策树回归器
reg = DecisionTreeRegressor(criterion="squared_error", max_depth=3, random_state=42)
reg.fit(X_train, y_train)# 预测
y_pred = reg.predict(X_test)
print("MSE:", mean_squared_error(y_test, y_pred))

输出结果

MSE: 36.28620386292295

8. 决策树的可视化

代码示例
import numpy as np
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier, plot_tree
import matplotlib.pyplot as pltiris = load_iris()
clf = DecisionTreeClassifier(random_state=1234)
model = clf.fit(iris.data, iris.target)# 将 iris.target_names 转换为列表
class_names_list = list(iris.target_names)plot_tree(clf, feature_names=iris.feature_names, class_names=class_names_list, filled=True)
plt.show()

可视化结果
  • 决策树图中显示特征的分裂规则、样本数量、类别比例等信息。
  • 有助于理解模型决策逻辑。

9. 决策树的扩展

  1. 随机森林(Random Forest)

    • 使用多棵决策树,结合集成学习(Bagging)。
    • 提升泛化性能,减少过拟合。
  2. 梯度提升树(Gradient Boosted Trees)

    • 以决策树为弱学习器,通过梯度提升优化。
  3. XGBoost / LightGBM / CatBoost

    • 各种基于决策树的高效梯度提升框架。

决策树作为经典的机器学习模型,易于理解且功能强大,适合小规模数据集或需解释性强的任务。在实际应用中,可以结合剪枝和集成学习来提升模型性能。

http://www.lryc.cn/news/496639.html

相关文章:

  • 【第 1 章 初识 C 语言】1.8 使用 C 语言的 7 个步骤
  • Docker 使用 Dockerfile 文件打包部署前端项目
  • HTML-全
  • 高效流程图绘制:开发设计流程图利器
  • 数据仓库的概念
  • AI - 谈谈RAG中的查询分析(2)
  • Java基础面试题,46道Java基础八股文(4.8万字,30+手绘图)
  • taro小程序马甲包插件
  • 【分组去重】.NET开源 ORM 框架 SqlSugar 系列
  • 2020年
  • 基于Matlab卡尔曼滤波的GPS/INS集成导航系统研究与实现
  • 《只狼》运行时提示“mfc140u.dll文件缺失”是什么原因?“找不到mfc140u.dll文件”要怎么解决?教你几招轻松搞定
  • C语言:指针与数组
  • win11无法检测到其他显示器-NVIDIA
  • SQLite:DDL(数据定义语言)的基本用法
  • AI工具集:一站式1000+人工智能工具导航站
  • 视觉处理基础2
  • 代码随想录第十四天|二叉树part02--226.翻转二叉树、101.对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度
  • vue基础之7:天气案例、监视属性、深度监视、监视属性(简写)
  • JS实现高效导航——A*寻路算法+导航图简化法
  • Spring Authorization Server登出说明与实践
  • 浏览器报错 | 代理服务器可能有问题,或地址不正确
  • 泷羽sec:shell编程(9)不同脚本的互相调用和重定向操作
  • Milvus×OPPO:如何构建更懂你的大模型助手
  • 单片机几大时钟源
  • reverse学习总结(12)
  • 基于“微店 Park”模式下 2+1 链动模式商城小程序的创新发展与应用研究
  • C++11:【列表初始化】【右值引用和移动语义】
  • Zookeeper的通知机制是什么?
  • 嵌入式蓝桥杯学习1 电量LED