28 Python 分类:不只是画一条线,一文认识支持向量机(SVM)

发布时间:2026/5/20 8:06:07

28 Python 分类:不只是画一条线,一文认识支持向量机(SVM) Python 数据分析入门不只是画一条线一文认识支持向量机SVM适合人群Python 初学者 / 数据分析入门 / 机器学习入门 / 教学案例分享前面几篇文章里我们已经从不同角度认识了分类问题K近邻看新样本和谁最像决策树像老师一样一步步做判断随机森林很多棵树一起投票朴素贝叶斯比较样本属于各个类别的概率到了这里再往下看分类方法就会碰到一个非常经典、也非常有代表性的模型支持向量机Support Vector MachineSVM第一次看到这个名字很多人会觉得它有点“硬核”什么叫“支持向量”什么叫“超平面”为什么总听人说它适合做分类它和前面那些方法到底有什么不同其实入门阶段不需要一上来就掉进复杂公式里。你可以先把支持向量机理解成一句很直白的话它想做的事情是找到一条尽可能“分得好、分得稳”的分类边界。还是拿“学生能否通过技能考核”这个案例来说有一批学生最后通过了考核也有一批学生没有通过如果把这些学生的特征画在图里我们当然希望能找到一条分界线把“通过”和“未通过”尽量分开。但问题在于不是所有数据都能轻松用一条直线分开即使能分开也不一定随便画一条线就最好这就是支持向量机最核心的关注点不仅要分开还要尽量分得更稳。这一篇文章我会继续用通俗方式把 SVM 最关键的思路讲清楚支持向量机到底想解决什么问题什么叫“最佳分离超平面”什么是线性可分、线性不可分、非线性分类为什么会提到“高维映射”核方法到底是干什么的如何用 Python 跑一个简单的 SVM 分类模型一、先从一个很自然的问题开始分类边界到底怎么画先回到一个很直观的想法。假设我们要根据学生的两个特征来预测他是否能通过技能考核比如横轴实训成绩纵轴出勤率如果把历史学生画成散点图可能会出现这样的情况一部分点代表“通过”一部分点代表“未通过”这时候一个最自然的想法就是能不能画一条线把这两类点分开如果能分开那新学生来了以后只要看他落在线的哪一边就能做出分类判断。这就是支持向量机最容易理解的入口先找一条分类边界。二、支持向量机到底在做什么支持向量机本质上是一种分类方法它既可以处理线性分类也可以处理非线性分类。如果先不讲复杂术语它最核心的事情可以概括成一句话在样本之间找到一个尽可能好的分界面把不同类别分开。注意不是随便找一条线而是找一条分得开分得稳泛化能力尽量好的边界也就是说SVM 的目标不是“只要分开就行”而是找一个最优的分界面。从原理上看支持向量机建立在统计学习理论基础上希望在模型复杂性和学习能力之间取得平衡从而获得更好的推广能力。这句话如果用更直白的话来说其实就是既要能把训练数据分开也不能分得太死得尽量让它对新数据也有效。三、什么叫“最佳分离超平面”这是支持向量机里最经典、也是最容易把人吓到的词。其实你可以先把它拆开来看。1什么是“分离”就是把不同类别分开。比如“通过”的学生分在一边“未通过”的学生分在另一边2什么是“平面”如果数据是二维的那这个分界面看起来就是一条直线。如果数据是三维的那它就是一个平面。如果数据维度更高那它就是一个“超平面”。所以你可以先简单理解成超平面就是高维空间里的分类边界。3什么叫“最佳”这才是重点。支持向量机并不满足于“只找一条能分开的线”而是希望找到一条离两边样本都尽量远的边界。因为这样通常会更稳。所以“最佳分离超平面”最通俗的理解就是一条不仅能把两类样本分开而且尽量离两边样本都远一点的边界。四、为什么 SVM 不是随便画条线就行这个问题特别关键。假设现在有两类点确实可以用直线分开。那是不是任意一条能分开的线都一样当然不是。想象一下有的线虽然能分开样本但离某些样本特别近有的线分得更居中两边留出的“安全距离”更大直觉上你也会觉得第二种线更稳。因为如果新样本稍微有点波动第一种线就可能把它分错第二种线则更有缓冲空间。所以支持向量机最核心的思想之一就是希望分类边界尽量留出更大的间隔。也正因为这样SVM 通常不只是追求“分得开”而是追求“分得稳”。五、什么是支持向量为什么这个模型叫支持向量机这个名字第一次看确实会有点抽象。其实可以这样理解在那条最佳分界线附近总会有一些离边界最近的样本点。这些点非常关键因为真正决定这条边界位置的往往就是这些最靠近边界的样本。这些关键样本就叫做支持向量你可以把它理解成不是所有样本都同样重要真正“撑住”这条边界位置的是那几个最关键、最靠近边界的点所以支持向量机这个名字的意思其实就是由支持向量来决定分类边界的模型。这个理解先建立起来后面再看到“支持向量”这个词就不会觉得那么陌生了。六、线性可分、线性不可分、非线性分类分别是什么意思SVM 的分类情况通常可以从简单到复杂分成几种。1线性可分线性可分的意思是可以直接用一条直线或高维中的超平面把两类样本分开。比如一边大多数都是“通过”一边大多数都是“未通过”中间留出一条明显的空隙这种情况是最理想的也是最容易理解的。2线性不可分有些时候两类样本分布比较乱想用一条线完全分开会比较困难。这时候就会出现你画哪条线都可能有少数点分错完全“零错误”地分开做不到这就叫线性不可分。但这不代表 SVM 就没法用了。实际中支持向量机并不是要求数据必须完美分开而是允许有一定误差并在“分得开”和“不过度复杂”之间找平衡。你可以先这样理解有时候现实数据并不那么理想SVM 会尽量找一个总体更合理的边界。3非线性分类还有一些数据更麻烦根本不是“画条直线”就能解决的。比如两类样本分布成环状月牙状弯曲交错状这时候别说“最佳直线”了连“普通直线”都很难分清。这就进入了非线性分类的场景。支持向量机之所以经典很大一个原因就在于它不只会处理线性分类也能处理非线性分类。七、SVM 怎么处理非线性问题为什么会提到“高维映射”这是 SVM 里最容易听到、也最容易发懵的一个点。支持向量机的一个经典思路是如果原来的空间里不好分那就把数据映射到更高维的空间里再尝试去分。什么意思可以这样理解在低维空间里两类点缠在一起不好切但如果把它们变换到一个更高维的空间里可能就变得更容易分开了所以 SVM 的一个重要思想就是通过映射把原来不好分的数据变成更容易分的数据。你可以先不用深究几何细节先抓住这个直觉不是数据本身不能分而是它在当前空间里不好分。换个空间也许就好分了。八、那“核方法”又是干什么的一听到“映射到高维空间”很多人马上又会想到一个问题那不是很麻烦吗维度一高计算不是更重这时候就轮到核方法出场了。核方法的作用可以先非常粗略地理解成不真的把数据显式搬到高维空间里但又能得到类似“高维计算”的效果。也就是说它像是在帮我们“绕开”高维映射带来的直接计算问题。所以入门阶段你可以这样理解核方法高维映射是思路核方法是实现这个思路的技巧换句话说核方法是 SVM 处理非线性问题的关键工具。九、SVM 和前面学过的方法到底有什么不同学到这里最好把它和前面的方法做一个对比。K近邻思路是看谁和新样本更像决策树思路是一步一步问问题最后走到某个类别随机森林思路是让很多棵树一起判断提高稳定性朴素贝叶斯思路是比较样本属于各类别的概率支持向量机思路是找一个尽量分得开、分得稳的最优分类边界所以你可以把它们简化记成KNN看邻居决策树看规则贝叶斯看概率SVM看边界这也是为什么学到 SVM 时很多人会明显感觉它是在用“几何边界”的方式思考分类问题。十、Python 实操之前先说一下这次用的是什么数据下面代码里继续使用sklearn自带的鸢尾花数据集Iris。这个数据集一共包含150 条样本4 个数值特征3 个类别4 个特征分别是花萼长度花萼宽度花瓣长度花瓣宽度模型的任务是根据这 4 个特征判断样本属于哪一种鸢尾花。所以这本质上是一个三分类任务。虽然这个例子不是“学生能否通过技能考核”的业务数据但它非常适合用来演示支持向量机的基本分类流程。十一、Python 实操用 SVM 完成一个三分类任务下面直接使用SVC()来完成一个简单的支持向量机分类任务。fromsklearn.datasetsimportload_irisfromsklearn.model_selectionimporttrain_test_splitfromsklearn.svmimportSVC# 1. 加载鸢尾花数据集irisload_iris()Xiris.data yiris.target# 2. 划分训练集和测试集X_train,X_test,y_train,y_testtrain_test_split(X,y,test_size0.2,random_state42)# 3. 构建支持向量机模型svm_modelSVC(kernellinear)# 4. 训练模型svm_model.fit(X_train,y_train)# 5. 查看模型效果print(测试准确率,svm_model.score(X_test,y_test))十二、这段代码在做什么这段代码本身不复杂但很适合把前面的概念真正落下来。第一步加载数据这里加载的是鸢尾花数据集X是特征y是类别标签第二步划分训练集和测试集和前面一样训练集用来让模型学习测试集用来检验模型效果第三步构建 SVM 模型这里最关键的一行是svm_modelSVC(kernellinear)这里的kernellinear表示先使用线性核也就是先让模型按“线性分类边界”的思路来做分类。这个写法很适合入门因为它对应的就是最基本的“找线性分界面”的想法。第四步训练模型fit()会让支持向量机根据训练数据去学习分类边界。第五步输出准确率score()会返回模型在测试集上的准确率。所以整段代码完成的事情就是用支持向量机模型在鸢尾花数据集上完成一个三分类任务。十三、如果把 kernel 换掉会发生什么这里顺便提一句SVM 里有一个非常重要的参数kernel它就是前面提到的“核方法”在代码里的体现。比如kernellinear线性核kernelrbf常用的非线性核kernelpoly多项式核如果你把代码改成svm_modelSVC(kernelrbf)那模型处理问题的方式就会更偏向非线性分类。所以kernel这个参数其实对应的就是你想让 SVM 用什么方式去寻找分类边界。入门阶段先记住这一点就够了。十四、支持向量机的优点是什么从整体上看支持向量机之所以经典是因为它在一些场景下确实很有优势。1适合处理小样本问题支持向量机在小样本场景下往往表现不错。2既能处理线性分类也能处理非线性分类这一点非常重要。前面我们已经看到它并不局限于“画一条直线”。3强调泛化能力它不是只追求把训练集分对而是强调找到一个更稳的分类边界。十五、支持向量机的理解难点在哪里SVM 的难点主要不在代码而在概念。比如这些词第一次看都会有点绕支持向量超平面线性可分核方法高维映射所以学 SVM最忌讳的就是一开始就掉进公式堆里。更好的方法是先抓住它最本质的思路它就是在想办法找一个尽量分得好、分得稳的边界。只要这个核心先理解了后面的术语再一点点补就不会那么乱。十六、这一篇最该记住什么学完这一篇建议至少记住下面几个关键点。1支持向量机到底在做什么寻找一个尽量分得开、分得稳的分类边界。2什么是最佳分离超平面能把不同类别分开并且尽量离两边样本都远一点的边界。3为什么它叫支持向量机因为真正决定边界位置的是那些最靠近边界的关键样本也就是支持向量。4为什么会提到高维映射因为有些数据在原空间里不好分映射到更高维后可能更容易分开。5核方法是干什么的帮助 SVM 处理非线性分类问题。十七、结尾总结这一篇文章核心就是想把一个问题讲明白如果分类不是“看谁最像”也不是“一步步问问题”那还能怎么做支持向量机给出的答案是通过寻找一个尽量好的分类边界来做分类。顺着这个思路我们可以得到几个重要认识SVM 是一种既能处理线性也能处理非线性分类的方法它的核心目标是寻找最佳分离超平面它不只是想“分开”而是希望“分得更稳”它通过高维映射和核方法来处理更复杂的分类问题它和前面学过的 KNN、决策树、贝叶斯在思路上完全不同如果前面几篇文章建立的是相似性分类思维规则分类思维概率分类思维组合分类思维那么这一篇真正建立起来的是边界分类思维。而这也正是支持向量机最有代表性的地方。十八、课后思考可以试着回答下面几个问题支持向量机和决策树在分类思路上最大的区别是什么为什么 SVM 不是随便画一条线就行什么叫“最佳分离超平面”支持向量机为什么既能处理线性分类也能处理非线性分类kernel这个参数在代码里代表什么如果这些问题你都能比较顺畅地说清楚那支持向量机这一部分就已经真正入门了。写在最后支持向量机这部分内容第一次学的时候确实比前面的 KNN、决策树更抽象一点。但只要先抓住一个核心SVM 做的事情就是尽量找到一条更好的分类边界。后面的很多术语其实都只是围绕这件事展开的。所以如果你已经读到这里那你对“分类问题到底能怎么做”这件事理解其实已经比刚开始完整很多了。因为你已经看到同样是分类不同算法关心的根本不是同一个东西。

相关新闻