楼主: hulunjiang
80 0

决策树算法:从原理到实战应用 [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

小学生

14%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
40 点
帖子
3
精华
0
在线时间
0 小时
注册时间
2018-9-3
最后登录
2018-9-3

楼主
hulunjiang 发表于 2025-11-26 11:13:34 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

决策树算法解析

决策树是一种广泛应用的分类技术,其核心思想是通过构建树状结构进行逐层判断,最终实现对数据的分类。与依赖概率统计的朴素贝叶斯或逻辑回归不同,决策树无需先验知识,因此在探索性数据分析中表现出较强的适应性和可解释性。

这种分类方式模拟了人类实际决策过程。例如,在购房决策中,人们通常首先关注单价是否在预算范围内;若符合,则进一步考察面积、地段、交通等因素,逐步缩小选择范围。决策树正是将这一系列“如果…则…”的推理过程形式化,并结合量化标准形成系统化的分类机制。

从结构上看,决策树由三类节点构成:根节点代表全部训练样本集合;内部节点用于测试某个特征属性;叶节点则表示最终的分类结果。整个分类流程始于根节点,根据样本各特征值依次向下分支,直至抵达某一叶节点,输出对应的类别标签。

决策树的学习流程

构建一个有效的决策树主要包括三个阶段:特征选择、树的生成以及剪枝处理。

其中,特征选择的目标在于识别出最具区分能力的属性,以便更有效地划分样本空间。理想情况下,每一次分割都应使子节点中的样本尽可能归属于同一类别,从而提升分类纯度。

常用的特征选择标准之一是信息增益,它源自信息论,衡量的是在已知某特征条件下,数据类别不确定性的降低程度。信息增益越大,说明该特征对于分类的帮助越显著。该过程采用自顶向下的贪心策略:每一步计算所有可用特征的信息增益,选取最大者作为当前节点的划分依据。

以银行贷款审批为例,申请人的年龄、职业状态、是否有房产等都是可能影响审批结果的因素。若“是否有房产”这一特征能完全决定是否放贷,则其信息增益将达到最大值,成为首选划分条件;反之,若“年龄”与贷款结果无明显关联,则其信息增益较小,分类贡献有限。

ID3 算法简介

ID3(Iterative Dichotomiser 3)是最早提出的决策树算法之一,其核心机制是利用信息增益来选择最优划分特征。算法从根节点开始,递归地挑选信息增益最高的特征作为当前节点的判断条件,并据此分裂数据集,持续构建子树,直到满足停止条件(如信息增益低于阈值或特征耗尽)为止。

然而,ID3存在一个明显缺陷:它倾向于选择取值较多的特征(如身份证号),因为这类特征往往能带来更高的信息增益,但容易导致过拟合,削弱模型泛化能力。

为解决此问题,后续发展出了C4.5算法,引入了“信息增益比”作为新的选择标准。该指标通过引入固有值(Intrinsic Value)对信息增益进行归一化处理,有效缓解了对多值属性的偏好,提升了模型稳定性。

此外,还有一种重要的替代方案——CART算法,它采用基尼系数而非熵模型来进行特征评估,提供了另一种高效的建树路径。

CART 算法原理

CART(Classification and Regression Tree)既适用于分类任务,也可用于回归分析,具有较高的通用性。假设数据集中包含 K 个类别,第 k 类的概率为 pk,则基尼系数定义如下:

Gini = 1 - ∑K pk2

直观理解,基ini系数反映了从数据集中随机抽取两个样本且它们属于不同类别的概率。该值越小,表明样本集合的类别一致性越高,即纯度越高。

相比基于对数运算的熵模型,基尼系数计算更为简洁,避免了复杂的对数操作,因而执行效率更高,特别适合大规模数据处理。

在回归任务中,CART使用平方误差作为划分准则。给定数据集 D 被划分为两个子集 D 和 D,其平方误差定义为:

SE(D) = Σi∈D(yi - )2

总误差为两部分之和:

SE(D, D) = SE(D) + SE(D)

其中 yi 表示样本真实值, 为该组样本的均值。

CART始终采用二分策略,即每个非叶节点仅分裂为两个子节点,最终形成一棵二叉树。在寻找最佳切分点时,需遍历所有特征及其可能的分割位置,选择使基尼系数或误差最小的组合。

例如,对于具有三个类别 A、A、A 的特征 A,CART会尝试以下三种二分方式:{A}/{A,A}、{A}/{A,A}、{A}/{A,A},并从中选出最优划分方案。

CART 分类树的构建步骤

  1. 初始化根节点:将全部训练样本置于根节点。
  2. 计算基尼系数:针对每个特征,枚举所有可能的切分点,计算对应基尼系数(或回归场景下的平方误差),确定使指标最小的最优切分点。
  3. 选择最优划分特征:在所有特征中,选取基尼系数或误差最小的那个作为当前节点的划分依据。
  4. 划分数据集:依据选定特征的最佳切分点,将数据分为两个子集,分别送入左子节点和右子节点。
  5. 递归建树:对每个子节点重复上述过程,继续分裂,直至满足预设终止条件(如节点内样本纯度达标、样本数量过少等)。
  6. 生成叶节点:当停止条件触发时,将当前节点标记为叶节点,并依据多数投票原则为其分配类别标签。

上图展示了一个典型的 CART 分类树构建实例,涉及 100 个样本的二分类问题。通过多次基于特征的最优切分,算法成功将两类样本清晰分离,体现了 CART 在分类任务中的有效性。

决策树作为一种直观且高效的分类与回归工具,其核心在于通过特征选择、树结构生成以及剪枝等步骤,从数据中提取出可解释性强的规则。其中,CART(Classification and Regression Trees)算法是决策树的经典实现方式之一,它在构建二叉树模型时,针对分类任务采用基尼系数作为划分依据,而在回归任务中则使用平方误差来评估最优切分点。

4. 过拟合问题与剪枝策略

与多数机器学习模型类似,决策树容易出现过拟合现象,即模型在训练集上表现优异,但在新样本上的泛化能力较差。为缓解这一问题,“剪枝”成为关键手段。剪枝通过移除部分分支降低模型复杂度,从而提升其泛化性能。

衡量泛化能力是否提升的一种方法是定义并最小化损失函数,该过程类似于正则化的最大似然估计中的模型选择机制。另一种更直接的方式是从原始训练集中划分出一部分作为验证集,依据模型在验证集上的预测精度变化来判断是否执行剪枝操作。

常见的剪枝方法分为两类:预剪枝和后剪枝。

  • 预剪枝:在树的构建过程中对每个节点进行评估,若当前划分不能带来泛化性能的提升,则停止分裂,并将该节点标记为叶节点。这种方法能有效减少训练时间和计算开销,但存在“误剪”的风险,可能提前删除未来有潜力的分支,导致欠拟合。
  • 后剪枝:先生成完整的决策树,再自底向上地考察各个子树,比较剪枝前后的验证集精度,决定是否保留某一分支。相比预剪枝,后剪枝通常保留更多有用结构,欠拟合风险更低,但训练成本更高。

后剪枝中广泛应用的是代价-复杂度剪枝(Cost-Complexity Pruning, CPP)。该方法引入一个复杂度参数 α,用于平衡模型的训练误差与结构复杂性之间的关系。

损失函数定义如下:

Rα(T) = R(T) + α|T|

其中:

  • R(T) 表示决策树 T 在验证集上的误差率;
  • |T| 表示树中叶节点的数量;
  • α 是控制剪枝强度的超参数。

通过调节 α 的大小,可以控制最终模型的复杂程度。具体实施步骤包括:

  1. 生成完整决策树:首先基于全部训练数据构建一棵充分生长的树。
  2. 生成子树序列:从最底层开始,逐次剪去某个内部节点下的所有子节点,将其变为叶节点,形成一系列候选子树。
  3. 计算各子树损失:对每一个子树计算其对应的 Rα(T) 值。
  4. 选择最优子树:选取使 Rα(T) 最小的子树作为最终输出模型。

6. Scikit-learn 中的决策树实现

在 Python 的 Scikit-learn 库中,可通过 DecisionTreeClassifierDecisionTreeRegressor 类分别实现分类与回归任务。以下是一个基于鸢尾花数据集的分类示例。该数据集包含 150 个样本,每个样本具有四个特征:花萼长度、花萼宽度、花瓣长度和花瓣宽度,目标变量为三种鸢尾花类别。

from sklearn.datasets import load_iris
from sklearn import tree
from sklearn.model_selection import train_test_split

#----------------数据准备-----------------------
iris = load_iris()                                              # 加载数据
#划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target,
                                                     test_size=0.1, random_state=12)

clf = tree.DecisionTreeClassifier()                             # sk-learn的决策树模型
clf = clf.fit(X_train, y_train)                                 # 用数据训练树模型

#---------------模型预测结果--------------------
pred_target_prob = clf.predict_proba(X_test)                    # 预测类别概率
pred_target = clf.predict(X_test)                               # 预测类别

#---------------打印结果------------------------
print("真实类别:\n", y_test)
print("预测类别概率:\n", pred_target_prob)
print("预测类别:\n", pred_target)

5. 总结

决策树因其良好的可解释性和实用性,在分类与回归任务中被广泛使用。CART 算法通过基尼指数或平方误差实现高效的数据划分,构建出二叉结构的决策树。结合剪枝技术,尤其是后剪枝中的 CPP 方法,能够显著降低过拟合风险,增强模型的泛化能力。掌握决策树的基本原理及其在 Scikit-learn 中的实现方式,对于解决实际数据分析问题具有重要价值。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:决策树 scikit-learn regression classifier Complexity

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
jg-xs1
拉您进交流群
GMT+8, 2026-1-10 02:47