一、整体框架

本 PPT 聚焦机器学习中的决策树算法,围绕 “核心算法(ID3、C4.5、CART)→ 特殊问题(连续值处理)→ 优化策略(剪枝)→ 代码实现→ 课堂练习” 展开,系统补充决策树的进阶知识,解决基础算法的局限性并提供工程化落地思路。

二、核心决策树算法

(一)ID3 算法

  1. 核心衡量标准:信息增益

定义:某属性划分数据后,带来的 “熵减少量”(即纯度提升程度)。

选择逻辑:信息增益越大,该属性划分后数据纯度越高,优先作为划分属性。

  1. 致命局限性:对 “可取值数目较多的属性” 存在偏好。例如数据中的 “ID” 属性(每个 ID 唯一),用其划分会使每个子集仅含 1 个样本,信息增益最大,但无实际预测意义,易导致过拟合。
  1. 示例数据集:7 条 “是否出去玩” 的记录,特征包括天气(晴 / 阴 / 雨)、温度(高 / 适中 / 低)、湿度(高 / 正常)、是否多云(是 / 否),用于演示属性选择逻辑。

(二)C4.5 算法(解决 ID3 属性偏好问题)

  1. 核心改进:用 “信息增益率” 替代信息增益

公式:信息增益率 = 信息增益 ÷ 该属性自身的熵。

原理:属性自身熵会随 “可取值数目” 增加而增大(如 “ID” 属性自身熵极高),通过除法抵消高取值数属性的优势,避免 ID3 的偏好问题。

  1. 适用场景:需平衡 “属性区分度” 与 “取值数影响” 的分类任务,同样基于上述 7 条 “是否出去玩” 数据集演示计算逻辑,修正 ID3 的局限性。

(三)CART 算法(分类与回归通用)

  1. 核心衡量标准:基尼指数(Gini (D))

定义:反映从数据集 D 中随机抽取 2 个样本,类别标记不一致的概率,公式为 \(Gini(D) = 1 - \sum_{k=1}^{n} p_k^2\)(\(p_k\)为第 k 类样本在 D 中的占比)。

规律:\(p_k\)越大(数据纯度越高),Gini (D) 越小;当所有样本属于同一类时,Gini (D)=0(纯度最高)。

  1. 特点:既支持分类任务(用基尼指数衡量纯度),也支持回归任务(用平方误差衡量损失),是工程中常用的决策树算法。

三、特殊问题:连续值处理

当特征为连续值(如收入、年龄)时,无法直接按离散值划分,需通过 “离散化” 转化,核心方法为贪婪算法,步骤如下:

  1. 排序:将连续特征的所有取值按升序排列。例如 “应税收入(Taxable Income)” 样本值排序为:60K、70K、75K、85K、90K、95K、100K、120K、125K、220K。
  1. 确定分界点:若对连续值做 “二分划分”,则分界点数量 = 取值个数 - 1(如 10 个取值对应 9 个分界点,取相邻两个值的中间值,如 65K、72.5K 等)。
  1. 选择最优分界点:遍历所有可能的分界点,用信息增益(ID3/C4.5)或基尼指数(CART)计算划分效果,选择最优分界点(如示例中 “TaxIn<=80” 或 “TaxIn<=97.5”),完成连续值到离散值的转化。

四、决策树优化:剪枝策略(解决过拟合)

(一)剪枝的必要性

决策树理论上可通过不断划分,将训练数据 “完全分开”,但会导致模型过度拟合训练数据(对噪声敏感,泛化能力差),因此需通过剪枝降低复杂度。

(二)预剪枝

  1. 定义:“边构建决策树边剪枝”,在树的生长过程中提前停止分支,是工程中更实用的策略。
  1. 剪枝依据(停止条件)

限制树的最大深度(如最多 5 层);

限制叶子节点最少样本数(如叶子节点需含≥10 个样本才继续分支);

限制信息增益 / 基尼指数阈值(如划分后增益低于 0.1 则停止)。

  1. 优势:计算成本低,可避免构建复杂的全量树;劣势:可能因 “提前停止” 导致欠拟合(未充分学习数据规律)。

(三)后剪枝

  1. 定义:“先构建完整决策树,再从叶子节点向根节点回溯剪枝”,保留更贴合数据规律的分支。
  1. 剪枝衡量标准:损失函数

公式:最终损失 = 树自身的基尼系数(或熵) + α× 叶子节点数量(α 为正则化系数)。

α 的影响:

α 越大:正则化越强,优先减少叶子节点数量(树越简单),虽降低过拟合风险,但可能导致模型精度下降;

α 越小:更关注模型精度,叶子节点数量多,过拟合风险较高。

  1. 示例验证:以 “好瓜 / 坏瓜” 分类为例,通过验证集精度判断是否剪枝:

原分支 “色泽 =?”:剪枝前精度 57.1%,剪枝后 71.4%→决策剪枝;

原分支 “纹理 =?”:剪枝前精度 42.9%,剪枝后 57.1%→决策剪枝。

  1. 优势:泛化能力更强,不易欠拟合;劣势:需构建完整树,计算成本高于预剪枝。

五、决策树代码实现(基于 Python)

核心调用sklearn库的DecisionTreeClassifier()类,关键参数及含义如下表:

参数名

取值范围

核心作用

criterion

gini(基尼指数)、entropy(信息熵)

定义属性划分的衡量标准(CART 用 gini,ID3/C4.5 思路用 entropy)

splitter

best(所有特征找最优切分点)、random(部分特征找切分点)

控制切分点选择的随机性,random 可降低过拟合风险(类似随机森林思路)

max_features

None(用所有特征)、log2(log₂(特征数))、sqrt(根号下特征数)、整数 N

限制每次划分时考虑的特征数量,避免冗余特征影响,提升效率

max_depth

整数(如 5-20)或 None

限制树的最大深度,深度越大越易过拟合,推荐 5-20 之间平衡精度与泛化能力

六、课堂练习

任务:使用决策树算法对 “泰坦尼克号幸存者” 数据集进行预测,核心目标是:

  1. 实践特征选择(如乘客年龄、性别、舱位等级等);
  1. 调整DecisionTreeClassifier()参数(如criterion、max_depth);
  1. 结合剪枝思路优化模型,提升预测准确率(如避免过拟合)。代码如下:
    # 泰坦尼克号幸存者预测 - 决策树完整流程# 1. 导入必要的库
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import seaborn as sns
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.model_selection import train_test_split, cross_val_score, GridSearchCV
    from sklearn.metrics import accuracy_score# 2. 数据加载与初步查看
    # 使用seaborn内置数据集(无需本地文件)
    data = sns.load_dataset('titanic')
    # 查看数据基本信息
    data.info()
    # 查看前5行数据
    data.head()# 3. 数据预处理
    # 删除缺失值过多的列和无关特征
    data.drop(["Cabin", "Name", "Ticket"], inplace=True, axis=1)
    # 处理缺失值:年龄用均值填充
    data["Age"] = data["Age"].fillna(data["Age"].mean())
    # 删除剩余含有缺失值的行
    data = data.dropna()# 4. 分类变量编码
    # 将Embarked三分类变量转换为数值型
    labels = data["Embarked"].unique().tolist()
    data["Embarked"] = data["Embarked"].apply(lambda x: labels.index(x))
    # 将Sex二分类变量转换为0和1(男=1,女=0)
    data["Sex"] = (data["Sex"] == "male").astype("int")# 5. 特征与标签分离
    # 特征数据(排除Survived列)
    X = data.iloc[:, data.columns != "Survived"]
    # 标签数据(仅Survived列)
    y = data.iloc[:, data.columns == "Survived"]# 6. 划分训练集和测试集
    Xtrain, Xtest, Ytrain, Ytest = train_test_split(X, y, test_size=0.3, random_state=42)# 修正索引(确保索引连续)
    for i in [Xtrain, Xtest, Ytrain, Ytest]:i.index = range(i.shape[0])# 7. 初步模型训练与评估
    # 创建决策树模型
    clf = DecisionTreeClassifier(random_state=25)
    # 训练模型
    clf.fit(Xtrain, Ytrain)
    # 测试集评估
    score = clf.score(Xtest, Ytest)
    print(f"测试集准确率: {score:.4f}")# 8. 交叉验证评估
    cv_score = cross_val_score(clf, X, y, cv=10).mean()
    print(f"10折交叉验证平均准确率: {cv_score:.4f}")# 9. 决策树深度调优与可视化
    # 存储不同深度下的得分
    tr_scores = []
    te_scores = []# 测试深度1到10的决策树
    for i in range(10):clf = DecisionTreeClassifier(random_state=20,max_depth=i + 1,criterion="entropy")clf.fit(Xtrain, Ytrain)# 训练集得分tr_scores.append(clf.score(Xtrain, Ytrain))# 交叉验证得分te_scores.append(cross_val_score(clf, X, y, cv=10).mean())# 输出最佳得分
    print(f"最佳训练集得分: {max(tr_scores):.4f}")
    print(f"最佳交叉验证得分: {max(te_scores):.4f}")# 可视化得分随深度变化的趋势
    plt.figure(figsize=(10, 6))
    plt.plot(range(1, 11), tr_scores, color="red", label="训练集得分")
    plt.plot(range(1, 11), te_scores, color="blue", label="交叉验证得分")
    plt.xticks(range(1, 11))
    plt.xlabel("决策树深度")
    plt.ylabel("准确率")
    plt.title("不同深度下的模型性能")
    plt.legend()
    plt.show()# 10. 网格搜索超参数优化
    # 生成参数候选值
    gini_thresholds = np.linspace(0, 0.5, 20)# 定义超参数网格
    parameters = {'splitter': ('best', 'random'),'criterion': ("gini", "entropy"),'max_depth': [*range(1, 10)],'min_samples_leaf': [*range(1, 50, 5)],'min_impurity_decrease': [*np.linspace(0, 0.5, 20)]
    }# 创建网格搜索对象
    GS = GridSearchCV(estimator=DecisionTreeClassifier(random_state=25),param_grid=parameters,cv=10
    )# 执行网格搜索
    GS.fit(Xtrain, Ytrain)# 输出最优参数和最佳得分
    print("最优超参数组合:", GS.best_params_)
    print("最优参数下的交叉验证得分:", GS.best_score_)# 11. 使用最优模型进行预测
    best_clf = GS.best_estimator_
    y_pred = best_clf.predict(Xtest)
    print(f"最优模型在测试集上的准确率: {accuracy_score(Ytest, y_pred):.4f}")
    

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

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

相关文章

粗粮厂的基于spark的通用olap之间的同步工具项目

粗粮厂的基于spark的通用olap之间的同步工具项目1 项目背景2 项目实现2.1 实现原理2.2 细节要点3 抽样说明4 项目运行状态4.1 运行速度4.2 项目吞吐4.3 稳定性说的比较简单&#xff0c;有需要的可以留言&#xff0c;我不断补充完善1 项目背景 我们公司内部的需要一款&#xff…

C# 时间戳

在C#中&#xff0c;获取当前时间的毫秒级时间戳可以通过多种方式实现。以下是几种常见的方法&#xff1a;方法1&#xff1a;使用DateTime和DateTimeOffsetlong timestamp (long)(DateTimeOffset.Now.ToUnixTimeMilliseconds()); Console.WriteLine(timestamp);方法2&#xff1…

【牛客刷题】REAL792 小O的平面画圆

文章目录 一、题目介绍 1.1 输入描述 1.2 输出描述 1.3 示例 二、算法设计思路 2.1 核心问题分析 2.2 图解两个圆的位置关系 2.2.1. 相离 (Separate) 2.2.2. 外切 (Externally Tangent) 2.2.3. 相交 (Intersecting) 2.2.4. 内切 (Internally Tangent) 2.2.5. 包含 (Containing)…

uniapp:微信小程序使用Canvas 和Canvas 2D绘制图形

一、Canvas 画布 canvas 组件 提供了绘制界面&#xff0c;可以在之上进行任意绘制 功能描述 Canvas 画布。2.9.0 起支持一套新 Canvas 2D 接口&#xff08;需指定 type 属性&#xff09;&#xff0c;同时支持同层渲染&#xff0c;原有接口不再维护。 二、Canvas 和Canvas 2D 区…

word如何转换为pdf

pip install pywin32import os import win32com.client import pythoncom # 新增&#xff1a;用于处理COM线程 import sysdef docx_to_pdf(docx_path, pdf_pathNone):"""将Word文档转换为PDF格式&#xff0c;修复退出时的COM错误"""if not os.p…

服务器Linux防火墙怎样实现访问控制

在互联网世界里&#xff0c;Linux服务器就像一座城池&#xff0c;而防火墙便是城池的守卫者。没有防火墙&#xff0c;外部的任何流量都能毫无阻拦地进入服务器;而有了防火墙&#xff0c;就可以像设关卡一样&#xff0c;对进出城门的人进行盘查和控制。对企业运维人员来说&#…

【原创理论】Stochastic Coupled Dyadic System (SCDS):一个用于两性关系动力学建模的随机耦合系统框架

【原创理论】Stochastic Coupled Dyadic System (SCDS)&#xff1a;一个用于两性关系动力学建模的随机耦合系统框架 作者&#xff1a;[望月&#xff0c;GPT5,GPT-O3,Gemini2.5pro] 分类&#xff1a; 人工智能 理论模型 交叉学科 系统科学 人性 爱情 标签&#xff1a; 关系动力…

星图云开发者平台新功能速递 | 微服务管理器:无缝整合异构服务,释放云原生开发潜能

在构建现代数字化应用的过程中&#xff0c;开发者常常面临一个关键挑战&#xff1a;如何高效、安全地集成和复用既有的复杂服务或自有业务系统&#xff1f;这些服务可能是核心算法引擎、遗留业务逻辑模块&#xff0c;或是特定的SaaS能力。传统方式下&#xff0c;将它们融入新的…

数据结构:构建 (create) 一个二叉树

目录 问题的本质——什么信息才能唯一确定一棵树&#xff1f; 推导“最佳拍档”——哪两种遍历序列能行&#xff1f; 递归思想——如何构建一棵树&#xff1f; 第1步&#xff1a;确定整棵树的根节点 第2步&#xff1a;划分左右子树的成员 第3步&#xff1a;递归构建左右子…

【STM32】HAL库中的实现(五):ADC (模数转换)

什么是 ADC&#xff08;模数转换器&#xff09; ADC&#xff08;Analog to Digital Converter&#xff09;是将 模拟信号&#xff08;电压&#xff09;转换成数字信号&#xff08;数值&#xff09; 的器件。 在 STM32 中&#xff0c;ADC 通常具有以下特性&#xff1a;特性描述分…

智慧校园中IPTV融合对讲:构建高效沟通新生态

在智慧校园的建设浪潮里&#xff0c;IPTV融合对讲系统宛如一颗璀璨的新星&#xff0c;以其独特的功能和强大的优势&#xff0c;为校园的沟通与管理带来了全新的变革&#xff0c;构建起一个高效、便捷、智能的沟通新生态。从日常沟通层面来看&#xff0c;IPTV融合对讲系统打破了…

智能合约里的 “拒绝服务“ 攻击:让你的合约变成 “死机的手机“

你有没有遇到过手机突然卡死&#xff0c;点什么都没反应的情况&#xff1f;在区块链世界里&#xff0c;智能合约也可能遭遇类似的 "罢工"—— 这就是 "拒绝服务攻击"&#xff08;Denial of Service&#xff0c;简称 DoS&#xff09;。今天用大白话讲讲合约…

安全设计-防止非法移机

前言我们的设备在实际使用过程中&#xff0c;在我们的巡查机制粒度下&#xff0c;发现依然有设备被非法移动到其他非计划点位。因此&#xff0c;我们需要设计一套及时预警&#xff0c;但是对客户无感&#xff0c;不影响业务办理的防范机制。1.方案设计交互图2.方案说明 2.1方案…

OpenHarmony之三方库适配深度实践:从移植到合规的全链路指南

1. 为什么要做三方库适配?——更深层的价值分析 维度 现状痛点 预期收益 深度价值 生态 成熟开源库无法直接运行 复用 10+ 年开源沉淀,提升功能覆盖率 避免生态碎片化:通过标准化适配流程,确保不同厂商对同一库的实现一致 性能 JS 层重实现耗 CPU 原生 C/C++ 加速 3~10 倍 …

2025年09月计算机二级MySQL选择题每日一练——第一期

计算机二级中选择题是非常重要的&#xff0c;所以开始写一个每日一题的专栏。 答案及解析将在末尾公布&#xff01; 今日主题&#xff1a;MySQL 基础概念 1、以下关于数据库的特点中&#xff0c;描述正确的是&#xff08; &#xff09; A. 数据无冗余 B. 数据不可共享&#xff…

JAVA字符串操作——在蓝桥杯的基本应用

我们来系统地梳理一下 Java 中的字符串操作。Java 的字符串操作非常丰富&#xff0c;主要涉及到 String、StringBuilder 和 StringBuffer 这三个核心类。 目录 一、核心类简介 二、String 类的常用操作 1. 创建字符串 2. 获取基本信息 3. 比较字符串 4. 查找与判断 5. 转…

【深度学习基础】PyTorch Tensor生成方式及复制方法详解

目录PyTorch Tensor生成方式及复制方法详解一、Tensor的生成方式&#xff08;一&#xff09;从Python列表/元组创建&#xff08;二&#xff09;从NumPy数组创建&#xff08;三&#xff09;特殊初始化方法&#xff08;四&#xff09;从现有Tensor创建&#xff08;五&#xff09;…

动态规划:入门思考篇

1. 简单类比 假如我们要求全国人数&#xff0c;那么我们只要知道各个省的人数&#xff0c;然后将各个省的人数相加即可&#xff0c;要想知道各个省的人数&#xff0c;只要将这个省下面所有的市人数相加即可&#xff0c;同样&#xff0c;如果想要知道各个市的人数&#xff0c;只…

小杨的 X 字矩阵(举一反三)-洛谷B3865 [GESP202309 二级]

题目描述 小杨想要构造一个 X 字矩阵&#xff08; 为奇数&#xff09;&#xff0c;这个矩阵的两条对角线都是半角加号 &#xff0c;其余都是半角减号 - 。例如&#xff0c;一个 55 的 X 字矩阵如下&#xff1a; --- --- ---- --- --- 请你帮小杨根据给定的 打印出对应的“X …

数据组合与合并:Pandas 数据整合全指南 +缺失值处理

数据组合与合并&#xff1a;Pandas 数据整合全指南在进行数据分析之前&#xff0c;数据清洗与整合是关键步骤。 遵循“整洁数据”&#xff08;Tidy Data&#xff09;原则&#xff1a; 每个观测值占一行每个变量占一列每种观测单元构成一张独立的表格 整理好数据后&#xff0c;常…