简介:周志华《机器学习》代码练习包,集中整理了书中典型算法的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章线性模型,包含线性回归、对数几率回归(逻辑回归)、线性判别分析LDA;svm/:对应第6章支持向量机,包含线性SVM、高斯核SVM和软间隔比较;bayes/:对应第7章贝叶斯分类器,常见的是朴素贝叶斯和贝叶斯网小例子;ensemble/:对应第8章集成学习,以AdaBoost和随机森林为主;cluster/:对应第9章聚类,包含KMeans、层次聚类(AGNES)和DBSCAN;dim_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_y=True) 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 + r"C:\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 决策树与可视化
决策树练习的核心不是把树跑出来,而是理解三个参数:划分准则criterion(gini还是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_y=True) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) for depth in [1, 2, 3, 5, 10]: clf = DecisionTreeClassifier(max_depth=depth, random_state=42) 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], alpha=0.5) plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, edgecolors="k") 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 EOCD | zip下载不完整或分卷未合并 | 重新下载,核对大小,用7-Zip打开分卷 |
ExecutableNotFound: failed to execute ['dot'] | 缺少Graphviz本体或PATH未配置 | 安装Graphviz并配置PATH |
ModuleNotFoundError: No module named 'graphviz' | 只装了graphviz包,没装python-graphviz | 执行pip install python-graphviz |
ValueError: Unknown label type | y是字符串类型而非数值 | 用LabelEncoder或pd.factorize转码 |
AttributeError: 'DataFrame' object has no attribute 'values' | pandas版本太新,老代码写法失效 | 改用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里的代码跑熟,你对西瓜书的理解会比你想象中扎实得多。
本文还有配套的精品资源,点击获取