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

【漫话机器学习系列】034.决策树(Decision Tree)

决策树(Decision Tree)

决策树是一种常见的监督学习算法,可用于解决分类和回归问题。它通过一系列的条件划分数据集,将样本分配到特定的叶节点,以此进行预测。决策树直观、易于解释,是机器学习中广泛使用的模型之一。


决策树的基本概念

  1. 节点(Node)

    • 根节点(Root Node):树的起点,包含所有样本数据。
    • 内部节点(Internal Node):通过某个特征的条件划分数据。
    • 叶节点(Leaf Node):终点,表示分类结果或回归值。
  2. 分裂(Split)
    根据某个特征及其阈值,将数据划分为两个或多个子集。

  3. 深度(Depth)
    决策树中从根节点到叶节点的最长路径。


决策树的构建

  1. 目标
    寻找特征划分规则,使得划分后的子集尽可能纯(分类)或具有最小误差(回归)。

  2. 划分准则

    • 分类问题:使用指标如信息增益基尼系数等。
      • 信息增益(Information Gain):基于熵(Entropy)的减少:

                                             IG = H(D) - \sum_{i=1}^k \frac{|D_i|}{|D|} H(D_i)

         其中,H(D) 是当前集合 D 的熵,D_i 是划分后的子集。
      • 基尼系数(Gini Index):衡量数据的不纯度:

                                            G(D) = 1 - \sum_{i=1}^C p_i^2

        其中,p_i 是类别 i 的比例。
    • 回归问题:常用指标是均方误差(MSE)

                                                   MSE = \frac{1}{n} \sum_{i=1}^n (y_i - \hat{y})^2
  3. 停止条件

    • 树的深度达到预设值。
    • 数据集不能进一步分裂。
    • 每个子集中的样本数小于阈值。
  4. 剪枝
    剪枝通过减少决策树的复杂度来避免过拟合,分为以下两种方式:

    • 预剪枝(Pre-pruning):在构建过程中限制树的最大深度、最小样本数等。
    • 后剪枝(Post-pruning):先构建完整的树,再通过评估性能移除不重要的分支。

优点

  1. 直观易懂
    决策树模型容易可视化,便于解释。

  2. 无需特征工程
    决策树对特征的数值范围不敏感,无需归一化或标准化。

  3. 处理非线性关系
    决策树可以捕获数据中的非线性模式。

  4. 支持多种数据类型
    能同时处理连续变量和离散变量。


缺点

  1. 容易过拟合
    决策树在深度较大时可能对训练数据拟合过度。

  2. 对数据分布敏感
    异常值和噪声可能显著影响决策树的划分。

  3. 局限于局部最优
    贪心算法在每一步只关注局部最优,可能错过全局最优划分。


决策树的改进

  1. 集成方法

    • 随机森林(Random Forest):构建多个决策树,取预测结果的平均值(回归)或投票结果(分类)。
    • 梯度提升树(GBDT):基于多个决策树逐步优化模型。
  2. 正则化
    限制树的深度、叶节点的最小样本数等,控制模型复杂度。

  3. 混合模型
    使用其他算法(如线性模型)在决策树叶节点上进一步优化预测结果。


应用场景

  1. 分类任务

    • 邮件分类:将邮件划分为垃圾邮件和非垃圾邮件。
    • 医疗诊断:根据症状预测疾病。
  2. 回归任务

    • 房价预测:根据特征(位置、面积、房龄等)预测房价。
    • 销量预测:根据营销活动预测产品销量。
  3. 特征选择
    决策树可以用于评估特征的重要性,帮助选择关键特征。


代码实现

以下是使用 Scikit-learn 实现决策树分类和回归的代码示例:

分类决策树
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_iris

# 加载数据集
iris = load_iris()
X, y = iris.data, iris.target

# 数据划分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 决策树分类模型
clf = DecisionTreeClassifier(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.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import numpy as np

# 生成数据
np.random.seed(42)
X = np.random.rand(100, 1) * 10
y = np.sin(X).ravel() + np.random.normal(0, 0.1, X.shape[0])

# 数据划分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 决策树回归模型
reg = DecisionTreeRegressor(max_depth=4, 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: 0.035615720915261016

总结

决策树是一种灵活、高效的算法,适用于多种任务。虽然存在过拟合和局限性,但通过剪枝、正则化或与其他算法结合,可以显著提升其性能。决策树的简单性和可解释性使其成为机器学习中的重要工具。


http://www.kler.cn/a/467916.html

相关文章:

  • ECCV`24 | 首次解决文本到3D NeRFs分解问题!港中文等提出DreamDissector
  • 测试用例颗粒度说明
  • 在大型语言模型LLM中使用私有数据
  • 连接Milvus
  • CoppeliaSim和Python进行无人机联合仿真
  • ip属地的信息准确吗?ip归属地不准确怎么办
  • Python自学 - 递归函数
  • 中型 UniApp 项目的挑战与突破
  • (九千七-星河襟)椭圆曲线加密(ECC, Elliptic Curve Cryptography)及其例题
  • 软考 高级 架构师 第十 章软件工程3
  • 【童年经典小游戏】使用Python实现经典贪吃蛇游戏
  • 逻辑漏洞(超详细)
  • Linux操作系统下,挂ILA
  • HTML——73.button按钮
  • api接口技术开发按图搜索商品api轻松查询获取商品信息返回值结构
  • 基于Spring Boot的便民医疗服务小程序
  • Java 控制台彩色输出工具类详解
  • ChatGPT最新版本“o3”的概要
  • 浙江中医药大学携手云轴科技ZStack荣获“鼎信杯”金鼎实践奖
  • uniapp视频首页页面
  • ts是什么、tsc是什么、tsx是什么、jsx是什么、scss是什么
  • WordPress新安装只安装主题后发现只有首页能打开,其他路由页面都是404,并且Elementor都打不开
  • 腾讯云智能结构化 OCR:驱动多行业数字化转型的核心引擎
  • 全方位沉浸式音响体验——利用汽车结构件作为发声体提升车内音质引言
  • NLP 技术的突破与未来:从词嵌入到 Transformer
  • Android XR:Google在扩展现实领域的第二次起航