一、决策树基础概念1. 定义决策树属于有监督学习算法通过学习训练样本生成分层分类规则依靠这套规则对新样本完成预测。核心逻辑所有样本数据从根节点逐层向下判断最终落到叶子节点输出预测结果。学习决策树的目的主要是为随机森林打基础。决策树理解了随机森林就不难。树结构分为 3 类节点根节点整棵树第一个判断节点非叶子节点中间节点中间分层判断条件叶子节点无后续分支输出最终结果2. 构建决策树三大核心问题如何选定根节点、中间节点与叶子节点每个节点依据什么条件进行样本分裂节点分裂效果好坏的评判标准是什么二、三大经典决策树分类算法业界主流三种决策树算法区分核心在于样本分裂评判标准ID3 算法以信息熵为衡量指标C4.5 算法以信息增益率为衡量指标CART 算法以基尼系数为衡量指标sklearn 分类树默认使用2.1 ID3 算法信息熵1熵的含义熵代表数据集内部的混乱、不确定程度熵值越大样本类别越混杂熵值越小样本纯度越高。2熵计算公式数据集中第i类样本所占比例3实例对比集合 A集合 B对比可见集合 B 样本更混乱。2.2 C4.5 算法分裂评判标准信息增益率弥补 ID3 偏向取值多特征的缺陷。2.3 CART 算法sklearn 默认分裂评判标准基尼系数基尼值越接近 0样本纯度越高基尼值越大样本混杂度越高。sklearn 中DecisionTreeClassifier为二叉 CART 树。如何手动构建决策树可以查看开头文件。速通机器学习08-决策树资源-CSDN下载速通机器学习08-决策树资源-CSDN下载三、决策树剪枝1. 剪枝目的决策树无限制生长会过度学习训练集噪声引发过拟合剪枝删减多余分支降低模型复杂度提升泛化能力。2. 两种剪枝方式1预剪枝Sklearn 唯一原生支持建树过程中提前终止节点分裂从源头限制树规模训练速度更快。代码核心控制参数本次实战全部用到max_depth整棵树最大深度min_samples_split节点允许分裂的最少样本数少于则不分裂min_samples_leaf叶子节点最小样本数量设置基尼系数阈值分裂收益不足则停止划分2后剪枝先训练生成一棵完整无限制的大树再从底层叶子向上回溯修剪通过验证集判断若剪掉子树后模型效果不变或提升则删除该分支。优势拟合效果优于预剪枝缺点训练耗时高sklearn 无原生接口。3、核心调用代码导入决策树工具库from sklearn import tree分类决策树模型初始化调用dtr tree.DecisionTreeClassifier(criterion, max_depth, min_samples_split, min_samples_leaf)参数详解criterion节点分裂评判标准默认gini基尼系数CART算法可选entropy信息熵ID3算法用于衡量样本混乱度、筛选最优分裂特征。max_depth决策树最大深度核心预剪枝参数。限制树的生长层数数值越小模型越简单可直接限制复杂分支有效抑制过拟合。min_samples_split内部节点最小分裂样本数。当节点样本数量小于该值时停止分裂避免生成过多细碎分支。min_samples_leaf叶子节点最小样本数。分支分裂后生成的叶子节点样本数量不得小于该值杜绝单点样本分支提升模型泛化性。random_state随机种子固定模型训练随机逻辑保证每次运行训练结果一致便于参数对比、实验复现。以上参数均为核心配置模型会自动预剪枝本章K折超参数调优的核心遍历对象通过组合调参可精准平衡模型拟合能力与泛化能力。四、实战电信客户流失分类K 折交叉验证选最优预剪枝参数电信客户流失数据已经在文章开头给出。业务流程说明分层划分训练集、测试集测试集全程隔离不参与调参不做下采样直接使用原始不平衡训练数据训练5 折分层 K 折交叉验证遍历预剪枝超参数以召回率筛选最优组合最优参数训练模型分别评估训练集、测试集输出分类报告、混淆矩阵、可视化决策树完整可运行代码import pandas as pd from sklearn.model_selection import train_test_split, cross_val_score, StratifiedKFold from sklearn import tree from sklearn.metrics import classification_report, confusion_matrix import matplotlib.pyplot as plt from sklearn.tree import plot_tree 绘制混淆矩阵函数 def cm_plot(y, yp): cm confusion_matrix(y, yp) plt.matshow(cm, cmapplt.cm.Blues) plt.colorbar() for x in range(len(cm)): for y in range(len(cm)): plt.annotate(cm[x, y], xy(y, x), horizontalalignmentcenter, verticalalignmentcenter) plt.ylabel(True label) plt.xlabel(Predicted label) return plt 1.读取数据集 datas pd.read_excel(rD:\pythoncode2\bigdata_ai40\data\电信客户流失数据2.xlsx) 2.分层划分训练集、测试集先不拆分特征标签 data_train, data_test train_test_split(datas, test_size0.2, random_state42, stratifydatas.iloc[:, -1]) 移除下采样代码直接拆分训练集特征与标签 target_train data_train.iloc[:, -1] data_train data_train.iloc[:, :-1] target_test data_test.iloc[:, -1] data_test data_test.iloc[:, :-1] 3.构建5折分层交叉验证适配不平衡数据保证每折类别比例一致 skf StratifiedKFold(n_splits5, shuffleTrue, random_state42) 4.预剪枝超参数候选范围 tree_depth [1, 2, 3, 4] # max_depth 树最大深度 tree_min_leaf [1, 2, 3, 4, 5, 6, 7, 8] # min_samples_leaf 叶子最小样本 tree_min_samples [2, 3, 4, 5, 6] # min_samples_split 节点分裂最小样本 best_zuhe [0, 0, 0] best_recall 0 三重循环遍历所有参数组合K折验证取平均召回率 for l in tree_min_samples: for i in tree_depth: for j in tree_min_leaf: dtr tree.DecisionTreeClassifier( criteriongini, max_depthi, min_samples_leafj, min_samples_splitl, random_state42 ) # 交叉验证评估指标为召回率recall score cross_val_score(dtr, data_train, target_train, cvskf, scoringrecall) score_mean sum(score) / len(score) print(f深度{i},叶子最小{j},分裂最小{l}平均召回率{score_mean:.4f}) # 更新最优参数 if score_mean best_recall: best_recall score_mean best_zuhe[0] i best_zuhe[1] j best_zuhe[2] l print(*60) print(f交叉验证最优预剪枝参数组合\n树最大深度:{best_zuhe[0]}叶子最小样本:{best_zuhe[1]}节点分裂最小样本:{best_zuhe[2]}) print(f最优平均召回率{best_recall:.4f}) 5.使用最优预剪枝参数训练最终决策树模型 tr tree.DecisionTreeClassifier( criteriongini, max_depthbest_zuhe[0], min_samples_leafbest_zuhe[1], min_samples_splitbest_zuhe[2], random_state42 ) tr.fit(data_train, target_train) 6.训练集评估 train_pred tr.predict(data_train) print(\n【训练集分类评估报告】) print(classification_report(target_train, train_pred)) cm_plot(target_train, train_pred).show() 7.隔离测试集最终评估全程未参与调参模拟真实线上数据 te_pred tr.predict(data_test) print(\n【测试集最终分类评估报告】) print(classification_report(target_test, te_pred)) cm_plot(target_test, te_pred).show() 8.可视化决策树限制显示深度方便查看 plt.figure(figsize(16, 9)) plot_tree(tr, filledTrue, max_depth3) plt.show()代码分步讲解原始不平衡数据直接训练不做样本采样保留数据集真实分布分层划分保证训练、测试集流失客户占比和原数据一致。分层 K 折 StratifiedKFold普通 K 折会破坏类别比例分层 K 折保证每一折中流失、未流失客户比例和原始训练集一致交叉验证指标更可靠。三重循环遍历预剪枝超参数max_depth、min_samples_leaf、min_samples_split均为预剪枝控制参数以召回率为标准筛选最优组合防止过拟合同时保证流失客户不漏检。数据隔离规范测试集自始至终不参与交叉验证调参仅在参数确定后做一次最终验收杜绝数据泄露。决策树特性无需标准化特征不受数值量纲影响训练完成后可直接绘图每条判断规则可解释业务可读性强。五、核心注意点分类树DecisionTreeClassifier默认基尼系数回归树DecisionTreeRegressor默认 MSE 均方误差sklearn 仅支持预剪枝通过树深度、叶子样本数等参数实现无原生后剪枝 API不平衡数据集建议搭配分层划分stratify与StratifiedKFold保证类别均衡调参仅能使用训练集测试集仅做最终效果验证禁止参与交叉验证K 折交叉验证通用不止适用于决策树线性模型、集成模型均可使用不使用下采样时模型容易偏向多数类业务上可通过调整评估指标、损失函数优化本章简短总结决策树由根节点、中间节点、叶子节点构成ID3、C4.5、CART 分别依靠信息熵、信息增益率、基尼系数划分样本。为解决过拟合引入剪枝策略实操中依靠max_depth等参数实现预剪枝结合分层 K 折交叉验证筛选最优超参数。本章实战基于原始不平衡电信流失数据集移除下采样操作完整演示分层划分、参数寻优、模型评估全流程决策树可解释性优秀但单树稳定性弱下一章将学习集成学习随机森林优化该缺陷。