每年到了毕业季,总能看到一批又一批的同学卡在“支持向量机”这个题目上。选这个题的人多,能真正把SVM讲清楚、代码跑通、论文写明白的却没几个。这倒不是大家不努力,而是SVM这个东西“看着简单、用起来发怵”——数学推导劝退了一拨人,调参又劝退了一拨人,等到了写论文的时候,连“支持向量到底是什么”都还说不清楚,自然就越来越焦躁。
这篇博文我想从一个过来人的角度,把这个经典毕业设计题目“支持向量机在统计分类中的应用-计算机毕业设计源码+LW文档”掰开揉碎地讲清楚。我会从题目拆解、环境搭建、数据处理、模型训练、参数调优一路聊到论文写作和答辩,把每一步的关键决策点、背后的逻辑、以及我当年踩过的坑全部交代出来。不管你是刚拿到题目还没思路,还是代码跑通但论文不知道怎么写,这篇文章都值得你花十分钟仔细看一下。
1. 毕业设计选题背后:这个题目到底在考什么
1.1 题目拆解:别被“源码+LW文档”吓到
先把这个题目拆开看。“支持向量机在统计分类中的应用”是课题名,后面的“计算机毕业设计源码+LW文档”其实是交付物的说明——你既要交可运行的代码,也要交论文(LW是“论文”的拼音缩写,学院里习惯这么叫)。
从技术角度看,这个题目的核心考点其实很集中,不需要你做出什么惊天动地的创新,但它要求你掌握几项“必须会”的能力:
- 能够理解SVM的基本原理,至少能把“间隔最大化”“核函数”“支持向量”这几个概念用自己的话讲清楚;
- 能够使用Python(或者MATLAB)完成数据加载、预处理、模型训练、评估的完整流程;
- 能够设计一组对比实验,比如SVM与逻辑回归、决策树、KNN的对比,用数据说明SVM的优势和局限;
- 能够写出一篇结构完整、逻辑清晰的毕业论文,而不是把代码注释堆到Word里交差。
很多同学拿到题目后先慌的是“我不会最先进的那个SVM理论怎么办”。其实带毕业设计的老师心里有数,本科毕设考察的是“你有没有能力独立完成一个完整的分析流程”,而不是“你是不是机器学习领域的天才”。这一点想通了,后面做起来就轻松很多。
1.2 为什么用SVM而不是深度学习:毕设选题的潜规则
你可能会问,现在深度学习都快烂大街了,为什么每年还有这么多学校在出SVM相关的毕设题?这里有一个很现实的原因:SVM是少数能在“有限数据”下讲清楚“统计学习理论”的模型。
深度学习模型动辄几十层网络,数据量不够就是过拟合,而且硬件要求高,本科宿舍的笔记本跑个像样的CNN可能要半天。SVM不一样,它在小样本、高维数据下表现稳定,理论根基扎实,代码实现可控,论文里也有大量的现成案例可以参考。更关键的是,SVM涉及的核心概念几乎贯穿了整个机器学习体系——正则化、核技巧、优化问题、泛化能力——做好了这一个题目,你面试时被问到的很多基础问题都能接得住。
所以这个选题表面上看是“老掉牙”,实际上是“稳中有深”。如果指导老师还要求你对比实验,那么SVM和决策树、随机森林、逻辑回归的对比写出来,论文的论据就非常扎实了。
2. 实验环境搭建与数据准备:至少省你一周时间的配置方案
2.1 工具选型:Python全家桶就够用了
这是我最想提醒大家的一点:做SVM毕设,不需要装MATLAB,不需要买GPU服务器,不需要折腾Linux双系统。一套Anaconda + Jupyter Notebook,再配一两个常用的库,就完全能支撑你把所有实验跑完。
具体来说,你需要的库只有这几个:
scikit-learn:开箱即用的SVM实现,无论是线性SVM还是RBF核SVM,几行代码就能调起来;pandas和numpy:数据处理和矩阵运算,没有这两个库你会累死;matplotlib和seaborn:画图用,论文里的可视化图表全靠它们。
如果你用的是Anaconda发行版,以上这些库在装好Anaconda那一刻就已经全部就位了,不需要你手动一条条pip install。安装方式也很简单,去官网下载对应你操作系统的安装包,一路下一步就行。
有些人喜欢用Google Colab在线跑,我个人的建议是,如果你数据量不大(比如几千条),本地跑完全没问题;但如果你用的数据集有几万条甚至更多,或者你想试试不同的核函数、调C和gamma的网格搜索,本地CPU会吃力,那就用Colab或者Kaggle Notebook,免费GPU算力虽然对SVM提速有限,但起码不会把笔记本风扇转得跟直升机一样。
2.2 数据集怎么选:不要一上来就搞MNIST
数据集的选择直接决定了你后面三个月的日子好不好过。我看到很多同学一拿到题就冲向MNIST手写数字识别,觉得“图像分类听起来高大上”。但请你们冷静一下:MNIST是图像数据,SVM要处理图像你得先把像素矩阵拉平成一维特征向量,28×28的图片拉平后是784维,这还勉强能跑;可一旦你换到CIFAR-10,32×32×3是3072维,SVM训练时间会大幅飙升,调一次参数跑十几分钟,你的耐心会被彻底消磨殆尽。
更适合SVM毕设的数据集应该满足这几个条件:特征维度不要太高(小于100维最好)、类别数不要太多(二分类或者三分类最佳)、数据量在一万行以内。我个人最常用的几个:
- UCI Wine葡萄酒数据集:178个样本,13个特征,3个类别,经典得不能再经典,用来做SVM入门和论文实验非常舒服;
- UCI Iris鸢尾花数据集:150个样本,4个特征,3个类别,每个学机器学习的都跑过它,但正因为太简单,论文里单独用它显得单薄;
- UCI Breast Cancer Wisconsin乳腺癌数据集:569个样本,30个特征,二分类问题,有明确的医学应用背景,论文里能写出实际意义;
- UCI Seed小麦种子数据集:210个样本,7个特征,3个类别,和农业应用挂钩,也挺好写。
如果你想让论文显得稍微“高级”一点,可以选一个真实业务场景的数据集,比如银行营销预测、电信客户流失预测之类,这类数据在Kaggle上非常多,特征含义清晰,业务背景丰富,写论文时讨论起来也更有话可说。
2.3 数据预处理三步走:标准化、编码、划分
预处理是很多同学容易忽略但最致命的环节。SVM本身对特征的尺度高度敏感,比如一个特征是“年龄”(0到100),另一个特征是“年收入”(0到100万),两个特征的数值范围差了四个数量级,如果不做标准化,距离计算会被数值大的特征完全主导,支持向量的选择就会出现严重偏差。
标准的做法是使用StandardScaler做Z-score标准化,让每个特征都变成均值为0、标准差为1的分布。这一步在scikit-learn里就一行代码:
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test)注意这里有一个新手必踩的坑:必须先fit训练集,再transform测试集,绝对不能把训练集和测试集混在一起fit。原因很简单,测试集的角色是“模拟未来未知的数据”,它不应该参与任何统计量的计算,否则就会造成信息泄漏,实验结果会虚高,答辩时老师如果问到这一点,你会非常被动。
除了标准化,还有两个小细节要处理:
- 类别特征:如果数据里有“性别”“职业”这类字符串特征,需要做数值编码,用
LabelEncoder或者pd.get_dummies()都行; - 缺失值:先用
data.isnull().sum()检查一遍,有缺失就按情况填充,数值型特征用中位数或均值填充,类别型特征用众数填充,实在不行把缺失过多的行删掉。
最后按照7:3或者8:2的比例划分训练集和测试集,并设置random_state=42(或者其他固定的数字)保证实验可复现。这些都是论文“实验设计”部分需要写清楚的细节,别看它们不起眼,答辩时老师就是靠这些细节判断你到底是不是自己动手做的。
3. 支持向量机的核心原理:用“分类间隔”解释一切
3.1 从线性分类器说起:SVM到底在找什么线
要理解SVM,得先回到最朴素的问题:给一堆点,每个点有类别标签(比如正类和负类),你作为算法要去画一条线把它们分开。最直观的想法是画一条“分界线”,左侧的点是正类,右侧的是负类。但能用一条线分开两类点的方案有无数种,SVM要做的是从中选出一条“最好”的。
那什么才算“最好”?直觉上,我们希望这条线离两边最近的点都尽量远。想象你在一堆红色珠子和蓝色珠子中间画线,线如果紧贴着某一堆珠子,那下次再来一个稍微极端一点的新珠子,这条线就分错了。如果线距离两边都保持一个安全距离,分类的容错性就大得多。
这个“线到最近点的距离”就是“间隔”(margin)。SVM要最大化的,正是这个间隔。而那些恰好落在间隔边界上的样本点,就是传说中的支持向量。整个模型的名字都来源于此——真正决定分类决策的,只有这些少数的支持向量,其他远离边界的点,删掉多少都不影响结果。
用数学公式来表达:线性SVM找的是一条分类超平面 ( w^T x + b = 0 ),优化目标是最大化间隔 ( 2 / ||w|| ),等价于最小化 ( ||w||^2 / 2 ),同时满足每个样本都被正确地分到间隔之外。再加上一个软间隔参数C来处理那些本来就线性不可分的数据,基础的SVM优化问题就成型了。
3.2 核函数:把非线性问题“升维打击”
现实里很多数据不是线性可分的。比如平面上一些点画出来是圆形分布,你用直线怎么切都切不干净。这时候SVM的杀手锏就出来了——核函数。
核函数的思想非常巧妙:我虽然没法用一条直线在二维空间里把两类点分开,但我可以把它们映射到一个更高维的空间,在那个空间里它们是线性可分的,然后再找一个超平面。问题是高维映射的计算量太大了,好在核函数提供了一种捷径——我可以在不显式计算高维坐标的情况下,直接计算高维空间中的内积。
常用的核函数有这么几类:
- 线性核:就是普通的 ( x_i \cdot x_j ),适合本身就线性可分的数据;
- 多项式核:( (\gamma x_i \cdot x_j + r)^d ),适合一些有小幅非线性关系的数据;
- RBF径向基核(高斯核):( \exp(-\gamma ||x_i - x_j||^2) ),最常用,也最好用,几乎能处理任何非线性关系,缺点是参数多、调参相对费劲;
- Sigmoid核:和神经网络有很深的渊源,但在SVM里用得不算多。
对于绝大多数毕设场景,我推荐直接用RBF核。它在sklearn中的参数是kernel='rbf',你只需要关注两个超参数:C(惩罚系数)和gamma(核函数宽度)。C越大,模型对训练集错误的惩罚越重,越容易过拟合;gamma越大,RBF核的影响范围越小,决策边界越“卷曲”,也越容易过拟合。这两个参数的组合是调参阶段的核心工作,后面我专门用一节说这个。
3.3 从二分类到多分类:不是“一个SVM”而是一组SVM
SVM天生是二分类器,它只会回答“是”或“不是”,不会天然地分出三个类。但我们毕设用的数据集往往不止两个类别,这时候就需要把多个二分类SVM组合起来。
scikit-learn里SVC默认使用的是“一对一”(one-vs-one, OvO)策略:如果有K个类别,就两两组合训练 ( K(K-1)/2 ) 个分类器,最后投票决定样本属于哪个类。另一种策略是“一对多”(one-vs-rest, OvR),对每个类别训练一个“属于这个类 vs 不属于这个类”的分类器,一共K个,最后看哪个分类器的置信度最高。
这两种策略不是SVM独有的,逻辑回归、朴素贝叶斯也有相同的多分类处理思路,这些在论文的“方法”章节里要写清楚,属于老师必看的内容。不用展开太多,但至少要让老师知道你明白SVM是怎么完成多分类的。
4. 从零写的代码实现:完整SVM分类流程
4. 实操过程与核心环节实现:跑通一份完整的SVM分类实验
4.1 代码骨架:读数据、分训练测试、训练模型、评估
先把整段代码骨架搭出来,后续所有的调参和优化都是在这个骨架上做文章。
import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler, LabelEncoder from sklearn.svm import SVC from sklearn.metrics import accuracy_score, classification_report, confusion_matrix # 1. 加载数据 df = pd.read_csv('wine.csv') # 以UCI Wine数据集为例 print(df.head()) print(df.info()) # 2. 划分特征和标签 X = df.drop('target', axis=1).values y = df['target'].values # 3. 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.3, random_state=42, stratify=y ) # 4. 特征标准化 scaler = StandardScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) # 5. 训练SVM svm_model = SVC(kernel='rbf', C=1.0, gamma='scale', random_state=42) svm_model.fit(X_train, y_train) # 6. 预测与评估 y_pred = svm_model.predict(X_test) print('准确率:', accuracy_score(y_test, y_pred)) print(classification_report(y_test, y_pred)) print('混淆矩阵:') print(confusion_matrix(y_test, y_pred))这段代码看着很短,但每一步都有讲究。stratify=y这个参数很多人不知道,它的作用是让划分后的训练集和测试集里各个类别的比例保持一致。如果你的数据集类别不平衡,比如正类占了90%、负类只占10%,不做分层采样,极有可能把测试集里那点稀缺的负类全部丢掉,实验结果直接垮掉。
gamma='scale'是sklearn里的一个自动做法,它等于1 / (n_features * X.var()),意思是根据输入特征的方差自动确定gamma的取值。这个默认值在多数情况下表现不差,适合做baseline,后面再手动调优。
第一版跑完,你得到的准确率可能就是90%上下。别慌,baseline不需要惊为天人,它的意义在于给你一个参照系——后面每调整一个参数,你都能知道这个改动是带来了提升还是退步。
4.2 参数调优实操:网格搜索不是越高大上越好
SVM调参的核心就是C和gamma。我先用最通俗的方式解释一下这两个参数到底在控制什么。
C是“你对错误分类的容忍度”。C非常大,意味着模型几乎不允许任何训练错误,每个点都要分对,结果就是决策边界极其复杂,训练集准确率接近满分,但测试集表现惨不忍睹——这就是过拟合。C很小,意味着模型宁可牺牲训练集准确率,也要保持决策边界平滑,如果C太小了,模型又会变得过于迟钝,分不开该分的数据——这是欠拟合。
gamma只对非线性核(特别是RBF)有意义,它控制的是“每个训练样本的影响半径”。gamma很大时,每个样本的影响范围很小,决策边界会变得弯弯绕绕,几乎贴着训练样本走,容易过拟合;gamma很小时,每个样本的影响范围很大,决策边界非常平滑,但也可能把很多细节抹掉,导致欠拟合。
调参的标准工具是GridSearchCV,它把C和gamma的所有候选组合都跑一遍,用交叉验证选出最好的组合:
from sklearn.model_selection import GridSearchCV param_grid = { 'C': [0.1, 1, 10, 100], 'gamma': [0.001, 0.01, 0.1, 1, 'scale'], 'kernel': ['rbf'] } svm = SVC(random_state=42) grid_search = GridSearchCV( svm, param_grid, cv=5, scoring='accuracy', n_jobs=-1 ) grid_search.fit(X_train, y_train) print('最优参数:', grid_search.best_params_) print('最优交叉验证得分:', grid_search.best_score_) best_svm = grid_search.best_estimator_ test_acc = best_svm.score(X_test, y_test) print('测试集准确率:', test_acc)这里再提醒一个细节:GridSearchCV的cv=5表示5折交叉验证,也就是把训练集内部再分成5份,轮流取4份训练、1份验证,最终取平均分数作为该组参数的评估结果。这么做比只跑一次训练集更抗偶然性,选出来的参数也更可靠。
网格搜索看着很简单,但候选参数的范围如果设计不合理,跑起来会非常痛苦。我见过有人把C从1e-5到1e5每隔10倍列了11个值,gamma也列了11个值,一共121组组合,每组组合又要跑5折交叉验证,一共要训练600多次SVM。数据量稍微大一点,这个网格搜索跑上一个小时也不奇怪。
我的经验是分两步走:先用一个较粗的网格(C取[0.1, 1, 10, 100],gamma取[0.01, 0.1, 1]),确定一个大致的好区域,然后在好区域附近再细搜一轮。这样既不会错失最优区间,也不至于傻等太久。
4.3 可视化:这几张图能让论文质量直接上一个档次
论文里最打动老师的,往往不是你跑了多少次实验,而是你的图表是否清晰规范。SVM实验里至少有四类图是强烈建议画出来的:
第一类,混淆矩阵热力图。它比一个孤零零的准确率信息量大得多——你能看出模型在哪两个类别上经常混淆,这是分析错误来源的起点。
import matplotlib.pyplot as plt import seaborn as sns cm = confusion_matrix(y_test, y_pred) plt.figure(figsize=(8, 6)) sns.heatmap(cm, annot=True, fmt='d', cmap='Blues') plt.xlabel('预测标签') plt.ylabel('真实标签') plt.title('SVM分类混淆矩阵') plt.show()第二类,分类决策边界图。把高维数据降维到二维(比如用PCA取前两个主成分),再把模型的决策边界画出来,读者一眼就能看出SVM分类的直观效果。不过要注意,PCA降维后的决策边界只能用来做可视化展示,不能替代高维空间里的真实实验结果。
第三类,不同参数下准确率的对比曲线。固定gamma不动,看C从0.1变到100时准确率的走势;再固定C不动,看gamma的变化。这种曲线能非常直观地展示“过拟合”和“欠拟合”在性能上的表现,也是论文“实验分析”部分的加分项。
第四类,PCA降维后的样本分布图,用来展示原始数据的分布情况,作为实验前的数据探索。
代码上的细节我就不每一张都写了,matplotlib和seaborn的组合足够应对。有一个小技巧:出图后统一用plt.savefig('xxx.png', dpi=300, bbox_inches='tight')保存高分辨率图片,Word里插进去才不会糊。很多同学用默认的dpi导出图片,放大看全是锯齿,答辩PPT上一放就露怯了。
5. 对比实验设计:怎么用实验数据“讲出故事”
5.1 选哪些模型来对比
毕设论文的数据支撑单靠SVM自己是不够的,你得有对比对象,才能凸显SVM的特点——或者承认SVM的局限,这也是一种严谨的学术态度。和大名鼎鼎的深度学习做对比不现实,本科毕设阶段最常规的做法是拉上这些经典机器学习模型:
- 逻辑回归(Logistic Regression):线性模型的代表,和线性SVM做对比时特别有讲究;
- 决策树(Decision Tree):非参数模型的代表,解释性强,和SVM的黑盒特性形成鲜明对照;
- K近邻(KNN):简单到极致却没有下限的模型,特别依赖距离度量和特征缩放,和SVM形成“简单vs复杂”的对照;
- 随机森林(Random Forest):集成学习的代表,在许多表格数据上表现好到不真实,和SVMPK很有看点。
这四个模型在sklearn里都是一行代码就能训好,不需要额外写什么复杂逻辑。
5.2 实验对比表怎么制作
对比实验不能只跑一个准确率就完事,正常流程是:
- 用同一个训练集/测试集划分方案(确保公平对比);
- 对所有模型都做相同的特征标准化;
- 将SVM调参后的最优结果、其他模型的默认参数结果(或者简单调参后的结果)放在同一个表格里;
- 除了准确率,还报告精确率(Precision)、召回率(Recall)、F1值,最好再加上训练时间。
最后呈现出来的表格长这样:
| 模型 | 准确率 | 精确率 | 召回率 | F1值 | 训练时间(s) |
|---|---|---|---|---|---|
| 逻辑回归 | 96.30% | 96.40% | 96.30% | 96.30% | 0.08 |
| 决策树 | 92.59% | 93.10% | 92.59% | 92.50% | 0.05 |
| K近邻 | 94.44% | 94.70% | 94.44% | 94.40% | 0.02 |
| 随机森林 | 97.22% | 97.30% | 97.22% | 97.20% | 0.30 |
| SVM(RBF) | 98.15% | 98.20% | 98.15% | 98.10% | 0.45 |
这张表放在论文里,就是最有说服力的论据。老师看到这张表,第一反应是你用了统一的评估框架、考虑到了多个维度,而不是“只会调一个accuracy”。写论文时再配上两段分析——先说明SVM为何能取得最高准确率(间隔最大化带来的泛化优势、RBF核处理非线性特征的能力),再说明SVM的代价(训练时间相对更长、可解释性不如决策树)——这就是一篇论文“实验分析”部分的完整骨架。
这里特别提醒一点:不要让所有模型在调参上投入的精力差距过大。比如SVM你花了三天三夜调参,其他模型全都用默认参数,那对比结果显然是SVM“吊打全场”。答辩时遇到较真的老师,一问你其他模型是否也做过调参,场面会很尴尬。公平起见,每个模型至少用默认参数跑一遍,再用网格搜索简单调几个关键参数(比如KNN的n_neighbors,随机森林的n_estimators),这样实验设计才是站得住的。
6. 常见问题与排查技巧实录:那些折磨过我的坑
6.1 运行报错一箩筐:先解决这几个高频问题
“ConvergenceWarning: Liblinear failed to converge”
这个警告常见于线性SVM或逻辑回归训练时,意思是优化算法在最大迭代次数内没有收敛。解法优先是增大max_iter,比如设为5000或10000;或者对数据做更彻底的标准化;还有就是把损失函数从默认改成squared_hinge,有时候能绕开。记住,这个警告不能无视,不收敛意味着模型可能处于一个次优解,实验结果不可靠。
“ValueError: Unknown label type: 'continuous'”
如果你传入SVM的y是连续的浮点数而不是离散的类别标签,就会报这个错。检查一下你是否忘了对标签做编码,比如把“M”和“B”这样的字符串标签转成0和1。用LabelEncoder可以快速解决。
训练时间超长,跑了几分钟还没出结果
先看数据量——样本数超过一万之后,RBF核SVM在CPU上跑起来确实很吃力。如果数据量确实大,有两个思路:一是改用线性核试试,线性核在大量数据下训练速度快得多;二是先对特征做PCA降维,减少特征维度后再训练RBF核SVM,效果往往不降反升。
测试集准确率低但训练集准确率是100%
这是标准的过拟合表现。优先走两条路:减小C让模型允许更多训练错误,或者减小gamma让决策边界更平滑。也可以增加训练集样本量,或者考虑降维减少噪声特征。
6.2 论文写作避坑:LW文档里的“大忌”
说到LW文档,很多同学以为论文就是把代码运行结果截图贴进去,这是最大的误区。毕业设计的LW文档一般要求包含摘要、绪论、相关技术介绍、系统设计与实现、实验结果与分析、总结与展望这六大板块。SVM方向的论文,重点是要把“问题定义”“方法原理”“实验设计”“结果讨论”这四个环节打通。
写摘要时,要把“什么问题、用什么方法、得到什么结论”三件事浓缩在200字以内。比如可以写:“针对葡萄酒数据集的分类问题,本文提出采用支持向量机构建分类模型,通过特征标准化、网格搜索参数优化并与四种经典分类算法进行对比实验。实验结果表明,基于RBF核的SVM在测试集上取得了98.15%的分类准确率,优于对比模型。”
相关技术介绍部分,不要整段抄书本。你要用自己的话解释SVM的间隔最大化、核函数的选择依据,以及为什么RBF核在本数据集上适用。老师看这部分,重点不是看你的公式推导(你们也没必要推得太深),而是看你能不能把一个复杂概念讲清楚。一句话概括就是:用自己的话说一遍,能说明白你就真的懂了。
实验结果分析部分,不要只说“SVM的准确率最高,所以SVM最好”。要展开:哪些类别容易混淆?为什么?SVM训练时间为什么比KNN长?这些问题你在前面实验过程里其实都遇到过,只是要把它们组织成书面语言。
6.3 答辩准备:三个高频问题提前背熟
答辩时老师大概率会问这几个问题,提前准备准没错:
“解释一下支持向量是什么意思?”
这是必考题。标准回答是:支持向量是训练集中离分类超平面最近的那些样本点,它们决定了分类间隔的位置和大小,也就是决定了最终的分类器。删除其他样本点,分类结果不变;删除任何一个支持向量,分类器就可能改变。SVM的“支持向量”四个字,说的就是这件事。
“为什么选择高斯核而不是线性核?”
这个问题考察的是你对核函数本质的理解。标准回答是:高斯核能够将低维空间中的非线性可分数据映射到无穷维特征空间,可以处理更复杂的决策边界;而且高斯核只有一个参数gamma,相对容易调优。在线性可分或者特征维度很高的情况下,线性核是更经济的选择,但在数据具有明显非线性特征时,高斯核通常效果更好。
“参数C和gamma对模型有什么影响?”
回答要点:C是正则化参数,控制对分类错误的惩罚力度,影响模型的过拟合/欠拟合程度;gamma是高斯核的宽度参数,控制单个样本的影响半径,影响决策边界的复杂程度。你在实验中对比了不同参数组合的准确率,这里可以拿出你的调参曲线图来佐证。
说实话,这个题目在计算机毕设里就像一个“经典老方”——不会让你惊艳全场,但它足够安全、足够扎实,也足够让你学到真东西。我记得自己当年跑通第一个SVM分类器的时候,看到那根决策边界稳稳地把三类样本分开,心里确实有种莫名其妙的成就感。后来工作里遇到真正复杂的工业数据,虽然很少再用SVM作为生产模型,但理解间隔、理解正则化、理解核函数带来的思路,潜移默化地帮我解决了很多其他算法的问题。
最后再分享一个小技巧:不论你最后计算出来的准确率是92%还是98%,都不要为了数据好看去改测试集划分或者偷偷加数据。毕业设计的价值不在于你得到了一个多么完美的结果,而在于你经历了一个完整的“提出问题—设计实验—分析结果—得出结论”的过程。把这一点守住,你就可以坦然面对任何一个追问。