决策树的学习 总说过程参考黑马 用于自学https://www.bilibili.com/video/BV1Fzszz4Ek7/?spm_id_from333.788.videopod.episodesvd_source24c1e92bdfe1c6a0f1b228cda0583ac9p68目录总说一、决策树的介绍1.1 决策树的组成结构1.2 决策树的建立过程1.3 决策树的分类二、特征选择方式2.1 信息熵2.2 信息增益2.3 信息增益率2.4 基尼系数三、ID3决策树四、C4.5决策树4.1 连续特征处理五、CART决策树5.1 CART分类树5.1.1 连续型特征处理5.1.2 案例泰坦尼克号生存预测的案例5.1.2.1 数据说明5.1.2.2 代码实现5.2 CART回归树5.2.1 连续型特征处理5.2.2 划分标准5.2.3 案例5.2.3.1 数据说明5.2.3.2 代码实现六、决策树的剪枝6.1 剪枝类型一、决策树的介绍决策树是一种基于树状结构进行决策的机器学习算法既可用于分类任务也可用于回归任务。核心思想通过一系列“是/否”或“多选一”的问题将数据不断划分使得划分后的每个子集尽可能属于同一个类别 或者 目标值尽量接近1.1 决策树的组成结构组成部分含义根节点Root Node树的起点包含所有样本选择最优特征进行第一次划分内部节点Internal Node中间的判断节点每个节点代表对一个特征的测试分支Branch从一个节点指向下一个节点的路径代表特征的取值叶节点Leaf Node树的末端不再继续划分输出最终的预测结果1.2 决策树的建立过程要点说明建树本质递归地选择最优特征划分数据使子集纯度越来越高核心步骤特征选择 → 划分数据集 → 递归构建子树 → 停止条件判断防止过拟合通过限制树深度、最小样本数、剪枝等手段控制树的大小调参在复杂度拟合训练集和泛化能力预测测试集之间找平衡1.3 决策树的分类三种主流算法ID3、C4.5、CARTCART 是最常用sklearn 默认采用 CART支持分类和回归生成二叉树三种决策树的特征选择方式有所不同三种决策树适用的特征类型也不同类型说明常见算法分类树输出为离散的类别标签如是/否、猫/狗ID3、C4.5、CART分类回归树输出为连续的数值如房价、温度CART回归二、特征选择方式2.1 信息熵熵信息论中代表随机变量不确定度的度量。熵的大小的含义熵值含义熵大不确定性高信息量大数据更混乱熵小不确定性低信息量小数据更纯净熵 0完全确定某个事件概率为 1熵最大所有事件等概率完全随机信息熵的计算公式如下在同种特征中一共n种目标类别(标签类别)的总数是第i种类别的概率(占比)2.2 信息增益信息增益Information Gain是ID3决策树中用于选择最优划分特征的核心指标。本质衡量一个特征对分类任务提供的信息量大小信息增益的数学定义特征A 对 训练数据集D 的信息增益G(D, A)定义为集合D的熵H(D)与 在给定条件特征A下的 D的熵H(D|A)之差。即信息增益 熵 - 条件熵数学公式如下条件熵的公式如下k 是特征 A 的取值个数是第 j 个子集的样本数是第 j 个子集的熵先计算其中的其中n代表目标类别个数表示在第 j 个子集中属于第 i 类的样本数就是在子集内部第 i 种类别的比例则将带入到可以写成可以消去Dj结果为而可以写成所以最后公式可以写为2.3 信息增益率特征熵类似于信息熵信息熵是看目标类别特征熵是看一个特征的取值惩罚系数即特征熵的倒数1/特征熵特征取值越多特征熵越大惩罚系数越小信息增益越小信息增益率(比) 信息增益 / 特征熵公式如下其中Gain_Ratio(D, a)是信息增益率(公式编译器无法打下划线所以上方公式没下划线)G(D, a) 是信息增益IV(a)是特征熵计算公式类似与信息熵。公式如下2.4 基尼系数基尼值Gini Index / Gini Impurity衡量的是数据集的不纯度纯度。它表示从数据集D中随机抽取两个样本其类别标签不一致的概率。一共m个类别是第i种类别的概率。基尼值越小数据D的纯度越高基尼系数Gini index/ 基尼增益用某个特征划分数据集后基尼值下降的程度。公式如下基尼指数本质分裂前的基尼值 - 分裂后各子集基尼值的加权平均基尼系数越大该特征的分裂效果越好三、ID3决策树ID3Iterative Dichotomiser 3是决策树算法中最经典的一个版本它使用信息增益作为特征选择标准通过递归方式构建决策树。仅支持离散型特征仅支持分类任务ID3的构建是一个自上而下、分而治之的递归过程其核心思想是每一步都选择信息增益最大的特征进行划分使数据纯度提升最快。构建流程总览1、计算每个特征的信息增益2、选择信息增益最大的特征将数据集划分成若干子集3、使用该特征做为决策树的一个节点4、用剩余的特征重复1~3步四、C4.5决策树C4.5Classifier 4.5是 ID3 算法的改进版本它在 ID3 的基础上做了多项重要改进解决了 ID3 的核心缺陷。ID3 的缺陷C4.5 的改进偏向多取值特征如 ID 编号改用信息增益率(比)加入特征自身的惩罚项不能处理连续特征引入连续特征二分法自动寻找最优切分点不能处理缺失值引入缺失值处理策略加权划分容易过拟合引入后剪枝简化树结构分裂信息可以被理解为特征自身的“信息量”。取值越多、分布越均匀的特征其分裂信息越大作为分母时会把信息增益“拉低”从而修正了多取值特征的天然优势。属性说明特征选择标准信息增益率(比)Gain Ratio支持特征类型离散型 、连续型支持连续特征二分法树结构多叉树输出分类任务改进特性✅ 支持剪枝 ✅ 支持缺失值处理4.1 连续特征处理C4.5 支持连续型特征如温度、湿度、收入等但决策树的划分分支需要离散取值。解决方法二分法步骤1对连续特征的值进行排序步骤2取相邻两个值的中点作为候选切分点取平均值步骤3计算每个切分点的信息增益步骤4选择信息增益最大的切分点进行二分特点说明每个连续特征只用一次一个连续特征在路径上被使用后不再重复使用与离散特征相同生成二叉树连续特征总是二分为“≤阈值”和“阈值”两个分支计算成本较高需要对每个连续特征排序并遍历所有切分点五、CART决策树CARTClassification and Regression Trees分类与回归树是决策树算法中的集大成者。属性说明特征选择标准基尼系数Gini Index支持特征类型离散型 连续型树结构二叉树每个节点最多两个分支输出分类 回归重要特性二叉树结构、支持剪枝、处理缺失值回归树使用平方误差最小化策略分类生成树用基尼指数最小化策略5.1 CART分类树特征选择使用基尼系数优先选择基尼值小的特征做为节点5.1.1 连续型特征处理步骤1将连续特征的所有取值排序步骤2取相邻两个值的平均值作为候选切分点步骤3对每个候选切分点将数据二分步骤4计算每个切分点的基尼系数步骤5选择基尼系数最大的切分点作为最优切分点5.1.2 案例泰坦尼克号生存预测的案例5.1.2.1 数据说明这里只选择使用Pclass、Age、Sex特征标签列为Survived5.1.2.2 代码实现代码如下import pandas as pd from sklearn.model_selection import train_test_split # 划分训练集和测试集 from sklearn.tree import DecisionTreeClassifier # 决策树分类器 from sklearn.metrics import classification_report # 分类报告 import matplotlib.pyplot as plt # 可视化 from sklearn.tree import plot_tree # 绘制决策树 #VS Code 终端默认编码不是 UTF-8 不是VS Code 可以不用写 import sys sys.stdout.reconfigure(encodingutf-8) # 强制让控制台使用 UTF-8 编码输出文字 # 1. 加载数据集 data pd.read_csv(./DecisionTree/data/train.csv) # data.info() # print(data.head()) # 2. 数据预处理 # 2.1 提取特征和标签 x data[[Pclass, Sex, Age]] y data[Survived] # 2.2 发现Age列有缺失使用平均值来填充 x.loc[:, Age] x[Age].fillna(x[Age].mean()) #print(x.info()) # 2.3 将Sex列 进行one-hot编码 x pd.get_dummies(x, columns[Sex]) # 2.4 划分训练集和测试集 x_train, x_test, y_train, y_test train_test_split(x, y, test_size0.2, random_state23) # 3. 特征工程 # 4. 模型训练 # 这里是CART模型, ID3和C4.5模型需要手动实现 # 默认使用基尼系数 max_depth 10 表示树的最大深度为10 estimator DecisionTreeClassifier(max_depth10) estimator.fit(x_train, y_train) # 5. 模型预测 y_pre estimator.predict(x_test) print(f预测结果{y_pre}) # 6. 模型评估 print(f分类评估报告\n {classification_report(y_test, y_pre)}) # 7. 绘制决策图 plt.figure(figsize(30, 20)) # 设置画布大小最后放大会看不清想看清可以设置大一点 # 参数1: 模型对象 参数2: 是否填充颜色 参数3: 树的最大深度 plot_tree(estimator, filledTrue, max_depth10) # 绘制决策树 plt.savefig(./DecisionTree/data/decision_tree.png) # 保存决策树图片 plt.show()5.2 CART回归树CART回归树预测输出的是一个连续值。回归树的完整构建流程步骤内容计算方式1计算当前节点的 MSE2对每个特征对连续特征进行处理遍历切分点计算分裂后的 MSE3选择使 MSE 下降最多的特征和切分点计算ΔMSE4按最优切分点将数据集分为两部分左子集 ≤ 阈值右子集 阈值5递归构建子节点重复步骤 1~46叶节点输出该节点所有样本的均值5.2.1 连续型特征处理步骤1将连续特征的所有取值排序步骤2取相邻两个值的平均值作为候选切分点步骤3对每个候选切分点将数据二分步骤4计算每个切分点的基尼系数步骤5选择基尼系数最大的切分点作为最优切分点5.2.2 划分标准CART回归树使用均方误差MSE来划分计算公式如下其中是预测值是样本值n为样本数量。MSE 越大 → 节点内样本值越分散越混乱5.2.3 案例线性回归 和 CART回归决策树 对比5.2.3.1 数据说明5.2.3.2 代码实现代码如下import pandas as pd import numpy as np import matplotlib.pyplot as plt # 可视化 from sklearn.tree import DecisionTreeRegressor # 回归决策树 from sklearn.linear_model import LinearRegression # 线性回归 #VS Code 终端默认编码不是 UTF-8 不是VS Code 可以不用写 import sys sys.stdout.reconfigure(encodingutf-8) # 强制让控制台使用 UTF-8 编码输出文字 # 1. 准备数据 x_train np.array(list(range(1, 11))).reshape(-1, 1) y_train np.array([5.56, 5.7, 5.91, 6.4, 6.8, 7.05, 8.9, 8.7, 9.1, 9.3]) # 2. 数据预处理 该案例不需要 # 3. 特征工程 该案例不需要 # 4. 模型训练 # 4.1 分别创建 线性回归模型 和 回归决策树模型 estimator1 LinearRegression() estimator2 DecisionTreeRegressor(max_depth1) # max_depth1 表示树的最大深度为1 estimator3 DecisionTreeRegressor(max_depth3) # max_depth3 表示树的最大深度为3 # 4.2 模型训练 estimator1.fit(x_train, y_train) estimator2.fit(x_train, y_train) estimator3.fit(x_train, y_train) # 5. 模型预测 # 5.1 准备测试集的 特征数据 生成0-10的0.1间隔的数组 x_test np.arange(0, 10, 0.1).reshape(-1, 1) # 5.2 分别预测 y_pred1 estimator1.predict(x_test) y_pred2 estimator2.predict(x_test) y_pred3 estimator3.predict(x_test) # 6. 模型评估 略 # 7. 绘图 # 7.1 绘制真实值的散点图 plt.scatter(x_train, y_train, cgray) # 7.2 绘制线性回归模型的预测曲线 plt.plot(x_test, y_pred1, cred, labelLinearRegression) # 7.3 绘制回归决策树模型的预测曲线 plt.plot(x_test, y_pred2, cblue, labelmax_depth1) plt.plot(x_test, y_pred3, cgreen, labelmax_depth3) # 7.4 添加图例 plt.legend() # 7.5 设置x轴 y轴 标题 plt.xlabel(data) plt.ylabel(target) plt.title(LinearRegression vs DecisionTreeRegressor) plt.show()结果如图由此可知决策树可以做回归但是容易出现过拟合现象一般用来做分类六、决策树的剪枝剪枝的作用防止决策树过拟合的一种正则化方法提高模型泛化能力剪枝就是剪掉一些不必要的分支将一些子树的节点全部删掉用叶子节点来替换用更简单的树来预测。6.1 剪枝类型剪枝类型时机方法优点缺点预剪枝Pre-Pruning建树过程中对每个节点划分前进行估计若划分不能带来决策树泛化能力提升停止划分并标记为叶节点很多分支没有展开速度快开销小节约资源可能当前划分不能显著提升但是后续划分可以显著提高。可能欠拟合后剪枝Post-Pruning建树完成后自底向上考察非叶节点如果去掉该子树能带来泛化提升将该子树替换成叶节点保留更多分支泛化性能往往优于预剪枝。欠拟合风险小训练时间开销大、计算开销大

本月热点