多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

西电机器学习课程设计十实验完整指南:从环境配置到报告

西电机器学习课程设计十实验完整指南:从环境配置到报告 简介西电机器学习课程设计是一套面向机器学习初学者的完整实践项目合集内含十个实验项目每个实验均配备源代码、实验报告和文档说明可帮助在校学生快速完成课程设计或期末大作业。实验主题覆盖线性回归、逻辑回归、决策树、随机森林、支持向量机、聚类等核心算法代码注释十分详尽新手也能跟随文档逐步理解模型构建、参数调整和结果评估的完整流程。资源包共二十一个文件以Python脚本、CSV数据集、Word实验报告和说明文档为主压缩包大小约五点零五兆字节目录结构清晰方便按实验序号逐个学习。截至目前已有167人学习浏览对于缺少实战经验的学习者来说这套资料既能作为作业参考也能积累算法应用与项目组织经验具有较高的实用价值。1. 西电机器学习课程设计十个实验项目到底在考什么很多同学拿到“西电机器学习课程设计”这个题目第一反应是上网找源码结果下载了十个 .py 文件跑完 print 一串数字就交了最后得分却不理想。这个课程设计要的从来不只是“代码能跑”而是一套完整的实验项目十个覆盖经典算法的实验源码、能复现结果的图表、把每一步思考写清楚的文档与报告。我统计过几个高分版本它们的共同点不是模型精度有多高而是数据集、预处理、调参、评估、图表、结论被组织成了一条可追溯的链路。这篇笔记就按这个链路拆开讲从环境搭建到报告排版每个环节给到可以直接照做的命令与代码。适合正在补做西电机器学习课程设计、或者想把实验质量从“及格”拉到“高分”的同学。2. 把环境一次装对用 conda 固定 Python 版本与依赖2.1 用一个 environment.yml 管好全部依赖十个实验项目共用一套环境最容易翻车的点不是算法写错而是版本不对。西电机器学习课程设计通常要求提交源码和文档检查作业的机器未必和你本地环境一致。我一般会先创建一个 conda 环境把依赖写进environment.yml提交作业时连同这个文件一起放在源码根目录。打开终端新建一个文件touch environment.yml把下面的内容写进去name: ml-course channels: - conda-forge dependencies: - python3.9 - numpy1.24.3 - scipy1.10.1 - scikit-learn1.2.2 - matplotlib3.7.1 - pandas1.5.3 - seaborn0.12.2 - jupyter1.0.0然后执行conda env create -f environment.yml conda activate ml-course python -c import sklearn; print(sklearn.__version__)这里固定了scikit-learn1.2.2有两个原因。一是西电课程设计的实验项目大多基于 scikit-learn 完成1.2.x 是当前兼容性最稳的版本线老代码不需要改 API二是某些数据结构返回类型在新版 1.4 里有变化比如KMeans的n_init默认值从 10 改成了auto会平白多出一堆 warning。固定 Python 3.9 而不是 3.11是为了避免个别第三方库在 Windows 下没有预编译 wheel。如果你在做的实验项目还要跑神经网络可以再补一行pip: tensorflow-cpu或keras但注意不要和 scikit-learn 混装出依赖冲突。2.2 为什么课程设计默认选 scikit-learn 栈十个实验项目如果都从零手写算法工作量会失控而且手写代码在报告里还要额外解释数值稳定性问题。西电这门课的主流做法是“算法分析 库实现”拿 scikit-learn 做训练和评估自己补数据预处理、可视化、结果分析。决定用哪套技术栈之前我先列一张对比表供你按自己的情况选。技术栈上手成本调试友好度报告好写程度适合实验scikit-learn低高接口统一高指标一行出回归、分类、聚类、降维、集成手写 NumPy高低全要自己 print中能展示推导线性回归、逻辑回归、K-meansTensorFlow/Keras中中中但环境重神经网络、CNN我一般建议回归、分类、聚类、降维、集成这些经典实验全走 scikit-learn神经网络相关的一两个实验可以用 Keras 写个 MLP 对比。手写版不要丢掉可以放在每个实验目录的manual/子文件夹里报告中用一段话说明“手写版用于验证算法原理正式实验以 scikit-learn 结果为准”这一句话在答辩时很加分。2.3 验证环境与样例输出环境装好后不要急着开始写十个实验。先跑一个最小脚本确认每个库的版本和基础功能都正常。这个脚本我会固定在0_check_environment.py# 0_check_environment.py import numpy as np import pandas as pd import sklearn import matplotlib import seaborn as sns print(numpy:, np.__version__) print(pandas:, pd.__version__) print(sklearn:, sklearn.__version__) print(matplotlib:, matplotlib.__version__) print(seaborn:, sns.__version__) # 用一个波士顿房价的替代数据集做冒烟测试 from sklearn.datasets import fetch_california_housing from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression data fetch_california_housing() X_train, X_test, y_train, y_test train_test_split( data.data, data.target, test_size0.2, random_state42 ) model LinearRegression() model.fit(X_train, y_train) print(smoke test r2:, model.score(X_test, y_test))train_test_split里的random_state42是第一个要养成的习惯。课程设计里十个实验项目只要涉及数据切分、初始化、采样全部固定同一个随机种子报告里的数字才能复现。否则你每次跑结果都不一样报告上写的精度和源码实际跑出来的对不上这在自查时就发现不了等到答辩现场被老师跑出来就容易翻车。3. 十个实验项目如何分层设计源码怎么组织才不会丢分3.1 实验项目目录结构十个实验项目不是十个独立的 .py 文件堆在根目录而是按实验编号组织成清晰目录。交上去的源码包让检查者一眼能看出每个实验做了什么这是“高分版本”的共性。我常用的结构如下ml-course-design/ ├── environment.yml ├── README.md ├── data/ # 统一放数据集 ├── utils/ # 公共函数加载数据、画图、保存结果 ├── experiment_01_linear_regression/ │ ├── main.py │ ├── analysis.ipynb │ └── results/ ├── experiment_02_logistic_regression/ ├── experiment_03_decision_tree/ ├── experiment_04_naive_bayes/ ├── experiment_05_knn/ ├── experiment_06_svm/ ├── experiment_07_kmeans/ ├── experiment_08_pca/ ├── experiment_09_random_forest/ ├── experiment_10_neural_network/ └── reports/ # 最终报告和答辩 PPTdata/目录统一放原始数据每个实验直接pd.read_csv(../data/xxx.csv)不要一次一次把数据文件复制到实验目录里否则报告里写“数据来源”时会乱掉。utils/目录放公共函数比如画混淆矩阵、保存 classification_report。这样每个实验的main.py能控制在 80 到 150 行逻辑清楚报告也好引用。3.2 回归与分类实验的最小可复现代码前两个实验项目通常是指定线性回归和逻辑回归。这两个实验虽然简单但代码写得好不好直接决定后面 SVM、神经网络那些实验的模板。先看线性回归的完整示例# experiment_01_linear_regression/main.py import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import fetch_california_housing from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, r2_score from sklearn.model_selection import train_test_split # 固定随机种子保证报告里的数字可复现 RANDOM_STATE 42 data fetch_california_housing() X, y data.data, data.target # 划分训练集与测试集 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_stateRANDOM_STATE ) # 训练线性回归模型 model LinearRegression() model.fit(X_train, y_train) y_pred model.predict(X_test) # 输出评估指标 mse mean_squared_error(y_test, y_pred) r2 r2_score(y_test, y_pred) print(fMSE{mse:.4f}, R2{r2:.4f}) # 保存预测值与真实值的对比散点图 plt.figure(figsize(6, 6)) plt.scatter(y_test, y_pred, alpha0.4, s10) plt.plot([y.min(), y.max()], [y.min(), y.max()], r--, linewidth1) plt.xlabel(true value) plt.ylabel(predicted value) plt.title(Linear Regression: True vs Predicted) plt.savefig(results/prediction_scatter.png, dpi150, bbox_inchestight)这段代码里的关键参数有三个。test_size0.2按课程设计常用比例留出 20% 测试集random_state42同时控制数据切分和后续模型初始化dpi150保证插入报告的图片足够清晰不会出现截图模糊被导师点名的问题。savefig之前先建results/目录mkdir -p experiment_01_linear_regression/results逻辑回归实验和这个模板几乎一样只是换成LogisticRegression(max_iter1000, random_state42)。max_iter1000是必设参数因为默认 100 次迭代在部分数据集上不收敛会报ConvergenceWarning。评估指标换成accuracy_score和confusion_matrix。这两个实验代码写顺了后面的决策树、SVM、随机森林都只是换模型名和参数。3.3 无监督与降维实验K-means 和 PCA 的写法和坑实验七和实验八通常是 K-means 聚类和 PCA 降维。这两个实验有个共同点没有标准答案标签评估方式要自己设计。很多同学在这里只输出一个聚类散点图就结束报告里写“可以看出聚类效果不错”这是比较单薄的做法。K-means 实验我一般会加上轮廓系数和肘部法则两部分# experiment_07_kmeans/main.py 片段 from sklearn.cluster import KMeans from sklearn.metrics import silhouette_score import matplotlib.pyplot as plt X ... # 加载并标准化后的特征矩阵 # 肘部法则给定 k 的范围看 SSE 变化 sse, sil_scores [], [] K_range range(2, 9) for k in K_range: km KMeans(n_clustersk, n_init10, random_state42) km.fit(X) sse.append(km.inertia_) sil_scores.append(silhouette_score(X, km.labels_)) # 绘制肘部图 plt.figure(figsize(6, 4)) plt.plot(list(K_range), sse, markero) plt.xlabel(k) plt.ylabel(SSE) plt.title(Elbow Method for Optimal k) plt.savefig(results/elbow.png, dpi150, bbox_inchestight)n_init10这个参数值得解释。K-means 的初始质心是随机的n_init表示用不同初始质心跑多次取 SSE 最小的结果。在新版 scikit-learn 中默认值变成了auto但显式写10能保证任何版本行为一致。轮廓系数的取值范围是 [-1, 1]越接近 1 说明聚类内部越紧凑、类间越分离。报告中写“当 k3 时轮廓系数最大因此选择 k3”比“我觉得聚成 3 类合适”有说服力得多。PCA 实验的常见玩法是拿它给高维数据降维后做可视化再配合一个分类模型对比降维前后的效果。注意PCA(n_components2)里的n_components参数如果是为可视化设 2如果是为保留 95% 方差要写成PCA(n_components0.95)。两种写法在报告里要用不同段落说明不能混着写。3.4 每次实验的跑分输出与图表落盘十个实验项目全部跑完后最烦人的是汇总结果。如果每个实验只靠肉眼从终端抄数字最后写报告时很容易抄错。我会在每个实验的main.py最后统一做两件事把指标写进results/metrics.txt把图表保存到results/目录。示例# 统一保存指标到文本文件 with open(results/metrics.txt, w, encodingutf-8) as f: f.write(fAccuracy: {acc:.4f}\n) f.write(fPrecision: {prec:.4f}\n) f.write(fRecall: {rec:.4f}\n) f.write(fF1-score: {f1:.4f}\n)这个习惯坚持十个实验下来最后汇总成对比表时会省很多时间。写报告时直接打开每个metrics.txt抄数字基本不会出偏差。4. 文档与报告得分差异往往不在模型精度而在这一层4.1 课程设计报告的标准结构十个实验项目做完源码再漂亮最终落在纸面上的还是文档与报告。西电机器学习课程设计的评分中报告占的比重通常不低于 40%。我见过不少源码质量很高、但报告写成“代码注释合集”的作业最后得分反而中规中矩。一份合格的报告结构大致是固定的章节内容范围建议篇幅一、实验环境Python 版本、库版本、硬件信息0.5 页二、数据集说明数据来源、样本量、特征维数、预处理方式1-2 页三、实验设计与结果每个实验的模型选择、参数设置、评估指标、图表5-8 页四、结果对比与分析横向对比多个模型的精度、泛化能力1-2 页五、总结与改进遇到的问题、最终结论、可改进方向1 页每个实验占报告中的一小节按照“问题定义 → 数据准备 → 模型与参数 → 结果 → 分析”的顺序写。特别要注意每个实验项目的小节里至少有一张图和一个数字表。只有文字没有图表报告看起来像读后感图表堆砌没有文字分析又像数据搬运工。4.2 结果对比表怎么写成一页纸十个实验项目的结果全部列在一张表里是报告中视觉效果最好的部分。表格不必过于花哨关键是把模型名、数据集、主要指标、是否做归一化写清楚。实验项目模型数据集指标结果注实验一线性回归California HousingR20.6023无归一化实验二逻辑回归IrisAccuracy0.9733标准化实验三决策树WineAccuracy0.9444max_depth5实验四朴素贝叶斯WineAccuracy0.9722高斯分布假设..................表里的“注”列是很多人容易忽视的加分项。写清楚max_depth、n_estimators、是否归一化这些关键参数答辩时老师一看就知道你不是跑了个默认参数完事。注意统一数值精度全部保留 4 位小数不要一个表里出现0.97和0.6023混着写的情况。4.3 随机种子与可复现性报告里必须出现的三行代码报告里关于可复现性的描述不需要长篇大论但必须有三行代码出现。通常在“实验设计”部分写import numpy as np import random as rn np.random.seed(42) rn.seed(42)不要小看这三行。很多课程设计项目里用了train_test_split、KMeans、RandomForestClassifier它们内部都有随机过程。报告里写“为了保证实验可复现全局设置随机种子为 42”一句话就能让评分老师对你的实验严谨性留下印象。实战中我会再补一句把 scikit-learn 的全局随机种子也设上用sklearn.utils.check_random_state或在RandomForestClassifier里传random_state42效果更彻底。5. 避坑指南西电机器学习课程设计最常见的五个翻车点5.1 现象本地跑得好好的换到另一台机器报错原因分析最常见的是 Python 或 scikit-learn 版本不一致。比如本地是 scikit-learn 1.2检查机器上是 1.4某些参数默认值变了轻则警告重则直接抛错。课程设计的代码要保证“换机器能跑”不能只在自己的环境里成立。解决方案把environment.yml和其他依赖说明放进源码包。有条件的在 README 开头写清楚创建命令和激活命令没有 conda 的同学至少用requirements.txt固定版本pip freeze requirements.txt5.2 现象画图时中文标签全部变成方块原因分析matplotlib 默认字体不含中文字符Windows 下常见的 SimHei 字体在部分机器上没有Linux 服务器上也没有。西电的课程设计答辩很多直接在实验室机器上跑中文字体缺失的情况很普遍。解决方案绘图统一用英文标签省去所有字体配置的麻烦。如果报告里非要展示中文截图在本地安装一个中文字体并在代码开头设置import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False注意后面那一行axes.unicode_minus也要写否则坐标轴上的负号会显示成乱码。5.3 现象模型分数异常高报告里说不清为什么原因分析数据预处理环节发生了数据泄漏。最常见的写法是在切分数据之前就做了标准化或归一化导致测试集的信息提前混进了训练过程。课程设计里的回归和分类实验如果直接StandardScaler().fit_transform(X)再train_test_split就会踩这个坑。解决方案先切分再对训练集fit对测试集只transformfrom sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split scaler StandardScaler() X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42 ) X_train scaler.fit_transform(X_train) X_test scaler.transform(X_test)5.4 现象报告里的图表和源码跑出来的不一致原因分析写报告时重新跑了代码但因为没固定随机种子结果变了或者图表是用旧版数据跑的没有重新生成。十个实验项目数量多这种问题特别容易发生。解决方案每个实验的main.py末尾统一把指标写入metrics.txt图片也用savefig落盘不使用plt.show()后手动截图。写报告前从头到尾重新跑一遍所有实验确保报告里的每个数字都来自当前源码。5.5 现象代码逻辑正确但跑出ConvergenceWarning警告原因分析逻辑回归、SVM 等模型依赖迭代优化默认迭代次数不足或数据没归一化容易不收敛。西电机器学习课程设计里SVM 实验是这个问题的高发区。解决方案给模型显式传参数from sklearn.svm import SVC model SVC(kernelrbf, C1.0, gammascale, max_iter1000, random_state42)gammascale是 scikit-learn 1.2 以后推荐的默认方式它会根据特征数量自动调整缩放比手动设gamma0.1这种魔法数值通用得多。如果用了StandardScaler预处理SVM 的收敛问题会减少一大半。6. 进阶把十个实验压成一套可复用的实验框架十份main.py都按同一个模板写完后你会发现它们重复率非常高。此时值得抽出半天时间把公共逻辑抽成一个统一的实验框架。这个框架不需要多复杂核心就是让模型、数据、指标三者分离以后换数据集或换模型时只改一行配置。# utils/run_experiment.py from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score, f1_score, r2_score def run_experiment(model, X, y, taskclassification, test_size0.2, random_state42): X_train, X_test, y_train, y_test train_test_split( X, y, test_sizetest_size, random_staterandom_state ) model.fit(X_train, y_train) y_pred model.predict(X_test) if task classification: metrics { accuracy: accuracy_score(y_test, y_pred), f1: f1_score(y_test, y_pred, averageweighted), } else: metrics {r2: r2_score(y_test, y_pred)} return metrics调用方式统一成from sklearn.ensemble import RandomForestClassifier from utils.run_experiment import run_experiment model RandomForestClassifier(n_estimators100, random_state42) result run_experiment(model, X, y, taskclassification) print(result)这套框架的好处是报告里写“实验九使用随机森林参数为 n_estimators100”代码里就是这么写的不产生二义性。之后你要跑 SVM、决策树、KNN 的对比实验只需要换模型类评估指标自动算好不用每份代码里复制粘贴评估函数。做课程设计最怕的不是代码写不出来而是最后一刻发现十个实验项目里有两三个数字对不上、图没保存、环境换台机器就跑不起来。我自己的习惯是每写完一个实验就把它当成要交给老师的最终版来检查跑一遍、看输出、保存图、写三行注释说明该实验的关键参数。十个实验全部完成后再花一晚上从头到尾顺一遍这种“笨功夫”能省掉答辩时的大多数尴尬。希望这篇笔记能帮你在做西电机器学习课程设计时少踩几个坑把每一步都做成能写进报告、经得起复现的扎实工作。本文还有配套的精品资源点击获取
返回列表