周志华《机器学习》代码练习实战:从环境搭建到算法调参

发布时间:2026/9/7 2:58:11
周志华《机器学习》代码练习实战:从环境搭建到算法调参 简介周志华《机器学习》代码练习包集中整理了书中典型算法的Python实现面向正在学习该书或希望强化机器学习基础的读者。内容覆盖线性模型、逻辑回归、LDA、决策树、集成学习、SVM等常用方法每个练习以独立脚本呈现并配有README说明文档便于对照理论梳理代码逻辑与运行方式。压缩包内共16个文件其中15个为Python脚本1个为Markdown说明整体体积仅20KB轻量紧凑适合快速下载后按需查看和运行。各脚本命名清晰便于与书中章节对应目前已有507人次浏览学习对于刚入门机器学习的同学而言是结合书本动手练习的一个实用补充。通过运行这些代码可以减少从公式到实现的跳跃感理解不同算法在样本数据上的建模与预测过程也能为后续修改参数、迁移到自己的数据提供可参考的起点。 手里拿着这份“周志华《机器学习》代码练习.zip”的同学估计和我当初一样西瓜书上的公式翻得滚瓜烂熟合上书却写不出一行能跑的机器学习代码。这份压缩包不是某本书的官方源码而是网上流传的一套把书中经典算法整理成可运行练习的资源目标只有一个——让“看得懂公式”变成“跑得出结果”。它能帮你把决策树、线性模型、SVM、聚类这些重点章节从头到尾过一遍尤其适合期末复习、考研复试、转行入门的朋友。注意折腾这份zip最大的成本不在下载而在配环境和解压后的一堆小问题这篇文章把我踩过的坑和排查方法都整理出来了。1. 这份代码练习包里到底装了什么1.1 代码结构与章节对应先说目录。我自己见过好几个版本的打包命名不完全一样但结构基本是decision_tree/对应第4章决策树通常有ID3、C4.5的简化实现以及sklearn版本对比linear_model/对应第3章线性模型包含线性回归、对数几率回归逻辑回归、线性判别分析LDAsvm/对应第6章支持向量机包含线性SVM、高斯核SVM和软间隔比较bayes/对应第7章贝叶斯分类器常见的是朴素贝叶斯和贝叶斯网小例子ensemble/对应第8章集成学习以AdaBoost和随机森林为主cluster/对应第9章聚类包含KMeans、层次聚类AGNES和DBSCANdim_reduction/对应第10章降维主要是PCA和流形学习里的t-SNE。拿到之后别急着全跑我建议按书的顺序来每读完一章就解压对应目录跑一遍。很多同学喜欢一次把代码全部跑完结果就是跑完等于没跑期末照样懵。这份资源更像练习册不像小说逐章啃效果远好于扫一遍。1.2 为什么强烈建议动手跑一遍原因很简单机器学习不是看出来的是调参调出来的。同一个决策树max_depth设成3和设成10最后画出来的树完全两个样同样一份数据SVM里C取0.1和100决策边界差得十万八千里。书上的公式只告诉你一个方向代码练习让你看到具体数值变化产生的结果这才是理解的开始。另外很多学校期末卷子最后一道大题就是“给数据、让你写出训练流程或分析结果”你平时不动手考试临时抱佛脚是来不及的。我见过太多同学把《机器学习》课本翻得卷了边一到上机环节就露馅这类代码练习就是专门治这个毛病的。1.3 为什么用这套技术栈这份代码练习绝大多数是基于Python NumPy Pandas Scikit-learn Matplotlib少数版本会带上Graphviz画决策树。为什么不建议自己纯手写所有算法因为你用sklearn一行代码就能调起来的逻辑回归手写要处理梯度下降、收敛判断、正则化对初学者来说负担太重。练习的目的是理解算法长什么样、有哪些关键参数而不是重复造轮子。如果你同时也在看李航的《统计学习方法》两边对照着跑效果更好。很多同学在“机器学习书买谁的”这个问题上纠结半天我的看法是书可以选代码练习一定要做不管哪本教材最终都要落到能跑通、能调参、能解释结果这三个基本能力上。2. 拿到zip后的第一步环境搭建实战2.1 推荐版本和安装清单先说结论我用的是Python 3.10 scikit-learn 1.3.x pandas 2.0.x matplotlib 3.7.x这套组合跑常见练习代码没毛病。遇到过不少同学直接装了Python 3.12然后发现某个老脚本import时报错其实不是代码问题是第三方库还没适配新版本。Windows下创建虚拟环境很简单python -m venv ml_env ml_env\Scripts\activate pip install numpy pandas matplotlib scikit-learn graphviz python-graphviz jupyterLinux或macOS把激活命令改成source ml_env/bin/activate就行。我这里单独装了graphviz和python-graphviz两个包前者是C库后者是Python封装只装一个会导致后面画决策树报错。有一个特殊情况是有些人下载的是python-3.8.9-embed-amd64.zip这种嵌入式Python包。它没有pip也没有完整标准库直接拿来跑这份练习代码会缺一堆模块。嵌入式zip包一般是给程序集成用的不是给日常开发用的建议老老实实装一个完整版Python再建虚拟环境。2.2 三分钟验证环境装完别急着打开notebook先跑一个最小化验证脚本import numpy as np import pandas as pd import sklearn import matplotlib print(sklearn.__version__) from sklearn.datasets import load_iris X, y load_iris(return_X_yTrue) print(X.shape)能正常打印版本和(150, 4)就说明基础环境没问题。我见过太多人一上来就运行完整notebook然后报错一堆根本分不清是代码问题还是环境问题。先验证环境能排除掉一半的“疑难杂症”。这里还要提一句有些同学习惯用MATLAB做机器学习但这份代码练习是以Python为主。两边各有优势不过从就业、复试、比赛的角度看Python生态还是更主流。建议先顺着这份zip把Python跑熟再回头比较不同工具的特点。2.3 决策树可视化那个大坑如果你跑到了决策树可视化这段大概率会遇到graphviz.backend.ExecutableNotFound: failed to execute [dot]翻译成人话就是系统找不到Graphviz。很多教程只让你pip install graphviz但那个包只是给Python调用的接口真正的dot.exe还要去官网下载Graphviz安装包。装完以后还要把安装目录的bin文件夹加到系统PATH里然后重启终端或IDE。这里再补一句Windows下有时你装好了也报错可以直接在代码里指定路径import os os.environ[PATH] os.pathsep rC:\Program Files\Graphviz\bin这行放在import之后、调用export_graphviz之前就行。这个坑几乎每个跑西瓜书代码的人都会踩提前排掉能省很多时间。如果你用的是头歌这类在线实训平台一般平台已经配好了环境不需要自己处理Graphviz但本地练习还是得学会配置。3. 解压报错、密码和Git关联问题排查3.1 解压失败别急着找破解工具先回答一个经常被问到的问题invalid zip archive: could not find EOCD是什么意思简单说zip文件末尾有一个结束标记如果文件下载不完整这个标记就找不到了系统会直接拒绝解压。此时最有效的办法不是去找修复工具而是重新下载下载完先看文件大小是不是和资源页一致再看后缀名是不是.zip而不是.zip.001之类的分卷文件名。遇到z01文件没有zip怎么办这类问题说明你下载的是分卷压缩包需要把所有分卷放在同一目录用7-Zip打开第一个文件就能合并解压。市面上那些所谓的zip修复工具绝大多数对你没有帮助。另外Windows自带资源管理器解压正常zip没问题但遇到分卷、特殊编码文件名建议直接上7-Zip或Bandizip我用这个经验解决过好几次“解压失败”的假故障。3.2 密码保护与合法恢复有些版本的上传者会给压缩包加密码密码一般在资源描述页或原始出处里。自己忘记密码的情况如果不是特别重要我真不建议去折腾暴力破解——那东西的成功率完全看密码强度而且很容易让你犯迷糊。市面上的百事牛这类恢复工具我只推荐用于你确定是自己加密的、密码确实遗忘的压缩包用之前先确认版权和使用权限并且一定要先备份原始文件。另外给别人发练习代码时如果怕内容被随意篡改可以用zip加密但要选支持AES-256的压缩工具传统ZipCrypto很容易被撞开。很多人搜“zip密码移除”“zip压缩包密码破解工具”其实大部分需求都是合法的——但请记住解不开时先确认权限不要对不明来源的压缩包瞎试避免惹上版权问题。3.3 从GitHub下载zip后和远程仓库关联很多人下载的是GitHub上某个仓库的zip包解压后想push到自己的远程仓库结果发现pull或者push时总是报错。这是因为你解压出来的目录里只有文件没有.git历史。正确做法是git init git remote add origin https://github.com/你的用户名/你的仓库.git git fetch origin git pull --rebase origin main先init再fetch再rebase而不是直接pull能避免“变基到远程仓库失败”这种报错。如果远程仓库里已经有README或LICENSE文件这一套流程能替你自动合并那些差异。这个问题在“github上下载的zip项目与git项目关联”的场景里特别常见我亲手帮人排过不下五次大概率是少了git fetch origin这一步。4. 核心算法练习怎么跑、怎么调4.1 决策树与可视化决策树练习的核心不是把树跑出来而是理解三个参数划分准则criteriongini还是entropy、最大深度max_depth、最小样本数min_samples_leaf。你可以写一个循环观察不同max_depth下训练集和测试集准确率的变化from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import train_test_split from sklearn.datasets import load_iris X, y load_iris(return_X_yTrue) X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.3, random_state42) for depth in [1, 2, 3, 5, 10]: clf DecisionTreeClassifier(max_depthdepth, random_state42) clf.fit(X_train, y_train) print(depth, clf.score(X_train, y_train), clf.score(X_test, y_test))把结果打出来你会直观看到什么叫过拟合。深度从1加到10训练集准确率一路飙到接近100%测试集却可能先升后降。建议顺手用export_graphviz导出PDF超参调起来能少走很多弯路。4.2 逻辑回归与SVM的决策边界线性模型这部分重点看对数几率回归逻辑回归和SVM。很多初学者以为逻辑回归只能做二分类其实sklearn里LogisticRegression默认就能处理多分类用的是OvR或multinomial策略。练的时候可以固定随机种子画一下决策边界import matplotlib.pyplot as plt from sklearn.linear_model import LogisticRegression from sklearn.inspection import DecisionBoundaryDisplay clf LogisticRegression() clf.fit(X_train[:, :2], y_train) DecisionBoundaryDisplay.from_estimator(clf, X_train[:, :2], alpha0.5) plt.scatter(X_train[:, 0], X_train[:, 1], cy_train, edgecolorsk) plt.show()SVM那边务必尝试修改C和gamma特别是用RBF核时gamma从0.01调到10边界会从几乎线性变成极度扭曲这个体验比背十遍公式都深刻。很多在线实训平台比如头歌机器学习线性回归、头歌机器学习支持向量机出的题目本质上就是让你调这些参数你在本地练熟了再去平台做题基本不用临时翻文档。4.3 聚类与降维参数选择和评估聚类练习里KMeans要先做特征归一化否则距离会被量纲大的特征带偏层次聚类注意不同linkage方式ward、complete、average出来的结果可能完全不同。我建议你把AGNES在西瓜数据集上的聚类树状图画出来和书里的图对比一下。降维部分重点跑PCA用explained_variance_ratio_看前几个主成分解释了多少方差这比单纯调用fit_transform重要。顺便说一句现在不少网课作业也会要求你用PCA降维后再接一个分类器这是套路一定要会。从应用流程的角度看一个完整的机器学习任务无非就是“数据获取、数据清洗、特征工程、模型训练、评估调参、结果解释”这几步代码练习恰好把每一步都覆盖了。5. 高频报错与期末复习实战5.1 高频报错速查表把我在实践里高频遇见的报错和排查结论整理成一张表你在跑这套代码时可以直接对照报错信息常见原因解决思路invalid zip archive: could not find EOCDzip下载不完整或分卷未合并重新下载核对大小用7-Zip打开分卷ExecutableNotFound: failed to execute [dot]缺少Graphviz本体或PATH未配置安装Graphviz并配置PATHModuleNotFoundError: No module named graphviz只装了graphviz包没装python-graphviz执行pip install python-graphvizValueError: Unknown label typey是字符串类型而非数值用LabelEncoder或pd.factorize转码AttributeError: DataFrame object has no attribute valuespandas版本太新老代码写法失效改用df.to_numpy()另外SolidWorks安装时报failed to copy spatial iop zip这类问题本质上和机器学习无关但排查思路是相通的先检查杀毒软件是不是拦截了文件复制再检查安装目录权限。遇到任何zip相关报错别急着找偏门工具从“文件是否完整、权限是否足够、软件是否兼容”这三步走基本能解决八成问题。5.2 用代码练习反推期末考试重点期末复习阶段光看书效率很低。我建议你用代码练习做“反向复习”先不看答案把每个练习的目标算法写出来再对照源码检查自己的思路。比如机器学习应用流程——数据清洗、特征工程、划分训练测试集、训练模型、评估、调参——本身就是期末常考题。不少高校期末最后一道大题是“给你一个数据集描述如何完成一个分类任务”你只要把平时练习里的流程复述出来再结合一两个关键参数说明分数基本就能拿到。如果你们用的在线实训平台有类似头歌机器学习的题块那更简单直接拿平台OJ练手和这份代码练习是互补关系。我自己的经验是把“决策树调参”“SVM核函数对比”“KMeans评估”这三类代码各跑三遍期末涉及算法分析的题目基本不用慌。5.3 写完练习后最容易犯的五个错第一不设置random_state今天跑出80%明天跑出85%复盘时根本没法对比。第二把归一化放在train_test_split之前造成数据泄漏这是面试高频雷区。第三只看训练集准确率不划分验证集典型的自我感动。第四分类模型遇到类别不平衡不管不顾直接用默认阈值结果召回率惨不忍睹。第五聚类时不看特征尺度KMeans算欧氏距离直接被大数值特征主导。这些错误我在初学阶段全犯过每一条都能在代码练习里复现出来改一遍比刷十道题都管用。你在调试时如果发现某个模型结果异常好先别高兴排查一下是不是数据泄漏如果结果异常差先查特征有没有归一化、类别有没有编码。这些经验看似琐碎但实战中能帮你省下大量时间。6. 一些个人经验最后说点个人感受。我拿到这份代码练习时第一件事不是打开notebook而是把每个文件里的随机种子统一改成42然后把输出结果截图存档。这个习惯后来帮我大忙——期末复习时翻截图就能回忆每个算法在不同参数下的表现不用重跑一遍代码。另外如果你跑某个脚本一直报错而且报错信息跟数据有关先检查是不是数据集路径不对。很多压缩包里带的都是相对路径你单独跑某个文件时需要把工作目录切到对应文件夹而不是在zip解压根目录硬跑。就这样把这份zip里的代码跑熟你对西瓜书的理解会比你想象中扎实得多。本文还有配套的精品资源点击获取