决策树 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等打下了坚实基础。

相关新闻

最新新闻

60台真机具身智能实训:珠三角/长三角一周产线实战

60台真机具身智能实训:珠三角/长三角一周产线实战

1. 项目概述:这不是一场普通培训,而是一次具身智能的“实体化”实战切片“60台真机:珠三角/长三角 具身智能 一周线下实训,你愿意参加吗?”——看到这个标题,我第一反应不是点开链接,而是立刻抓…

2026/7/7 3:31:37
怎样3分钟搞定网易云插件安装:BetterNCM安装器终极指南

怎样3分钟搞定网易云插件安装:BetterNCM安装器终极指南

怎样3分钟搞定网易云插件安装:BetterNCM安装器终极指南 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 还在为网易云音乐插件安装的繁琐步骤头疼吗?&#x1f91…

2026/7/7 3:31:37
演唱会科技演艺走红背后:机器人租赁,正在改写线下活动的创新边界

演唱会科技演艺走红背后:机器人租赁,正在改写线下活动的创新边界

演唱会科技演艺走红背后:机器人租赁,正在改写线下活动的创新边界 近期重温王力宏演唱会的舞台片段,依然会被机器人伴舞的创意震撼。 在传统演艺行业陷入同质化内卷的当下,这样一次人机共演的创新尝试,不仅收获了海量流…

2026/7/7 3:31:37
3个实用技巧:如何在OBS Studio中实现智能面部追踪直播

3个实用技巧:如何在OBS Studio中实现智能面部追踪直播

3个实用技巧:如何在OBS Studio中实现智能面部追踪直播 【免费下载链接】obs-face-tracker Face tracking plugin for OBS Studio 项目地址: https://gitcode.com/gh_mirrors/ob/obs-face-tracker OBS Face Tracker是一款专为OBS Studio设计的开源插件&#x…

2026/7/7 3:31:36
FlipDrop:一个面向本地商家的盲盒 + 秒杀 O2O 平台

FlipDrop:一个面向本地商家的盲盒 + 秒杀 O2O 平台

FlipDrop:基于 LBS 的盲盒限时抢购平台附近门店的闪击战 薅羊毛神器项目亮点 LBS 驱动:所有商品和活动按用户实时位置排序,强化"附近"场景双玩法融合:盲盒(惊喜感) 秒杀(紧迫感&…

2026/7/7 3:31:36
景区为什么要引入玻璃剧场?从客流、停留、传播到收益的完整分析

景区为什么要引入玻璃剧场?从客流、停留、传播到收益的完整分析

景区引入玻璃剧场的核心原因是什么?景区引入玻璃剧场的核心原因,是为了提升游客停留时间、增强沉浸体验、制造社交传播内容,并进一步带动门票、二消和综合收益。在今天的文旅市场中,单纯依靠自然景观、传统展陈或普通打卡点&#…

2026/7/7 3:26:36

月新闻