ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

决策树分类实验报告高分指南:从sklearn鸢尾花到收入预测的完整解析

决策树分类实验报告高分指南:从sklearn鸢尾花到收入预测的完整解析 简介这份资源是一份面向高校机器学习课程学习者的决策树分类算法实验报告以毒蘑菇食用安全性判别为应用场景适合正在完成课程大作业或需要参考完整实验范式的中高年级学生。压缩包内仅含1个docx文档约1.21MB内容涵盖研究意义、数据描述、模型描述、算法实现、运行结果与总结等完整章节并配有算法流程图与伪代码注释。实验基于UCI Mushroom数据集共8124个样本、22个原始特征经预处理扩展至117维采用ID3与CART两种特征选择策略构建决策树并引入后剪枝优化泛化能力最后通过混淆矩阵计算准确率、精度与召回率重点讨论食用物分类中召回率的重要性。报告结构规范、图表齐全可直接作为实验报告撰写模板也能帮助读者理解信息增益、基尼不纯度、剪枝逻辑与分类评估指标的实际应用。目前已有7564人学习下载具备较高的参考与复用价值。1. 决策树分类实验报告怎么写才不像流水账从「能跑通」到「拿高分」的分水岭很多人做机器学习决策树分类算法实验报告最后交上去的东西长这样导入 sklearn、fit 一下、predict 一下、accuracy 打印出来 0.95然后写一句「模型效果良好」。这种报告在头歌决策树进行鸢尾花分类-sklearn版这类平台上能过但一旦遇到需要拉开分差的机器学习高分大作业基本就是及格线徘徊。问题不在代码在于报告没有回答三个问题你为什么选决策树而不是逻辑回归树的深度和分裂依据是怎么定的0.95 的准确率背后模型到底学到了什么、又在哪儿翻车这篇笔记面向正在写机器学习决策树分类算法实验报告的人也面向想真正搞懂决策树分类器内部机制的入门者。我会按一份能拿高分的实验报告应有的结构把数据准备、模型训练、参数调优、可视化解释、避坑排查全部拆开讲每个环节给出可复现的代码和参数说明。读完你应该能独立完成一份既有工程细节、又有分析深度的报告而不是把 sklearn 官方示例改个数据集名就交上去。2. 决策树分类器的原理与选型为什么它仍是实验报告的首选模型2.1 从信息熵到基尼指数分裂依据到底在算什么决策树的核心动作只有一个在每个节点上选一个特征和一个阈值把当前数据集切成两份让切完之后的两份「纯度」尽可能高。衡量纯度的方式有两种主流实现对应两种分裂准则。信息熵entropy来自信息论公式是 $H -\sum_{i1}^{k} p_i \log_2 p_i$其中 $p_i$ 是当前节点里第 $i$ 类样本的占比。熵越小节点越纯。每次分裂带来的熵下降量叫信息增益ID3 算法就是选信息增益最大的特征来分裂。但信息增益有个偏向取值种类多的特征比如身份证号天然容易把数据切得很碎增益虚高。C4.5 用信息增益率修正了这个问题。基尼指数gini是另一条路线公式是 $Gini 1 - \sum_{i1}^{k} p_i^2$。它衡量的是「随机抽两个样本类别不一致的概率」。基尼指数计算不涉及对数工程上更快CART 算法默认用它。sklearn 的DecisionTreeClassifier默认准则就是 gini。实际写报告时你不需要把公式推导写满两页但必须说清楚你选的准则是什么、为什么选它、换一个准则结果差多少。这是区分「抄代码」和「懂模型」的第一道分水岭。2.2 预剪枝与后剪枝控制过拟合的两条路决策树最大的问题是如果不加限制它可以把训练集切到每个叶子节点只剩一个样本训练准确率 100%测试准确率惨不忍睹。这就是过拟合。控制手段分两类。预剪枝是在建树过程中提前停止分裂常用参数有参数含义典型取值影响max_depth树的最大深度3~10越小越保守太大容易过拟合min_samples_split节点分裂所需最小样本数2~20越大越保守min_samples_leaf叶子节点最小样本数1~10越大越平滑max_leaf_nodes最大叶子节点数10~100直接限制复杂度min_impurity_decrease分裂所需最小不纯度下降0~0.01收益太小就不分后剪枝是先让树长满再自底向上把收益不大的子树砍掉。sklearn 提供的是ccp_alpha参数代价复杂度剪枝值越大剪得越狠。实操中预剪枝更常用因为调参直观、训练快后剪枝适合数据量大、想榨干性能的场景。我一般会先设max_depth5跑一版基线看训练集和测试集的准确率差距。如果训练 0.99、测试 0.85说明过拟合往下压深度或加min_samples_leaf如果两边都只有 0.75说明欠拟合得放宽限制或检查特征质量。2.3 为什么实验报告选决策树而不是随机森林或 SVM热搜里常有人问随机森林和决策树区别这里直接说结论随机森林是决策树的集成版本靠多棵树投票降低方差通常效果更好但它是黑盒——你没法画出一棵完整的树来解释每个决策。SVM 在小样本高维数据上强但调参复杂、解释性差。决策树的优势恰恰在于可解释性你可以把整棵树画出来每个节点的分裂条件、样本分布、类别比例一目了然。对于一份实验报告这意味着你能写出「模型认为花瓣宽度小于 0.8cm 的样本 100% 是山鸢尾」这种具体结论而不是干巴巴一句「准确率 0.95」。这就是决策树在教学中不可替代的原因也是你报告里应该重点展开的部分。3. 用 sklearn 在鸢尾花数据集上跑通决策树分类完整代码与参数说明3.1 数据加载、划分与特征探查先跑通最小闭环。鸢尾花数据集 150 条样本、4 个特征、3 个类别是头歌决策树进行鸢尾花分类-sklearn版的标准数据。但别急着 fit先做特征探查这一步在报告里能体现你的数据敏感度。import numpy as np import pandas as pd from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import accuracy_score, classification_report # 加载数据 iris load_iris() X, y iris.data, iris.target # 转成 DataFrame 方便探查 df pd.DataFrame(X, columnsiris.feature_names) df[target] y # 基本统计看每个特征的分布和量纲 print(df.describe()) # 看类别是否均衡 print(df[target].value_counts()) # 划分训练集和测试集stratify 保证类别比例一致 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.3, random_state42, stratifyy ) print(f训练集 {X_train.shape[0]} 条测试集 {X_test.shape[0]} 条)这段代码的关键点有三个。stratifyy保证训练集和测试集的类别比例与原始数据一致避免某一类在测试集里缺失。random_state42固定随机种子保证结果可复现——报告里必须写种子值否则别人复现不出你的数字。describe()用来确认特征量纲鸢尾花四个特征都是厘米级别量纲接近不需要标准化但如果你的数据集特征量纲差异大比如年龄 vs 收入决策树虽然对量纲不敏感报告里仍应说明这一点。3.2 训练基线模型并读懂分类报告# 基线模型默认参数只限制深度防止过拟合 clf DecisionTreeClassifier(max_depth3, random_state42) clf.fit(X_train, y_train) # 预测 y_pred clf.predict(X_test) # 准确率 acc accuracy_score(y_test, y_pred) print(f测试集准确率: {acc:.4f}) # 分类报告精确率、召回率、F1 print(classification_report(y_test, y_pred, target_namesiris.target_names))classification_report输出的四个指标必须能解释清楚。精确率precision是「预测为某类的样本里真正属于该类的比例」召回率recall是「某类真实样本里被正确预测出来的比例」F1 是两者的调和平均。如果某一类召回率明显低说明模型把这类样本漏判成了别的类报告里要结合混淆矩阵分析原因。max_depth3是我给鸢尾花数据的经验值。这个数据集很简单深度 3 就能到 0.95 以上再深就是过拟合。报告里应该附一张不同深度下训练/测试准确率的对比表证明你选 3 是有依据的而不是拍脑袋。3.3 用交叉验证替代单次划分让结果更可信单次 train_test_split 的结果受随机种子影响大换一个种子可能差 2~3 个百分点。报告里如果只报一次结果说服力不够。用交叉验证from sklearn.model_selection import cross_val_score, StratifiedKFold # 5 折分层交叉验证 cv StratifiedKFold(n_splits5, shuffleTrue, random_state42) scores cross_val_score(clf, X, y, cvcv, scoringaccuracy) print(f5 折准确率: {scores}) print(f均值 {scores.mean():.4f}标准差 {scores.std():.4f})StratifiedKFold保证每折的类别比例一致。输出里标准差很重要如果标准差超过 0.03说明模型对数据划分敏感报告里要讨论原因通常是样本量小或某些类别边界模糊。均值 ± 标准差这种写法比单次结果专业得多。4. 参数调优与可视化让报告从「能跑」变成「有洞察」4.1 网格搜索找最优参数组合手工调参效率低用 GridSearchCV 系统搜索from sklearn.model_selection import GridSearchCV # 定义参数网格 param_grid { max_depth: [2, 3, 4, 5, 6, 8], min_samples_split: [2, 5, 10], min_samples_leaf: [1, 2, 4], criterion: [gini, entropy] } grid GridSearchCV( DecisionTreeClassifier(random_state42), param_grid, cv5, scoringaccuracy, n_jobs-1 ) grid.fit(X_train, y_train) print(f最优参数: {grid.best_params_}) print(f最优交叉验证分数: {grid.best_score_:.4f}) print(f测试集分数: {grid.score(X_test, y_test):.4f})参数网格一共 6×3×3×2108 种组合每种跑 5 折共 540 次训练。鸢尾花数据量小几秒就能跑完。n_jobs-1用满所有 CPU 核心。报告里应该把best_params_和对应的分数写出来并对比基线模型的分数说明调优带来了多少提升。如果提升不到 1 个百分点也要如实写——这本身就是一个结论鸢尾花数据太简单调参空间有限。4.2 画决策树把模型决策过程摊开给人看这是决策树报告区别于其他模型报告的核心武器import matplotlib.pyplot as plt from sklearn.tree import plot_tree plt.figure(figsize(16, 10)) plot_tree( clf, feature_namesiris.feature_names, class_namesiris.target_names, filledTrue, # 按类别填充颜色 roundedTrue, # 圆角节点 fontsize10 ) plt.tight_layout() plt.savefig(decision_tree.png, dpi150) plt.show()filledTrue让节点颜色深浅反映类别纯度颜色越深越纯。每个节点里显示四个信息分裂条件、gini 值、样本数、各类别分布。报告里要挑两三个关键节点解读比如「根节点用花瓣长度 2.45cm 分裂左子树 50 个样本全是山鸢尾说明这个特征对区分山鸢尾极其有效」。这种分析才是高分报告该有的内容。4.3 特征重要性排序与业务解释import pandas as pd # 特征重要性 importances pd.Series( clf.feature_importances_, indexiris.feature_names ).sort_values(ascendingFalse) print(importances) # 画条形图 importances.plot(kindbarh, figsize(8, 5)) plt.xlabel(重要性) plt.title(特征重要性排序) plt.tight_layout() plt.savefig(feature_importance.png, dpi150)feature_importances_基于每个特征在所有节点上带来的不纯度下降总量加权平均。鸢尾花数据里通常花瓣长度和花瓣宽度排前两位萼片宽度最低。报告里要解释重要性低不代表特征无用只是在这个数据集上区分度不够如果换成头歌决策树进行收入预测-sklearn版那种场景特征重要性排序会完全不同而且直接关系到业务解释。5. 决策树实验的避坑与排查那些让分数莫名掉下去的坑5.1 训练集准确率 100% 但测试集只有 0.7现象模型在训练集上完美分类测试集惨淡。原因树长得太深把训练集的噪声也学进去了。解决限制max_depth从 3 开始试、增大min_samples_leaf比如设 5、或者用ccp_alpha做后剪枝。报告里应该附一张深度-准确率曲线直观展示过拟合拐点。5.2 换了 random_state 结果波动超过 5%现象同一份代码种子从 42 改成 0准确率从 0.95 掉到 0.89。原因数据量太小鸢尾花只有 150 条单次划分的测试集代表性不足。解决改用交叉验证报告均值±标准差或者增大测试集比例到 0.3~0.4。如果数据本身就只有几十条报告里要明确说明样本量限制不要硬吹模型泛化能力。5.3 分类报告里某一类召回率为 0现象三个类别里有一类完全没被预测出来。原因类别不平衡多数类主导了分裂过程或者该类样本的特征与另一类高度重叠。解决检查value_counts()确认类别分布用class_weightbalanced让模型关注少数类或者用 SMOTE 过采样。报告里要展示处理前后的混淆矩阵对比。5.4 特征重要性全是 0 或分布异常现象feature_importances_输出一堆 0或者某个无关特征排第一。原因特征量纲差异过大时树可能偏向取值多的连续特征或者数据里有 ID 类无意义特征被当成了强分裂依据。解决检查特征含义去掉 ID 类列对连续特征做分箱用max_features限制每次分裂考虑的特征数。这个坑在真实项目里比实验数据里更常见。5.5 可视化中文乱码或图片糊成一团现象plot_tree出来的图节点重叠、中文变方块。原因matplotlib 默认字体不支持中文且树太深时画布不够大。解决设置plt.rcParams[font.sans-serif] [SimHei]把figsize调大深度 5 以上建议 20×12或者只画前几层max_depth参数传给plot_tree。报告里贴的图必须清晰可读糊图直接扣印象分。6. 从实验报告到真实项目决策树在收入预测与离职分析中的落地技巧鸢尾花跑通只是起点。热搜里头歌决策树进行收入预测-sklearn版、基于机器学习的企业员工离职因素分析与预测研究这类题目才是决策树真正发挥价值的地方。这些场景和鸢尾花的区别在于特征更多、类别更不平衡、业务解释要求更高。拿收入预测来说常见特征是年龄、教育年限、工作时长、职业类型等。连续特征年龄、工时直接喂给决策树会产生大量候选分裂点训练慢且容易过拟合。我一般会先做分箱把年龄切成 18-25、26-35、36-45、46-55、55 五段工时切成 35、35-40、40-50、50 四段。分箱后树的每个分裂条件都对应一个可解释的业务区间报告里写「每周工作超过 50 小时的人群中收入超过 50K 的比例显著更高」就比「特征 X 的重要性是 0.23」有说服力得多。类别不平衡是另一个必须处理的点。收入超过 50K 的样本通常只占 20% 左右离职样本往往更少。这时候准确率会骗人——全预测成「不超过 50K」也有 80% 准确率。报告里应该用 F1 和 AUC 作为主指标并在DecisionTreeClassifier里设class_weightbalanced让少数类的权重自动上调。验证方法上除了交叉验证我习惯再做一次「时间维度验证」如果数据有时间戳用早期数据训练、后期数据测试模拟真实预测场景。这比随机划分更接近落地情况也能暴露模型在数据分布漂移下的表现。如果时间验证的分数比随机划分低很多说明特征里有时间相关的泄漏得排查。最后说一个我踩过的坑决策树的predict_proba输出的是叶子节点里各类别的占比不是校准过的概率。如果业务需要「预测这个人有 73% 概率离职」这种精确概率得用CalibratedClassifierCV做概率校准否则叶子节点只有 5 个样本时输出的 0.6 可能只是 3/5 的粗糙比例。这个细节在实验报告里不写没关系但真实项目里不处理会出大问题。写实验报告这件事我的习惯是先把代码跑通、把图截好然后合上电脑用白纸把「我做了什么、为什么这么做、结果说明什么」三句话写出来再展开成报告。如果这三句话写不顺说明你自己还没想清楚报告写出来也是流水账。希望帮到你。本文还有配套的精品资源点击获取
返回列表