决策树 ID3 算法实战:Python 手写 20 行代码,信息增益计算与可视化
决策树 ID3 算法实战Python 手写 20 行代码实现信息增益计算与可视化决策树作为机器学习中最直观的算法之一其核心思想是通过一系列规则对数据进行分类或回归。ID3 算法作为决策树的经典实现以信息增益为划分标准能够自动从数据中学习出有效的分类规则。本文将带您用 Python 从零实现 ID3 算法包含信息增益计算和决策树可视化让您深入理解决策树的工作原理。1. 决策树与 ID3 算法基础决策树模仿人类做决策的过程通过一系列如果...那么...的规则对数据进行分类。想象一位医生诊断疾病的过程首先检查体温如果体温高则考虑感染再结合其他症状逐步缩小可能性——这正是决策树的工作方式。ID3 算法由 Ross Quinlan 在 1986 年提出其核心是通过信息增益选择最优划分属性。信息增益基于信息论中的熵概念熵(Entropy)衡量系统混乱程度的指标。在分类问题中熵越小表示数据纯度越高信息增益(Information Gain)表示特征对减少熵的贡献程度增益越大说明该特征分类效果越好数学上信息增益计算公式为Gain(D,A) H(D) - Σ(|Dv|/|D|)*H(Dv)其中 H(D) 是数据集 D 的熵Dv 是特征 A 取值为 v 的子集。2. 环境准备与数据加载我们将使用 Python 3.x 和几个核心库import numpy as np import pandas as pd from math import log2 from graphviz import Digraph准备一个简单的数据集用于演示这是一个关于是否适合户外活动的决策问题data { 天气: [晴, 晴, 多云, 雨, 雨, 雨, 多云, 晴, 晴, 雨], 温度: [热, 热, 热, 适中, 冷, 冷, 冷, 适中, 冷, 适中], 湿度: [高, 高, 高, 高, 正常, 正常, 正常, 高, 正常, 正常], 风力: [弱, 强, 弱, 弱, 弱, 强, 强, 弱, 弱, 弱], 活动: [否, 否, 是, 是, 是, 否, 是, 否, 是, 否] } df pd.DataFrame(data)3. 核心算法实现3.1 计算熵首先实现计算熵的函数def calculate_entropy(data): total len(data) if total 0: return 0 value_counts data.value_counts() entropy 0 for count in value_counts: probability count / total entropy - probability * log2(probability) return entropy3.2 计算信息增益接着实现计算信息增益的函数def calculate_information_gain(data, feature, target): total_entropy calculate_entropy(data[target]) # 计算按特征分割后的加权熵 values data[feature].unique() weighted_entropy 0 for value in values: subset data[data[feature] value][target] subset_entropy calculate_entropy(subset) subset_weight len(subset) / len(data) weighted_entropy subset_weight * subset_entropy return total_entropy - weighted_entropy3.3 选择最佳划分特征基于信息增益选择最佳划分特征def choose_best_feature(data, features, target): best_gain -1 best_feature None for feature in features: gain calculate_information_gain(data, feature, target) if gain best_gain: best_gain gain best_feature feature return best_feature3.4 构建决策树递归构建决策树的核心函数def build_decision_tree(data, features, target, treeNone): # 如果所有样本属于同一类别则返回该类别 if len(data[target].unique()) 1: return data[target].iloc[0] # 如果没有特征可用于划分则返回多数类 if len(features) 0: return data[target].mode()[0] # 选择最佳划分特征 best_feature choose_best_feature(data, features, target) # 初始化树结构 if tree is None: tree {} tree[best_feature] {} # 递归构建子树 for value in data[best_feature].unique(): subset data[data[best_feature] value] if len(subset) 0: tree[best_feature][value] data[target].mode()[0] else: remaining_features [f for f in features if f ! best_feature] tree[best_feature][value] build_decision_tree( subset, remaining_features, target) return tree4. 决策树可视化使用 Graphviz 可视化生成的决策树def visualize_decision_tree(tree, filenamedecision_tree): dot Digraph(commentDecision Tree) def add_nodes_edges(tree, parent_nodeNone, edge_labelNone): if isinstance(tree, dict): for feature, branches in tree.items(): node_label f{feature}? if parent_node is None: dot.node(node_label, shapediamond) else: dot.node(node_label, shapediamond) dot.edge(parent_node, node_label, labeledge_label) for value, subtree in branches.items(): child_node f{feature}{value} if isinstance(subtree, dict): add_nodes_edges(subtree, node_label, str(value)) else: dot.node(child_node, labelf活动{subtree}, shapebox) dot.edge(node_label, child_node, labelstr(value)) add_nodes_edges(tree) dot.render(filename, formatpng, cleanupTrue) return dot5. 完整示例与结果分析将上述函数组合起来运行# 准备数据 features [天气, 温度, 湿度, 风力] target 活动 # 构建决策树 decision_tree build_decision_tree(df, features, target) print(生成的决策树:, decision_tree) # 可视化决策树 visualize_decision_tree(decision_tree)运行后将生成如下决策树结构以文字形式表示{ 湿度: { 高: { 风力: { 弱: 否, 强: 否 } }, 正常: 是 } }从可视化结果可以看出算法首先选择湿度作为根节点说明它对分类影响最大当湿度为高时进一步检查风力情况当湿度为正常时直接判定为适合户外活动6. 算法优化与扩展虽然我们的实现已经能够工作但在实际应用中还可以考虑以下改进处理连续值当前实现仅支持离散特征可通过二分法处理连续值剪枝策略添加预剪枝或后剪枝防止过拟合其他划分标准实现C4.5算法的增益率或CART的基尼指数缺失值处理增加对缺失数据的处理能力一个简单的预剪枝实现示例def build_decision_tree_with_pruning(data, features, target, max_depth3, min_samples_split2, depth0): # 终止条件达到最大深度或样本数不足 if depth max_depth or len(data) min_samples_split: return data[target].mode()[0] # 原build_decision_tree的实现...决策树作为一种白盒模型其最大优势在于可解释性强。通过本文的实现您不仅理解了ID3算法的原理还掌握了如何用Python实现核心功能。这种实现方式虽然简单但包含了决策树最核心的思想为进一步学习更复杂的树模型如随机森林、GBDT等打下了坚实基础。

相关新闻

Kioxia 与 Sandisk 在北上工厂 Fab2 启动第十代 3D 闪存产品生产

Kioxia 与 Sandisk 在北上工厂 Fab2 启动第十代 3D 闪存产品生产

两家公司展示 K2 制造设施建设持续推进,以满足不断增长的 NAND 闪存市场需求 Kioxia Holdings Corporation(东京证券交易所代码:285A)旗下子公司 Kioxia Corporation 与 Sandisk Corporation(纳斯达克股票代码&#x…

2026/7/7 1:49:59 阅读更多 →
HDFS C++ SDK 超详细实战教程|完整编译、API解析、生产可用Demo

HDFS C++ SDK 超详细实战教程|完整编译、API解析、生产可用Demo

在大数据后端开发、离线计算、日志归档、数据同步场景中,HDFS 是最主流的分布式文件存储系统。日常开发中Java生态可直接使用Hadoop原生SDK,而C高性能服务、边缘计算、离线检索、底层存储组件开发,必须使用 HDFS C SDK(libhdfs&am…

2026/7/7 1:47:57 阅读更多 →
开发环境准备

开发环境准备

配置深度学习环境 配置参考 vscode连接到conda环境 1.安装python插件 2.打开自己的.py文件 3.Ctrl Shift P 呼出命令面板,输入Python: Select Interpreter,选择自己的conda环境 4.执行测试 import torch import timeprint("" * 40) prin…

2026/7/7 1:45:57 阅读更多 →

最新新闻

AI视频生成技术在游戏特效制作中的应用实践

AI视频生成技术在游戏特效制作中的应用实践

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 这次我们来看一个基于AI视频生成技术的"恐惧魔王 吞噬魔法"特效测试项目。这个项目展示了如何利用AI技术实现游戏角色特效的…

2026/7/7 2:40:13 阅读更多 →
本地AI部署实战指南:从环境配置到性能优化的完整解决方案

本地AI部署实战指南:从环境配置到性能优化的完整解决方案

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 今天我们来聊聊一个让很多开发者头疼的问题:本地AI部署。虽然标题提到了"一人公司"的困境,但本文重…

2026/7/7 2:38:12 阅读更多 →
Claude偷改了你一行代码

Claude偷改了你一行代码

摘要:2026 年 6 月底,Reddit 开发者逆向 Claude Code 客户端,发现 Anthropic 用隐写术在中国用户请求里嵌入隐藏标记——读系统时区、比对 147 个加密域名、在日期字符串里替换 Unicode 字符。这段代码静默运行三个月,从未披露。三…

2026/7/7 2:36:12 阅读更多 →
面向AI应用的后端架构设计:协议选型、服务治理与可观测性

面向AI应用的后端架构设计:协议选型、服务治理与可观测性

引言:AI应用的后端挑战与传统架构的差异 在AI应用从概念验证走向生产部署的过程中,后端架构面临的挑战与传统互联网应用有本质差异。传统后端系统追求的是低延迟、高吞吐、确定性响应,而AI应用的核心瓶颈往往不在业务逻辑,而在于…

2026/7/7 2:36:12 阅读更多 →
[实战]Python爬取全国考研数据与可视化(附源码)

[实战]Python爬取全国考研数据与可视化(附源码)

很多考研同学都会关注院校招生人数、专业分数线等信息,手动整理效率极低。本篇用 Python 完成接 口爬虫 数据存储 可视化分析全流程实战,从考研网站抓取院校专业数据,再通过图表直观分析数据,适合爬虫、数据分析入门学习。 一、…

2026/7/7 2:36:12 阅读更多 →
ComfyUI整合包+KREA2模型:AI绘画本地部署全攻略

ComfyUI整合包+KREA2模型:AI绘画本地部署全攻略

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 如果你正在为AI绘画的复杂环境配置而头疼,特别是想要体验最新的KREA2模型却苦于繁琐的安装过程,那么萝卜大佬的…

2026/7/7 2:34:11 阅读更多 →

日新闻

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

图片浏览是移动应用中最高频的场景之一。从社交应用的照片流到电商平台的商品图集,从旅游应用的景点相册到摄影作品展示——用户对图片浏览的体验要求不断提高:流畅的切换动画、直观的缩略图导航、便捷的收藏操作、自动播放模式。HarmonyOS NEXT ArkUI 虽…

2026/7/7 0:05:16 阅读更多 →
24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V稳压芯片完整选型指南 PW8600 PW75XX PW2815 PW2312B LDODC/DC全方案 一、24V稳压方案概述 24V直流电源在工业自动化、门禁系统、电梯控制、汽车电子、LED驱动、监控设备等场景中应用极广,是最常见的中压直流母线电压。要将24V母线稳定降压至下游MCU、传感器…

2026/7/7 0:05:16 阅读更多 →
RAG+知识图谱混合检索与Graph RAG核心对比

RAG+知识图谱混合检索与Graph RAG核心对比

做企业RAG落地的团队,往往容易卡在一容易踩坑的选型难题: 当需求单纯靠向量RAG搞不定、单纯靠知识图谱也搞不定,必须同时依赖「文本语义理解 实体关系推理」时,到底是做「向量图谱混合检索」就够了,还是必须上「Grap…

2026/7/7 0:07:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻