拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

鸢尾花SVM分类实战:从调参到实验报告可视化

鸢尾花SVM分类实战:从调参到实验报告可视化 简介这是一份面向高校学生与机器学习初学者的SVM分类实践作业资源围绕经典Iris鸢尾花数据集展开帮助读者理解支持向量机在多分类任务中的建模流程与调参思路适合用作课程设计、期末大作业或自学练手项目。压缩包共16个文件约620KB包含2个Python源码文件、1份Word实验报告、7张结果截图以及若干XML与工程配置文件源码带有注释报告记录了实验过程与结论截图直观呈现分类效果与ROC曲线。目前已有227人学习下载具备一定的参考热度。读者可据此获得一套可直接运行的完整方案对照源码理解数据预处理、模型训练与评估环节并借助实验报告梳理写作框架与图表呈现方式降低从零搭建作业的成本。1. 鸢尾花 SVM 作业从调包跑通到实验报告能写满很多人第一次拿到「Python机器学习SVM作业」这个任务时第一反应是打开 sklearn 官网抄一段SVC(kernelrbf)跑出 0.96 的准确率然后对着实验报告发呆——因为不知道该写什么。这篇笔记就是解决这个问题的把 Iris 鸢尾花数据集上的 SVM 分类从数据加载、特征标准化、核函数选型、超参数调优一路做到混淆矩阵、决策边界可视化和实验报告该有的分析段落。适合正在做机器学习课程作业的本科生、刚转行想补一个完整分类项目的人以及需要一份能直接改参数复现的 SVM 代码模板的从业者。下面所有代码在 Python 3.10 scikit-learn 1.3 环境下验证过不需要 GPU一台普通笔记本几分钟跑完。2. 先把 Iris 和 SVM 的关系理清楚为什么这个组合是经典2.1 Iris 数据集到底长什么样为什么适合做 SVM 入门Iris 数据集一共 150 个样本3 个类别setosa、versicolor、virginica每个样本 4 个特征花萼长度、花萼宽度、花瓣长度、花瓣宽度单位都是厘米。它的经典之处在于setosa 和另外两类线性可分但 versicolor 和 virginica 在花瓣长度和宽度上有重叠线性分类器很难做到 100%。这恰好是 SVM 发挥的地方——通过核函数把数据映射到高维空间找到一个最大间隔超平面。加载方式有两种一种走 sklearn 内置一种走本地 CSV。作业里通常要求后者因为要体现数据读取过程# 方式一sklearn 内置加载适合快速验证 from sklearn.datasets import load_iris iris load_iris() X, y iris.data, iris.target print(X.shape, y.shape) # (150, 4) (150,) # 方式二从本地 CSV 读取作业报告里更常见 import pandas as pd df pd.read_csv(iris.csv) # 假设 CSV 列名为 sepal_length, sepal_width, petal_length, petal_width, species X df[[sepal_length, sepal_width, petal_length, petal_width]].values y df[species].map({setosa: 0, versicolor: 1, virginica: 2}).values逻辑说明方式一适合调试阶段快速拿到数据方式二适合实验报告里展示完整的数据处理流程。参数说明iris.data返回的是 numpy 数组shape 为 (150, 4)iris.target是 0/1/2 的整数标签。如果用本地 CSV注意检查列名和缺失值Iris 原始数据没有缺失但自己下载的版本可能有空行。2.2 SVM 在分类任务里到底在优化什么SVM 的核心目标是在特征空间里找一个超平面使得两类样本到超平面的最小距离即间隔最大化。对于线性可分的情况这叫硬间隔允许部分样本越界的情况叫软间隔通过惩罚系数 C 控制。Iris 里 versicolor 和 virginica 有重叠所以必须用软间隔。关键参数就三个参数作用典型取值范围C惩罚系数越大越不能容忍误分类0.1, 1, 10, 100kernel核函数类型linear, rbf, polygammaRBF 核的宽度参数越大越容易过拟合scale, 0.01, 0.1, 1选型理由Iris 只有 150 个样本、4 个特征属于小样本低维数据。线性核在 setosa 上表现很好但 versicolor 和 virginica 需要 RBF 核才能达到 95% 以上。我一般先用线性核跑一个 baseline再用 RBF 核调 C 和 gamma。多项式核在 Iris 上不是不能用但调参成本高作业里不推荐。2.3 标准化到底要不要做什么时候做SVM 是基于距离的算法特征尺度不一致会严重影响结果。Iris 的四个特征单位相同但数值范围不同花萼长度约 4.3-7.9花瓣宽度约 0.1-2.5。如果不标准化花瓣宽度对距离的贡献会被花萼长度淹没。from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.3, random_state42, stratifyy ) scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) X_test_scaled scaler.transform(X_test)逻辑说明fit_transform只在训练集上做测试集用transform避免数据泄露。参数说明stratifyy保证训练集和测试集的类别比例一致Iris 每类 50 个样本分层后训练集每类约 35 个。random_state42固定随机种子保证实验可复现。这一步在实验报告里要写清楚标准化不是可选项是 SVM 流程的必需步骤。3. 动手跑通第一个 SVM 分类器从 0.93 到 0.97 的调参路径3.1 最小可运行代码线性核 baseline先跑一个最简单的版本确认数据管道没问题from sklearn.svm import SVC from sklearn.metrics import accuracy_score, classification_report # 线性核 baseline svm_linear SVC(kernellinear, C1.0, random_state42) svm_linear.fit(X_train_scaled, y_train) y_pred_linear svm_linear.predict(X_test_scaled) print(线性核准确率:, accuracy_score(y_test, y_pred_linear)) print(classification_report(y_test, y_pred_linear, target_namesiris.target_names))逻辑说明SVC默认使用 RBF 核这里显式指定kernellinear。C1.0是默认值先不动。classification_report会输出每个类别的 precision、recall、f1-score实验报告里直接贴这个表。参数说明target_names传入类别名称让报告可读。线性核在 Iris 上通常能到 0.93-0.95setosa 几乎全对错的主要在 versicolor 和 virginica 之间。3.2 RBF 核调参C 和 gamma 怎么配合RBF 核有两个关键参数C 和 gamma。C 越大模型越倾向于把所有训练样本分对容易过拟合gamma 越大单个样本的影响范围越小决策边界越曲折。from sklearn.model_selection import GridSearchCV param_grid { C: [0.1, 1, 10, 100], gamma: [scale, 0.01, 0.1, 1], kernel: [rbf] } grid GridSearchCV( SVC(random_state42), param_grid, cv5, scoringaccuracy, n_jobs-1 ) grid.fit(X_train_scaled, y_train) print(最佳参数:, grid.best_params_) print(最佳交叉验证准确率:, grid.best_score_) best_svm grid.best_estimator_ y_pred_best best_svm.predict(X_test_scaled) print(测试集准确率:, accuracy_score(y_test, y_pred_best))逻辑说明GridSearchCV对 4×416 种组合做 5 折交叉验证总共 80 次训练。Iris 数据量小几秒钟跑完。参数说明cv5是常用折数样本少时可以用cv10scoringaccuracy适合类别均衡的数据Iris 每类 50 个均衡。n_jobs-1用满 CPU 核。通常最佳参数落在C1~10、gammascale或0.1附近测试集准确率能到 0.95-0.97。3.3 混淆矩阵和决策边界实验报告的可视化素材作业报告里如果只有准确率分数不会高。加上混淆矩阵和决策边界图立刻上一个档次。import matplotlib.pyplot as plt import seaborn as sns from sklearn.metrics import confusion_matrix # 混淆矩阵 cm confusion_matrix(y_test, y_pred_best) plt.figure(figsize(6, 5)) sns.heatmap(cm, annotTrue, fmtd, cmapBlues, xticklabelsiris.target_names, yticklabelsiris.target_names) plt.xlabel(预测类别) plt.ylabel(真实类别) plt.title(SVM 分类混淆矩阵) plt.tight_layout() plt.savefig(confusion_matrix.png, dpi150) plt.show()逻辑说明confusion_matrix返回 3×3 数组对角线是正确分类数。sns.heatmap把数字标在格子里fmtd保证显示整数。参数说明dpi150保证图片清晰度实验报告里插入 Word 不会糊。从混淆矩阵通常能看到setosa 全部正确versicolor 有 1-2 个被分成 virginica反之亦然。决策边界图需要取两个特征来画因为二维平面只能展示两个维度import numpy as np # 只取花瓣长度和花瓣宽度两个特征 X_2d X[:, [2, 3]] X_train_2d, X_test_2d, y_train_2d, y_test_2d train_test_split( X_2d, y, test_size0.3, random_state42, stratifyy ) scaler_2d StandardScaler() X_train_2d scaler_2d.fit_transform(X_train_2d) X_test_2d scaler_2d.transform(X_test_2d) svm_2d SVC(kernelrbf, C10, gammascale, random_state42) svm_2d.fit(X_train_2d, y_train_2d) # 生成网格点 x_min, x_max X_train_2d[:, 0].min() - 1, X_train_2d[:, 0].max() 1 y_min, y_max X_train_2d[:, 1].min() - 1, X_train_2d[:, 1].max() 1 xx, yy np.meshgrid(np.arange(x_min, x_max, 0.02), np.arange(y_min, y_max, 0.02)) Z svm_2d.predict(np.c_[xx.ravel(), yy.ravel()]) Z Z.reshape(xx.shape) plt.figure(figsize(8, 6)) plt.contourf(xx, yy, Z, alpha0.3, cmapcoolwarm) plt.scatter(X_train_2d[:, 0], X_train_2d[:, 1], cy_train_2d, edgecolorsk, cmapcoolwarm, label训练集) plt.scatter(X_test_2d[:, 0], X_test_2d[:, 1], cy_test_2d, marker^, edgecolorsk, cmapcoolwarm, label测试集) plt.xlabel(花瓣长度标准化) plt.ylabel(花瓣宽度标准化) plt.title(SVM 决策边界RBF 核) plt.legend() plt.tight_layout() plt.savefig(decision_boundary.png, dpi150) plt.show()逻辑说明np.meshgrid生成覆盖整个特征空间的网格点contourf画出决策区域。参数说明alpha0.3让背景半透明数据点更清晰marker^区分测试集。这张图能直观看到 versicolor 和 virginica 的边界区域有少量重叠解释为什么准确率不是 100%。4. 避坑与排查Iris SVM 作业里最容易翻车的 5 个地方4.1 现象准确率一直是 0.33 或 0.66像随机猜原因标签没做映射或者stratify没加导致某一类在测试集里完全缺失。更隐蔽的情况是 CSV 读取时species列被当成了字符串SVC不接受字符串标签。解决检查y的唯一值确保是 0/1/2。用df[species].value_counts()看每类数量。如果标签是字符串用LabelEncoder或手动map转成整数。训练集和测试集都要检查类别分布。4.2 现象标准化之后准确率反而下降了原因先对整个数据集做了fit_transform再划分训练测试集导致测试集的信息泄露到训练过程中。另一种可能是标准化之前数据里混入了异常值Iris 本身没有但自己合并的数据可能有。解决严格按「先划分再在训练集上 fit测试集 transform」的顺序。如果怀疑异常值先画箱线图确认Iris 原始数据不需要额外清洗。4.3 现象GridSearchCV 跑得特别慢或者内存爆了原因参数网格太大比如 C 取了 10 个值、gamma 取了 10 个值、kernel 取了 3 种组合数 3005 折就是 1500 次训练。Iris 虽然小但n_jobs-1在某些 Windows 环境下会卡死。解决先粗调再细调。第一轮 C 取 [0.1, 1, 10, 100]gamma 取 [scale, 0.01, 0.1]组合数 12。找到大致范围后在最佳值附近再细调。Windows 下如果n_jobs-1报错改成n_jobs1或n_jobs2。4.4 现象决策边界图上的点全挤在一起看不出分类效果原因画图时用了原始数据没有标准化花瓣宽度0.1-2.5和花瓣长度1-6.9的尺度差异导致散点图被压扁。解决画图前先对两个特征做标准化用和训练模型时相同的scaler。如果 scaler 是在四个特征上 fit 的画二维图时要单独再 fit 一个二维 scaler或者手动取均值和标准差做变换。4.5 现象实验报告里写「准确率 97%」但被老师问为什么不用其他指标原因Iris 是均衡数据集准确率够用但报告里只写准确率显得单薄。老师通常希望看到 precision、recall、f1-score以及宏平均和加权平均的区别。解决classification_report已经输出了这些指标。在报告里解释宏平均对每个类别一视同仁加权平均考虑了类别样本数。Iris 每类样本数相同两者接近。如果未来用到不均衡数据集优先看 f1-score 和 recall。5. 把作业变成能拿出手的项目交叉验证、学习曲线和报告写法5.1 用学习曲线判断模型是过拟合还是欠拟合学习曲线横轴是训练集大小纵轴是准确率两条线分别代表训练集和验证集。如果训练集准确率远高于验证集说明过拟合如果两条线都低且接近说明欠拟合。from sklearn.model_selection import learning_curve train_sizes, train_scores, val_scores learning_curve( SVC(kernelrbf, C10, gammascale, random_state42), X_train_scaled, y_train, train_sizesnp.linspace(0.1, 1.0, 10), cv5, scoringaccuracy, n_jobs-1 ) train_mean np.mean(train_scores, axis1) val_mean np.mean(val_scores, axis1) plt.figure(figsize(8, 5)) plt.plot(train_sizes, train_mean, o-, label训练集准确率) plt.plot(train_sizes, val_mean, s-, label验证集准确率) plt.xlabel(训练样本数) plt.ylabel(准确率) plt.title(SVM 学习曲线) plt.legend() plt.grid(True) plt.tight_layout() plt.savefig(learning_curve.png, dpi150) plt.show()逻辑说明train_sizes从 10% 到 100% 取 10 个点每个点做 5 折交叉验证。参数说明np.linspace(0.1, 1.0, 10)生成 0.1 到 1.0 的 10 个等间距值。Iris 只有 105 个训练样本150 的 70%所以曲线波动会比较大这是正常的。如果验证集准确率随样本增加还在上升说明数据量不够但 Iris 本身就只有 150 个没法再加。5.2 实验报告里必须写清楚的四个段落第一段数据描述。写清楚样本数、特征数、类别分布、是否有缺失值。Iris 的 150 个样本、4 个特征、3 类各 50 个这些数字要出现在报告里。第二段方法选择。解释为什么选 SVM 而不是逻辑回归或决策树。SVM 在小样本高维数据上表现好Iris 虽然维度不高但类别边界非线性RBF 核能处理。对比实验可以加一个逻辑回归的准确率作为参照。第三段参数调优。把 GridSearchCV 的最佳参数、交叉验证准确率、测试集准确率列出来。如果有多个核函数的对比用表格呈现。第四段结果分析。混淆矩阵里哪两类容易混为什么。决策边界图上哪些区域重叠。学习曲线说明模型是否稳定。最后给一个结论SVM 在 Iris 上能达到 95% 以上的准确率RBF 核优于线性核C 和 gamma 需要调优。5.3 一个我踩过的坑不要用测试集调参刚开始做作业时我习惯先把测试集跑一遍看准确率然后根据测试集结果回去改参数。这是典型的数据泄露老师一眼就能看出来。正确做法是训练集内部用交叉验证调参测试集只在最后评估一次。如果测试集准确率和交叉验证准确率差距超过 5%说明调参过程有问题。另一个习惯是固定random_state。Iris 数据量小不同的随机划分会导致准确率波动 2-3 个百分点。固定种子后每次跑的结果一致报告里的数字才可信。如果老师要求多次实验取平均用cross_val_score跑 10 次不同的划分报告里写均值和标准差。希望帮到你。本文还有配套的精品资源点击获取
返回列表