决策树进阶学习笔记

一、经典决策树算法

  1. ID3算法

核心指标:以信息增益为特征选择标准。信息增益越大,使用该属性划分数据的"纯度提升"越明显,优先选择该属性作为划分节点。

公式逻辑:信息增益 = 划分前的熵 - 划分后的条件熵。

局限性:对可取值数目较多的属性存在偏好(例如"编号"这类唯一值属性,理论上信息增益最大,但无实际决策意义)。

示例数据:基于7条"是否出去玩"的记录(特征包括天气、温度、湿度、是否多云),ID3会优先选择信息增益最大的特征作为根节点。

  1. C4.5算法

核心改进:针对ID3的偏好问题,引入信息增益率作为特征选择标准,避免受多取值属性的过度影响。

公式:信息增益率 = 信息增益 ÷ 该属性自身的熵(自身熵可理解为属性取值的不确定性,取值越多,自身熵越大,从而平衡信息增益)。

适用场景:解决ID3对多取值属性的偏好问题,更适合特征取值差异较大的数据集。

  1. CART算法

核心指标:使用基尼指数(Gini(D)) 衡量数据纯度,用于分类任务(CART也可用于回归,此处聚焦分类)。

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

关键规律:p_k越大(数据越集中于某一类),Gini(D)越小,数据集纯度越高;反之则纯度越低。

划分逻辑:选择使划分后基尼指数最小的特征及切分点,构建二叉决策树(CART树均为二叉树,每个节点仅分两个分支)。

二、连续值特征的处理

核心思路:通过"离散化"将连续值转化为离散的二分类(二分法),具体步骤依赖贪婪算法。

  1. 排序:将连续特征的所有取值按从小到大排序。

  2. 确定分界点:若连续值有m个不同取值,可产生m-1个潜在分界点(相邻两个取值的中点)。例如特征"应税收入(Taxable Income)"取值排序后为[60K,70K,75K,85K,90K,95K,100K,120K,125K,220K],可产生9个分界点(如65K、72.5K等)。

  3. 选择最优分界点:计算每个分界点二分数据后的纯度指标(如信息增益、基尼指数),选择纯度最优的分界点作为最终切分标准(例如将"Taxable Income"划分为"≤97.5K"和">97.5K")。

三、决策树剪枝策略(解决过拟合)

  1. 剪枝原因

决策树在训练时易因"完全拟合训练数据"导致过拟合(理论上可完美划分训练集,但对新数据泛化能力差),需通过剪枝简化树结构,提升泛化能力。

  1. 预剪枝

定义:边构建决策树边剪枝,在树的生长过程中提前停止分支,是更实用的剪枝方式。

剪枝依据:通过设置约束条件限制树的生长,常见约束包括:

限制树的最大深度(如最大深度设为5-20,避免树过深)。

限制叶子节点的最少样本数(如叶子节点至少包含10个样本,否则停止分支)。

限制特征的最小信息增益/基尼指数变化(若划分后纯度提升未达阈值,停止分支)。

优点:计算成本低,可避免构建复杂的全树;缺点:可能因"提前停止"导致欠拟合(树的复杂度不足)。

  1. 后剪枝

定义:先构建完整的决策树,再从叶子节点向根节点反向剪枝,移除对泛化能力无帮助的分支。

衡量标准:通过"损失函数"判断是否剪枝,公式为:最终损失 = 树的自身基尼系数值 + α×叶子节点数量(α为正则化参数)。

α越大:正则化越强,更倾向于减少叶子节点数量(简化树结构),降低过拟合风险,但可能牺牲模型精度。

α越小:更注重模型对训练数据的拟合效果,剪枝力度弱,过拟合风险较高。

剪枝逻辑:对比"保留某分支"与"将该分支剪为叶子节点"的损失函数值,若剪枝后损失更小,则执行剪枝。

示例:某分支"色泽=?"剪枝前验证集精度57.1%,剪枝后提升至71.4%,则选择剪枝;"纹理=?"剪枝前精度42.9%,剪枝后57.1%,同样选择剪枝。

优点:泛化能力通常优于预剪枝,不易欠拟合;缺点:需先构建全树,计算成本较高。

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

  1. 核心函数

DecisionTreeClassifier():sklearn中用于创建分类决策树模型的核心类。

  1. 关键参数说明

参数 含义与取值

criterion 纯度衡量标准:gini(默认,基尼指数)、entropy(信息熵)

splitter 切分点选择方式:best(默认,在所有特征中找最优切分点)、random(在部分特征中随机找切分点,用于随机森林)

max_features 划分时考虑的最大特征数:None(默认,使用所有特征)、log2(取log2(特征数))、sqrt(取根号下特征数)、整数N(指定N个特征)

max_depth 树的最大深度:None(默认,不限制深度)、整数(推荐5-20,控制树的复杂度,避免过拟合)