SVM鸢尾花分类实战:源码、报告与避坑指南

发布时间:2026/10/8 22:29:59
SVM鸢尾花分类实战:源码、报告与避坑指南 简介这份资源面向机器学习初学者与高校学生围绕经典Iris鸢尾花数据集完成支持向量机分类实验适合作为课程作业参考或SVM入门练手项目。压缩包共18个文件约631KB包含2个Python源码文件、2份docx实验报告、7张png结果图及xml、license等配置说明文件源码与报告配套便于对照理解建模流程。项目基于Python 3.9的IDLE环境借助sklearn构建SVM分类器用numpy处理数据并通过Matplotlib绘制分类结果与ROC曲线完整呈现从数据加载、特征处理到模型训练与评估的环节。已有970人学习下载读者可获取可直接运行的脚本、实验报告模板与可视化图表快速掌握SVM在鸢尾花数据上的应用思路与调参方法。1. 一份能直接跑通的 SVM 鸢尾花分类作业源码、报告与踩坑复盘如果你正在赶机器学习课程的大作业或者想找一个结构完整、能直接跑通的 SVM 实战案例这份基于 Iris 鸢尾花数据集的分类项目值得拆开看看。它包含svm_flower.py、flower1.py两个核心脚本、一份 Word 实验报告、若干 ROC 曲线与分类结果截图以及.idea工程配置。技术栈是 Python 3.9 sklearn numpy matplotlib走的是最经典的「加载数据 → 划分训练测试集 → 标准化 → 训练 SVM → 评估可视化」流程。适合两类人一是刚接触 SVM、需要一份可复现模板交作业的学生二是想快速回顾 sklearn 中 SVM 接口参数、核函数选择与评估指标写法的从业者。下面按「资源是什么 → 怎么用 → 坑在哪」的顺序拆解。2. 从 Iris 到 SVM 决策边界数据流与脚本结构拆解2.1 为什么 Iris 是 SVM 的「标准练兵场」Iris 数据集一共 150 个样本3 个类别setosa、versicolor、virginica每个样本 4 个特征花萼长度、花萼宽度、花瓣长度、花瓣宽度。它之所以成为 SVM 入门的默认选择原因很实际样本量小、特征维度低、类别线性可分性中等——setosa 与另外两类完全线性可分versicolor 和 virginica 之间有少量重叠。这意味着你既能观察到线性核的局限也能直观看到 RBF 核把决策边界「弯」过去的效果。从 SVM 的角度看Iris 提供了一个干净的验证场景你可以先用线性核跑一遍看准确率卡在多少再换 RBF 核调C和gamma观察决策边界怎么变。这份作业的脚本正是围绕这个对比逻辑展开的。svm_flower.py大概率是主流程脚本负责数据加载、模型训练和评估flower1.py可能是早期版本或单独的可视化脚本。报告里的 ROC 曲线和分类截图对应的是模型在不同核函数或参数下的表现对比。注意Iris 的 150 个样本如果只做一次 train_test_split测试集只有 3045 个样本准确率波动会比较大。常见做法是同时看交叉验证均值或者固定random_state保证可复现。2.2 脚本里的标准流水线六步走不管svm_flower.py具体怎么写一个合格的 SVM 分类脚本通常包含以下六步。我按常见实现方式还原核心代码结构你可以对照自己的脚本逐段检查。# 1. 导入依赖 import numpy as np import matplotlib.pyplot as plt from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.svm import SVC from sklearn.metrics import classification_report, confusion_matrix, roc_curve, auc # 2. 加载 Iris 数据 iris datasets.load_iris() X iris.data # 150 x 4 y iris.target # 150 个标签0/1/2 # 3. 划分训练集与测试集 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.3, random_state42, stratifyy ) # 4. 标准化SVM 对特征尺度敏感这一步不能省 scaler StandardScaler() X_train scaler.fit_transform(X_train) X_test scaler.transform(X_test) # 注意测试集用训练集的均值和方差 # 5. 训练 SVM 模型 model SVC(kernelrbf, C1.0, gammascale, probabilityTrue, random_state42) model.fit(X_train, y_train) # 6. 预测与评估 y_pred model.predict(X_test) print(confusion_matrix(y_test, y_pred)) print(classification_report(y_test, y_pred))这段代码里几个关键点值得展开。stratifyy保证训练集和测试集中三个类别的比例一致避免某一类在测试集里完全缺失。StandardScaler的fit_transform只用在训练集上测试集必须用同一个 scaler 的transform否则标准化参数泄露评估结果会偏乐观。SVC的probabilityTrue会启用概率估计ROC 曲线需要它但会稍微增加训练时间。gammascale是 sklearn 的默认值等于1 / (n_features * X.var())比手写gamma0.1更省心。2.3 核函数与参数线性核和 RBF 核到底怎么选Iris 上最常做的对比就是线性核 vs RBF 核。线性核kernellinear只有一个主要参数C适合特征维度高、样本量大的场景RBF 核kernelrbf有C和gamma两个参数适合非线性边界。在 Iris 上线性核通常能拿到 95% 左右的准确率RBF 核调好后能到 97%100%。参数含义用一句话说清C控制对误分类的惩罚力度C越大越不允许错分容易过拟合gamma控制单个样本的影响范围gamma越大影响范围越小决策边界越曲折也越容易过拟合。常见做法是用GridSearchCV在小范围里搜from sklearn.model_selection import GridSearchCV param_grid { C: [0.1, 1, 10, 100], gamma: [1, 0.1, 0.01, 0.001], kernel: [rbf] } grid GridSearchCV(SVC(probabilityTrue), param_grid, cv5, scoringaccuracy) grid.fit(X_train, y_train) print(最佳参数:, grid.best_params_) print(最佳交叉验证得分:, grid.best_score_)cv5表示 5 折交叉验证scoringaccuracy是评估指标。如果报告里只写了「调参后准确率提升」但没写搜索范围和交叉验证方式复现时就会很被动。建议把param_grid和best_params_都记在报告里。3. 把源码跑起来环境配置、执行顺序与结果验证3.1 环境准备Python 3.9 四个核心库项目正文写的是 Python 3.9 的 IDLE 环境但实际跑的时候用 PyCharm、VS Code 或 Jupyter 都行。关键是库的版本要能对上。核心依赖四个scikit-learn、numpy、matplotlib、scipysklearn 的底层依赖。安装命令如下# 建议先建虚拟环境避免和系统里的包冲突 python -m venv venv # Windows 激活 venv\Scripts\activate # macOS / Linux 激活 source venv/bin/activate # 安装依赖 pip install scikit-learn numpy matplotlib scipy如果你拿到的压缩包里没有requirements.txt就按上面四个装。版本方面sklearn 1.0 以上和 0.24 以上在SVC接口上基本兼容但gammascale这个默认值是从 0.22 开始有的更早的版本默认是auto。如果你在旧环境里跑结果对不上先查 sklearn 版本。提示.idea文件夹是 PyCharm 的工程配置里面可能记录了作者本地的解释器路径。你打开项目后如果提示解释器无效重新指向自己的 venv 就行不用管原来的配置。3.2 执行顺序先跑哪个脚本看什么输出压缩包里有svm_flower.py和flower1.py两个脚本。常见做法是先跑svm_flower.py因为它大概率是完整流程flower1.py可能是单独画图或早期实验版本。执行方式# 在项目根目录下执行 python svm_flower.py跑完后你应该看到几类输出控制台打印的混淆矩阵和分类报告、弹出的 matplotlib 图像窗口或保存到本地的 png。报告里提到的ROC.png、1_1.png、2_1.png等图片就是这些脚本生成的。如果脚本里用的是plt.show()图片不会自动保存如果想复现报告里的图需要把plt.show()改成plt.savefig(roc.png, dpi300)。flower1.py可以单独跑一遍对比输出是否和svm_flower.py一致。如果不一致看它是用了不同的random_state、不同的test_size还是只用了两个特征做二维可视化。二维可视化在 SVM 教学里很常见因为可以把决策边界画在平面上但只用两个特征会损失信息准确率通常低于四特征版本。3.3 结果验证准确率、混淆矩阵和 ROC 曲线怎么看跑通之后重点看三个东西。第一是分类报告里的precision、recall、f1-score。Iris 三分类里setosa 通常全是 1.00versicolor 和 virginica 会有少量互错。如果 setosa 的 recall 低于 1.00大概率是标准化没做对或者数据划分时没加stratify。第二是混淆矩阵。一个典型的 RBF 核结果可能是预测 setosa预测 versicolor预测 virginica实际 setosa1500实际 versicolor0141实际 virginica0114versicolor 和 virginica 各错一个这是 Iris 上很常见的结果。如果错误数量明显多于这个检查C和gamma是不是设得太极端。第三是 ROC 曲线。三分类的 ROC 需要做 One-vs-Rest 处理sklearn的roc_curve默认只支持二分类所以脚本里大概率用了label_binarize把标签转成三列 0/1然后对每个类别分别画曲线、算 AUC。报告里的ROC.png应该有三条曲线AUC 都在 0.98 以上算正常。如果 AUC 明显偏低先确认probabilityTrue有没有加再确认预测概率是不是用model.predict_proba(X_test)取的。4. 避坑与排查从环境到评估的五个血泪经验4.1 现象准确率异常高或异常低接近 1.0 或低于 0.8原因通常有两个。一是标准化时把测试集也fit了导致数据泄露准确率虚高二是random_state没固定每次划分不同小测试集上波动大。解决方式训练集用fit_transform测试集只用transform固定random_state42或做 5 折交叉验证看均值。4.2 现象ROC 曲线画不出来报错「multiclass format is not supported」原因roc_curve不接受多分类标签。解决用label_binarize(y, classes[0,1,2])把标签转成三列二值矩阵然后对每一列分别调roc_curve。如果脚本里已经写了但报错检查y_test是不是被label_binarize处理过以及model.predict_proba的输出列顺序是否和类别顺序一致。4.3 现象SVC训练很慢或者内存占用高原因probabilityTrue会内部做 5 折交叉验证来估计概率样本量大时明显变慢另外 RBF 核在样本量超过几万时计算开销会急剧上升。Iris 只有 150 个样本正常不会慢。如果慢检查是不是误用了kernelpoly且degree设得很大。解决Iris 场景下保持probabilityTrue没问题大数据场景换LinearSVC或SGDClassifier。4.4 现象报告里的图和脚本跑出来的图不一致原因脚本可能被修改过或者报告里的图是用旧版本脚本生成的。另外plt.show()和plt.savefig()的顺序也会影响保存的图——如果先show()再savefig()有些后端会保存空白图。解决把savefig放在show之前对比脚本里的random_state、test_size、kernel、C、gamma是否和报告描述一致。4.5 现象换台电脑跑报「ModuleNotFoundError: No module named sklearn」原因没激活虚拟环境或者 pip 装到了系统 Python 而不是当前解释器。解决先which pythonWindows 用where python确认当前解释器路径再pip install scikit-learn。如果用的是 PyCharm检查 File → Settings → Project Interpreter 是否指向 venv。5. 进阶技巧用决策边界图和交叉验证把作业做出区分度5.1 画二维决策边界让 SVM 的「最大间隔」肉眼可见报告里如果只有准确率和 ROC评阅人很难看出你对 SVM 的理解。加一张二维决策边界图效果会好很多。做法是只取两个特征比如花瓣长度和花瓣宽度训练一个 RBF 核 SVM然后在网格上预测并填充颜色。# 取两个特征做二维可视化 X_2d iris.data[:, [2, 3]] # 花瓣长度、花瓣宽度 y_2d iris.target X_train2, X_test2, y_train2, y_test2 train_test_split( X_2d, y_2d, test_size0.3, random_state42, stratifyy_2d ) scaler2 StandardScaler() X_train2 scaler2.fit_transform(X_train2) X_test2 scaler2.transform(X_test2) model2 SVC(kernelrbf, C1.0, gammascale) model2.fit(X_train2, y_train2) # 生成网格 x_min, x_max X_train2[:, 0].min() - 0.5, X_train2[:, 0].max() 0.5 y_min, y_max X_train2[:, 1].min() - 0.5, X_train2[:, 1].max() 0.5 xx, yy np.meshgrid(np.arange(x_min, x_max, 0.02), np.arange(y_min, y_max, 0.02)) Z model2.predict(np.c_[xx.ravel(), yy.ravel()]) Z Z.reshape(xx.shape) plt.contourf(xx, yy, Z, alpha0.3, cmapplt.cm.coolwarm) plt.scatter(X_train2[:, 0], X_train2[:, 1], cy_train2, edgecolorsk, cmapplt.cm.coolwarm) plt.xlabel(花瓣长度标准化后) plt.ylabel(花瓣宽度标准化后) plt.title(RBF 核 SVM 决策边界) plt.savefig(decision_boundary.png, dpi300) plt.show()这段代码的关键在np.meshgrid生成网格点np.c_把两个特征拼成预测矩阵contourf填充决策区域。alpha0.3让背景半透明散点更清楚。把kernel换成linear再跑一遍两张图放一起对比线性边界和 RBF 边界的差异一目了然。5.2 交叉验证 学习曲线判断模型是过拟合还是欠拟合单次train_test_split的评估结果受划分影响大。加一个 5 折交叉验证报告里写「交叉验证准确率均值 ± 标准差」比单次准确率更有说服力。再进一步画学习曲线看训练集和验证集得分随样本量增加的变化。from sklearn.model_selection import cross_val_score, learning_curve # 5 折交叉验证 scores cross_val_score(SVC(kernelrbf, C1.0, gammascale), scaler.fit_transform(X), y, cv5, scoringaccuracy) print(f交叉验证准确率: {scores.mean():.4f} ± {scores.std():.4f}) # 学习曲线 train_sizes, train_scores, val_scores learning_curve( SVC(kernelrbf, C1.0, gammascale), scaler.fit_transform(X), y, cv5, scoringaccuracy, train_sizesnp.linspace(0.1, 1.0, 10) ) train_mean train_scores.mean(axis1) val_mean val_scores.mean(axis1) plt.plot(train_sizes, train_mean, o-, label训练集得分) plt.plot(train_sizes, val_mean, o-, label验证集得分) plt.xlabel(训练样本数) plt.ylabel(准确率) plt.legend() plt.savefig(learning_curve.png, dpi300) plt.show()如果训练集得分远高于验证集得分说明过拟合可以减小C或增大gamma如果两条线都低且靠得很近说明欠拟合可以增大C或换 RBF 核。Iris 只有 150 个样本学习曲线通常在 90 个样本左右就趋于平稳验证集得分在 0.950.98 之间。5.3 报告里值得补的两张表除了图报告里加两张表能明显提升完整度。一张是不同核函数和参数下的准确率对比核函数Cgamma测试集准确率交叉验证均值linear1.0—0.95560.9533rbf1.0scale0.97780.9733rbf100.010.97780.9800rbf1000.0010.95560.9667另一张是分类报告的精简版只保留 precision、recall、f1-score 三列按类别分行。这样评阅人不用翻控制台输出就能看到关键结果。从那以后我每次跑 SVM 实验都强制先固定random_state、再确认标准化只 fit 训练集、最后补一张交叉验证得分——这三步走完结果才敢往报告里写。希望帮到你。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询