ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

支持向量机原理精讲:从间隔最大化到核函数全面解析

支持向量机原理精讲:从间隔最大化到核函数全面解析 很多人问我机器学习入门最值得把原理原原本本学一遍的模型是什么我的答案一直是支持向量机。它明明只是一个二分类器却把几何间隔、凸优化、对偶理论、核技巧全部串了起来读一遍等于把机器学习里最硬核的几块地基都打了一遍。这篇是模型原理向的第一篇主要把支持向量机从目标函数到对偶问题再到核函数的整条逻辑链走通不打算用“调用一个分类器就完事”来糊弄过去。文章适合三类人刚学完线性代数、想真正理解分类模型的初学者已经在用支持向量机但总被 C 和 gamma 折磨的工程师准备算法岗位面试、需要把推导讲清楚的人。准备好了就开始。1. 一句话看清支持向量机在做什么1.1 分类模型的本质是找一条决策边界支持向量机处理的是监督学习里的分类问题。给定一组样本 ((x_1, y_1), (x_2, y_2), \dots, (x_N, y_N))其中 (x_i) 是特征向量(y_i) 是类别标签在二分类场景下通常取 (1) 和 (-1)。模型要做的是在特征空间里找一个超平面 (w \cdot x b 0)把正样本和负样本分隔开。这里的“超平面”是直线在高维空间的推广二维是一条线三维是一个平面更高维就没办法直观画出来了。分类时把样本代入 (w \cdot x b)结果大于 0 判成正类小于 0 判成负类。所以支持向量机最核心的问题只有一个这个超平面应该放在哪里。你可能觉得分对了不就行了问题是能把训练数据分对的超平面通常有无数个。稍微挪动一点点依然能让所有样本都分对但新的边界对没见过的数据可能完全不友好。支持向量机要做的就是从这无数个可行解里挑一个最稳的。1.2 支持向量少数样本决定最终模型“支持向量”这四个字点出了模型最本质的特征最终影响边界的只是训练集里极少一部分样本。这些样本位于决策边界附近是“最难分”的那批点。只要它们的位置固定其他样本无论怎么变化只要不越过边界模型都不受影响。可以这样类比一场考试划奖学金线真正决定分数线的是排名刚好卡在名额边缘的那几位同学。前几名考了多高的分其实不影响奖学金线但边缘同学的分数一旦变化奖学金线就会被推动。支持向量机里的支持向量就是这些“卡线”的样本。这个特性带来两个直接好处第一训练完成后模型只需要保存支持向量不需要保存整个数据集预测阶段的内存和计算量都大幅下降第二模型不容易被距离边界很远的样本干扰鲁棒性比“每个样本都参与决策”的模型更好。这一点也是支持向量机和逻辑回归最明显的差异逻辑回归对所有样本做概率建模每个样本都会拉动决策边界。1.3 间隔最大化为什么“分对”还不够支持向量机追求的不只是把所有训练样本分对还要让决策边界离最近的样本尽量远。这个“最近的样本到边界的距离”就是间隔。为什么要最大化它因为间隔越大分类器的“安全余量”越大。真实世界的数据总是带噪声的训练样本稍微偏移一点一条贴着样本的边界就可能立刻出错而一条离样本足够远的边界抗干扰能力明显更强。统计学习理论也为间隔最大化提供了支撑对线性分类器来说间隔越大泛化误差的上界越小。也就是说最大化间隔不仅是一个几何上的直觉还是一个有理论保证的行为。后面所有数学推导本质上都在围绕“如何把这个间隔最大化的想法写成可求解的优化问题”展开。2. 从直觉到数学间隔最大化到底在优化什么2.1 函数间隔与几何间隔两个容易混淆的定义在推导支持向量机时会遇到两个名字很像的概念函数间隔和几何间隔。函数间隔的定义是 (\hat{\gamma}_i y_i(w \cdot x_i b))。乘上 (y_i) 的原因很直接如果分类正确(w \cdot x_i b) 和 (y_i) 同号乘积为正分类错误乘积为负。所以函数间隔的符号能反映样本是否被分对这一点比较好用。但函数间隔有一个致命问题它不能衡量“距离”。如果把 (w) 和 (b) 同时放大两倍超平面本身一点没变分类规则也没变函数间隔却变成了原来的两倍。这说明函数间隔的值受参数尺度影响不能直接用来描述样本到平面的远近。几何间隔的定义是 (\gamma_i \frac{y_i(w \cdot x_i b)}{|w|})。分母上的 (|w|) 把参数的缩放影响消掉了这时几何间隔对应的才是样本到超平面的带符号欧氏距离。支持向量机要最大化的是这个几何间隔而不是函数间隔。2.2 从间隔到目标函数(1/2|w|^2) 怎么来的因为函数间隔可以随意缩放直接优化几何间隔会遇到一个尺度漂移的问题你可以把 (w) 任意缩小让几何间隔变得非常大但超平面的方向其实完全没变这种“变大”没有意义。所以必须先把尺度固定住。支持向量机的做法是令距离超平面最近的那个样本的函数间隔等于 1。也就是说对所有样本要求y_i(w · x_i b) ≥ 1在这个约束下最近样本的几何间隔恰好等于 (1/|w|)。最大化几何间隔等价于最大化 (1/|w|)也等价于最小化 (|w|^2)。为了方便求导通常写成最小化 (\frac{1}{2}|w|^2)。于是原始问题变成一个标准的凸二次规划min 1/2 ||w||^2 s.t. y_i(w · x_i b) ≥ 1, i 1, ..., N为什么强调它是凸问题因为凸优化没有局部最优解这个坑目标函数是二次的、约束是线性的可行域是凸集因此找到的解一定就是全局最优。这一点让支持向量机在优化上非常干净也是它能被大规模应用的重要原因。2.3 固定函数间隔为 1 的尺度约定很多人第一次看支持向量机推导会在“为什么约束写成 ≥ 1”这里卡住。其实这个 1 不是一个强行的魔法数字而是一个尺度约定。因为超平面 (w \cdot x b 0) 和 (2w \cdot x 2b 0) 表示的是同一个决策面所以参数的绝对大小本来就没有固定含义。我们利用这种自由度把所有样本的函数间隔下限统一压到 1相当于给参数定了一个标尺。这个约定带来的效果是(w) 的模长 (|w|) 成了间隔的倒数。模长越小间隔越大模长越大间隔越小。于是“最大化间隔”被转化成了“最小化模长”而“样本要分对且留有余量”被写成了线性约束。理解了这个尺度约定后面看 KKT 条件时就不会觉得突兀。2.4 决策函数模型实际存什么超平面确定后分类决策函数就是f(x) sign(w · x b)在线性支持向量机中通过求解对偶问题可以得到 (w \sum_{i} \alpha_i y_i x_i)。把 (w) 代回决策函数就会发现真正参与预测计算的只有那些 (\alpha_i \neq 0) 的样本也就是支持向量。其他样本的 (\alpha_i) 都是 0它们在预测阶段完全不会出现。所以支持向量机训练完成后模型里保存的并不是“一整条超平面方程然后用全部数据更新”而是一小撮支持向量和它们对应的权重。这个稀疏性在部署时很值钱尤其是在嵌入式设备或者接口服务里需要控制模型体积的场景。3. 对偶问题为什么非要把原始优化变个形3.1 直接优化原始问题的瓶颈原始问题是以 (w) 和 (b) 为变量的优化问题变量数量等于特征维度加 1。如果特征维度很高比如文本处理中动辄几十万维直接拿通用二次规划求解器去优化原始问题计算量会非常夸张。对偶问题的变量数是 (\alpha_1, \alpha_2, \dots, \alpha_N)恰好等于训练样本数。当样本数远小于特征维度时对偶问题的规模比原始问题小得多。反过来当样本数很大时对偶问题又变得很难处理。所以支持向量机其实存在两种形态线性支持向量机在样本量大时用专门方法求解原始问题非线性支持向量机在对偶问题上做文章。理解这一点后面看工业实现时会清楚很多。3.2 拉格朗日乘子法推导过程把原始问题加上拉格朗日乘子 (\alpha_i \geq 0)构造拉格朗日函数L(w, b, α) 1/2 ||w||^2 - Σ α_i [ y_i(w · x_i b) - 1 ]对 (w) 求偏导并令其等于 0得到w Σ α_i y_i x_i对 (b) 求偏导并令其等于 0得到Σ α_i y_i 0把这两个结果代回拉格朗日函数(w) 和 (b) 会被消掉剩下的函数只含 (\alpha)。原来的问题是先对 (w, b) 做最小化再对 (\alpha) 做最大化消元之后它就变成了一个纯粹关于 (\alpha) 的最大化问题。这段推导是支持向量机最核心的手推内容面试时也经常被要求现场写。建议不要只背结论自己拿纸笔推一遍把每一步为什么能消元搞清楚。3.3 对偶目标函数长什么样消元之后得到的对偶问题如下max Σ_i α_i - 1/2 Σ_i Σ_j α_i α_j y_i y_j (x_i · x_j) s.t. α_i ≥ 0 Σ_i α_i y_i 0这是一个变量数为 (N) 的二次规划。最值得注意的地方是样本 (x_i) 和 (x_j) 在目标函数里永远以内积 (x_i \cdot x_j) 的形式出现。这个“内积形式”是整个核技巧的伏笔后面能不能处理非线性问题靠的就是把这个内积替换成核函数。从矩阵视角看可以定义矩阵 (Q_{ij} y_i y_j (x_i \cdot x_j))那么目标函数就是 (\sum \alpha_i - \frac{1}{2} \alpha^T Q \alpha)。矩阵 (Q) 是半正定的所以对偶问题同样是凸优化。3.4 KKT 条件支持向量的数学标志原始问题和对偶问题要想有相同的解必须满足 KKT 条件。其中最关键的一条是互补松弛条件α_i [ y_i(w · x_i b) - 1 ] 0这个等式带来一个非常漂亮的结论如果 (\alpha_i 0)那么括号里的值必须等于 0也就是说样本 (x_i) 正好落在函数间隔等于 1 的边界上它就是支持向量如果样本远离边界括号里的值大于 0为了让等式成立(\alpha_i) 必须等于 0。所以“支持向量”不是一个人为圈定的概念而是优化问题解完之后自然浮现出来的样本集合。这也是为什么支持向量机的名字起得极其精准真正撑住决策边界的就是那一小撮样本。3.5 对偶问题带来的两个工程收益对偶化至少带来两个实实在在的收益。第一核函数可以无缝嵌入。既然目标函数里只有内积 (x_i \cdot x_j)那直接把内积替换成核函数 (K(x_i, x_j))就能在高维特征空间中做线性分类而实际计算量没有明显增加。这个收益在下一节展开。第二当特征维度远大于样本数时对偶问题的规模远小于原始问题。比如有 1000 个样本、100 万维特征原始问题要解 100 万个变量对偶问题只需要解 1000 个变量。这种场景下对偶形式就是救命的。不过对偶也不是没有代价。它的优化难度和样本数强相关当样本量到百万级别时(N \times N) 的核矩阵根本存不下来。所以在工业级的线性分类场景里大家反而更愿意回到原始问题用专门为线性支持向量机设计的优化器。4. 软间隔数据不干净才是常态4.1 硬间隔的短板离群点会带崩边界前面推导的硬间隔支持向量机要求所有训练样本都满足 (y_i(w \cdot x_i b) \geq 1)一个都不允许放行。这个要求看上去很美但现实数据里几乎不存在严格线性可分的情况。就算存在也可能是噪声样本碰巧把空间切开了硬间隔会让边界变得极其敏感。举例来说数据里有一个点明显是标注错误落到了对方阵营里。硬间隔为了满足所有约束会把决策边界强行拉向这个异常点边界变得扭曲泛化能力急剧下降。这个问题不解决支持向量机就没法在真实项目里使用。4.2 松弛变量和目标函数的变化软间隔的做法是给每个样本引入一个松弛变量 (\xi_i \geq 0)允许样本突破“函数间隔至少为 1”的约束突破多少惩罚多少。约束变成y_i(w · x_i b) ≥ 1 - ξ_i目标函数变成min 1/2 ||w||^2 C Σ_i ξ_i这里的 (C) 是惩罚系数。(\xi_i) 的含义可以拆开看等于 0 时样本在正确位置且留有足够间隔大于 0 但小于 1 时样本落进了间隔带里但分类还是对的大于等于 1 时样本已经被错误分类。所以软间隔并不是放弃约束而是允许约束以一定的代价被违反。4.3 等价损失视角合页损失与正则化把软间隔的约束写进目标函数可以得到一个非常直观的等价形式min 1/2 ||w||^2 C Σ_i max(0, 1 - y_i(w · x_i b))第二项就是著名的 hinge loss中文常叫合页损失。它的行为很特别当 (y_i(w · x_i b) \geq 1)损失直接归零当样本落在间隔带内或分错时损失随着距离线性增长。对比逻辑回归里的对数损失合页损失更“克制”。逻辑回归的每个样本只要不是无穷远都会持续对模型产生影响合页损失则对已经分得足够好的样本完全放手。这正好解释了支持向量机为什么天然稀疏只要样本离边界足够远它对模型不再有任何拉动作用。从正则化的角度理解第一项 (\frac{1}{2}|w|^2) 是结构风险项第二项 (C \sum \xi_i) 是经验风险项。(C) 本质上就是这两者之间的天平它控制的是“你要更平滑的边界还是更少训练错误”。4.4 C 值怎么选交叉验证的方法(C) 的理论取值范围是 ((0, \infty))实际调参时按数量级去扫比较高效。常见的做法是先跑一轮对数网格比如 0.01、0.1、1、10、100找到表现比较好的区间再在最优值附近加密网格做细调。选 (C) 不能靠单次训练集精度判断最好用交叉验证。观察验证曲线时有个常见规律(C) 增大训练集精度持续上升验证集精度通常先升后降开始下降的那个点往往就是过拟合的起点。如果验证曲线一直上涨不下降说明问题可能不在 (C)而在核函数参数或特征预处理上不要盲目继续加大 (C)。5. 核函数支持向量机如何做到非线性5.1 线性不可分先升维再看有些数据在原特征空间里就是线性不可分的比如二维平面上的同心圆分布一类在里圈一类在外圈任何直线都切不开。但如果在原始特征上增加一个“半径”特征把二维点映射到三维让内圈的点半径小、外圈的点半径大那么一个平面就能把它们分开。这就是处理非线性问题的核心思路把原始特征映射到更高维的空间在高维空间里做线性分类回到原空间就变成了非线性边界。问题是手工设计高维映射非常困难而且特征空间可能高到无法想象直接显式计算映射后的向量根本不现实。5.2 核技巧不用展开高维特征的“查书函数”对偶问题里有一个幸运的结构样本 (x_i) 和 (x_j) 永远以内积 (x_i \cdot x_j) 的形式出现。如果映射是 (\phi(x))那么高维空间里的内积是 (\phi(x_i) \cdot \phi(x_j))。核技巧要做的事情就是直接定义一个函数K(x_i, x_j) φ(x_i) · φ(x_j)然后把这个函数值代入对偶目标替换掉内积。整个过程完全不需要显式算出 (\phi(x))。这里可以用一个类比来理解你不需要把一整本书的内容都背下来只需要一个能快速查询问题答案的工具核函数就是那个工具。它告诉你两个样本在高维空间的内积是多少却不告诉你高维向量长什么样。RBF 核更夸张它对应的特征空间是无穷维的。如果要求先算出无穷维向量再做内积那计算量是不可能完成的但直接用 (\exp(-\gamma|x - z|^2)) 计算却非常简单。这就是核技巧被称为“技巧”的原因它让不可能的计算变成了几行公式。5.3 常用核函数怎么选实际工程中最常见的核函数有四个核函数表达式适用场景注意点线性核(x_i \cdot x_j)特征维度很高、样本量很大、文本类数据最快可解释性强多项式核((\gamma x_i \cdot x_j r)^d)对特征交互阶数有先验时参数多易数值不稳定RBF 核(\exp(-\gamma|x_i - x_j|^2))中小规模结构化数据默认首选(\gamma) 对结果影响很大sigmoid 核(\tanh(\gamma x_i \cdot x_j r))偶尔使用可能不满足正定性容易失效一个比较稳妥的选择顺序是先试线性核如果效果不够好再试 RBF 核。数据规模很大或特征已经非常稀疏时线性核通常又快又够用数据规模适中、特征稠密且有非线性关系时RBF 核更能发挥核技巧的威力。5.4 gamma 参数RBF 的“作用半径”RBF 核的公式里(\gamma) 决定了每个样本影响的“半径”。(\gamma) 越大(\sigma) 越小样本的影响范围越窄每个支持向量都只在很小范围内起作用决策边界会变得非常曲折容易过拟合(\gamma) 越小样本的影响范围越宽边界越平滑但过小了会把两类样本合并成一个大面团造成欠拟合。如果把特征标准化到均值 0 方差 1一个常用的起点是 (\gamma 1/\text{特征维度})但这只是个起点不是最优值。实际调参时人们常把 (\gamma) 和 (C) 放在一起做网格搜索比如 (C \in {0.1, 1, 10, 100})(\gamma \in {0.001, 0.01, 0.1, 1})。这两个参数是联动的单独调一个往往找不到好点。5.5 Mercer 条件并不是任何相似度都行不是随便定义一个相似度函数就能当核函数用。核函数要成立需要满足 Mercer 条件通俗地说就是对任意一组样本核矩阵 (K_{ij} K(x_i, x_j)) 必须是半正定的。只有半正定才能保证它等价于某个高维空间里的内积也才能保证优化问题仍然是凸的。如果你试着自定义核函数比如用某种自定义距离构造相似度必须小心。一个不满足 Mercer 条件的核轻则优化不收敛重则结果完全没意义。工程上如果没有充分验证尽量不要自己发明核函数。经典核函数经过大量实践检验比新造一个轮子靠谱得多。6. 从推导到实现支持向量机是怎么解出来的6.1 SMO 求解思路两个 α 一个子问题对偶问题虽然是一个凸二次规划但直接用通用 QP 求解器处理大规模数据仍然太慢。SMO序列最小优化算法的核心思想非常巧妙每次只挑两个变量 (\alpha_i) 和 (\alpha_j) 来优化其他变量全部固定。为什么要挑两个而不是一个因为对偶问题里有一个线性约束 (\sum \alpha_i y_i 0)如果只改一个变量约束必然被破坏。改成两个之后当一个变量变化时另一个变量可以根据约束自动调整保持等式成立。两个变量的子问题可以用解析方法直接求解不需要迭代数值优化。外循环负责挑一个最违反 KKT 条件的样本内循环负责挑一个能和它形成最大优化步长的样本。SMO 在绝大多数情况下不需要像通用 QP 那样存下整个核矩阵内存占用小速度也快。这也解释了为什么支持向量机能在个人电脑上处理几万条样本。6.2 一套可复用的支持向量机训练流程工程实现上无论用什么工具库流程基本一致。下面是一个接口示意具体方法名以你使用的库为准scaler Scaler() X_train_norm scaler.fit_transform(X_train) X_test_norm scaler.transform(X_test) model SVCClassifier(kernelrbf, C1.0, gammascale) model.fit(X_train_norm, y_train) print(train_acc, model.score(X_train_norm, y_train)) print(test_acc, model.score(X_test_norm, y_test)) print(support_vectors_count, len(model.support_vectors_))流程拆开看先标准化特征再初始化模型然后在标准化后的数据上训练最后还要看一个容易忽略的指标——支持向量数量。如果支持向量数量几乎等于训练样本数说明模型边界非常扭曲这是过拟合的警报。6.3 特征预处理支持向量机比很多模型都敏感支持向量机对特征尺度非常敏感这一点比树模型要明显得多。因为它的核心运算是内积和距离如果某个特征的量纲特别大比如收入从 0 到 100000而年龄从 0 到 100那么在计算距离时收入特征会完全主导结果年龄特征相当于被无视了。所以用支持向量机之前特征标准化是默认动作。最常用的方法是 Z-scorex_new (x - mean) / std把每个特征变成均值 0、方差 1。对稀疏特征场景比如 TF-IDF 之后的文本向量是否标准化要看具体情况但如果要用 RBF 核一般还是建议做归一化处理否则 (\exp(-\gamma|x - z|^2)) 中的距离很可能被某些异常大值带偏。6.4 多分类一对多与一对一的取舍支持向量机天然是二分类器处理多分类时需要把多个二分类器组合起来。常见策略有两种一对多one-vs-rest训练 (K) 个分类器每个分类器负责区分“第 k 类”和“其他类”一对一one-vs-one训练 (K(K-1)/2) 个分类器每两个类别之间训练一个最后投票决定结果。一对一策略在小类别数下效果稳定但类别一多模型数量会爆炸。比如 10 个类别就要训练 45 个分类器20 个类别要训练 190 个。一对多策略模型数量少但每个分类器面对的正负样本比例可能严重失衡。实务中类别数不大时可以用一对一类别很多时优先考虑一对多。6.5 距离不是概率概率校准是怎么回事支持向量机给出的决策值 (w \cdot x b) 是样本到超平面的距离它反映的是“离边界多远”并不是“属于正类的概率有多大”。如果需要概率输出通常会做一层校准最常见的是 Platt 缩放在决策值上训练一个逻辑回归把距离映射到 ((0, 1)) 区间。校准的过程必须额外小心如果直接用训练数据来拟校准器会严重过拟合得到非常自信的错误概率。正确做法是用交叉验证得到的决策值来训练校准器或者预留一部分数据。记住一个前提支持向量机校准后的“概率”只是决策值的单调映射并不是贝叶斯意义上的真实概率对比置信度时要留个心眼。7. 调参与避坑支持向量机项目落地记录7.1 高维稀疏数据别上来就 RBF我踩过的第一个坑就是在高维稀疏特征上直接用 RBF 核。当时做一个文本分类任务TF-IDF 之后特征维度到了几十万样本量几万。RBF 核训练非常慢核矩阵计算量巨大最后的准确率也没有比线性核高出哪怕一个百分点。这类数据的特征空间本来就已经很高维线性核往往够用强行再套 RBF 等于叠床架屋。换成线性核之后训练时间大幅下降模型体积也更小。所以“默认用 RBF”成立的前提是低维稠密的结构化数据而不是高维稀疏文本数据。7.2 训练集满分验证集掉分C 和 γ 的联动调试一个手写数字识别小项目时出现过训练集准确率接近 100%、验证集准确率掉到 80% 的情况。检查之后发现罪魁祸首是 (\gamma) 设得太大。RBF 核的 (\gamma) 过大每个样本都只影响自己周围很小的区域决策边界像一朵带刺的花紧贴着训练点走训练集自然几乎满分泛化自然很差。处理办法是同时降低 (\gamma) 和 (C)。(\gamma) 让边界变平滑(C) 减少对训练误差的过分执着。调整之后验证集准确率回到 94% 左右。这个案例说明看到过拟合不要只想到调小 (C)(\gamma) 对 RBF 影响往往更直接。7.3 类别不平衡支持向量被多数类淹没当正负样本比例严重失衡时支持向量机的表现会非常糟糕。原因很直观目标函数里所有样本的松弛变量求和多数类的错误会占大头模型只要把所有样本都判成多数类总损失就很小。少数类样本几乎没有机会成为支持向量边界自然偏向多数类。对策有三种一是给少数类样本更高的权重相当于放大它的 (C)二是对少数类做过采样比如人工合成新的少数类样本三是改用专门的代价敏感学习。评估指标上别只看准确率这种情况要特别关注精确率、召回率和 F1。准确率在这个场景下会欺骗人。7.4 训练时间与内存什么时候支持向量机不合适当样本量达到几十万甚至上百万支持向量机的训练时间和内存消耗会明显吃紧。原因在于对偶问题要处理 (N \times N) 的核矩阵百万样本的核矩阵几乎不可能完整放进内存。这种情况下有几种退路使用线性核加专门优化器训练成本比非线性核低很多对样本做随机采样先在小数据集上验证效果或者先用特征降维把维度压下来再用 RBF。如果问题规模还是太大就要考虑换成更适合大数据的模型了。支持向量机的优雅和它的代价是并存的不存在万能模型。7.5 支持向量占比过高的排查训练结束后多看一眼支持向量数量占样本总数的比例是一个好习惯。如果这个比例接近 100%说明模型基本把训练集全背下来了边界非常复杂泛化能力值得怀疑。常见原因包括 (C) 太大、(\gamma) 太大、数据噪声过多或者当前数据根本不适合用这个模型。排查顺序建议是先调小 (C)再调小 (\gamma)如果效果不明显检查训练数据里有没有大量边界纠缠的样本。也可以用线性核对同一份数据做个对比如果线性核效果差不了太多那优先选线性核模型越简单越不容易出事。8. 常见问题与排查速查8.1 常见问题排查速查表现象可能原因处理办法训练集准确率高验证集掉分过拟合(\gamma) 或 (C) 偏大降低 (\gamma)调小 (C)检查支持向量占比训练集和验证集都低欠拟合模型太弱提高 (\gamma) 或 (C)检查特征标准化训练非常慢样本多核矩阵太大换线性核、采样、降维支持向量数量几乎等于样本数边界过拟合参数过大调小 (C)、(\gamma)清洗噪声预测结果几乎全是多数类类别不平衡设置类别权重少数类过采样概率输出偏高且不靠谱概率校准过拟合交叉验证拟合校准器内存不足核矩阵无法加载线性核、分块计算、降维自定义核表现极差核函数不满足条件回到经典核函数8.2 一个更省事的实践顺序如果你想快速跑出一个能用的支持向量机模型我建议按这个顺序操作先做特征标准化。然后根据数据规模选核函数样本量小、特征稠密用 RBF样本量大或特征稀疏用线性核。初始化参数时(C) 取 1(\gamma) 取1/特征维度。跑一个交叉验证网格重点看 (C) 和 (\gamma) 的交互。模型训练好之后检查支持向量占比同时回忆一下类别是否均衡如果不均衡给少数类加权重并换用 F1 评估。这几步看起来简单但能解决八成以上的支持向量机实战问题。至于那些数学推导它们会在你真正需要调参、解释模型、设计核函数的时候变成最重要的底气。最后说点个人经验。我做了不少支持向量机相关的实验最深的体会是它的数学证明很漂亮但真正让它在工程里有效的往往不是边界公式本身而是数据预处理、参数耦合和类别结构。调参时不要一上来就扫大网格先把数据标准化、选对核类型再去看 (C) 和 (\gamma) 的交互。支持向量占比和验证集精度一样是需要一直盯着的指标。按这条思路走一遍大多数坑都能提前避开。
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表