支持向量机分类(SVM)
这个方法是做什么的
支持向量机找的是一张把两类分开、且离两边最近的样本尽可能远的判别面;决定这张面的只有边界附近那几个“支持向量”,离得远的样本挪一挪完全不影响结果。线性分不开时,核函数把样本映射到更高维的空间,在那里再找一张平面,映回原空间就成了一条曲线边界。惩罚系数 C 控制对越界样本的追究力度,核函数与 gamma 一起决定边界能弯到什么程度。因变量是定类列,自变量可含定量与定类,定类列在管线内独热编码;报告不给系数,也不给任何自变量的 p 值。
报告共五张卡:卡① 建模设置与八项体检,卡② 分层 5 折交叉验证主结果与无信息率检验,卡③ 四张效果图,卡④ 效应量区间与置换重要性,卡⑤ 论文表述。本模块有一处别的模块没有的中间层:支持向量机本身不输出概率,它给的是“离判别面多远”。而卡② 的 ROC-AUC、PR-AUC 和卡③ 的两条曲线都需要概率,所以引擎打开了 Platt 校准——在每个训练折内再做一次内部交叉验证,拟合一条把距离转成概率的 S 形曲线。于是混淆矩阵来自判别面本身,AUC 与曲线来自这层二次拟合;实测这两条路径在演示数据的 240 例折外预测上判定完全一致,没有一例分歧。
需要准备什么数据
- 放入因变量Y:不限
- 放入自变量X:至少 1 个
数据要求
- 数据表至少 30 行。
- 单列缺失率不超过 20%。
- 不接受取值全都一样的列(零方差列没有可分析的变异)。
- 「放入因变量Y」的类别数需在 2~20 之间。
- 「放入因变量Y」的每一组至少 5 个样本。
以上条目由系统从该方法的校验规则直接生成,与上传数据时的实际拦截规则一致。
什么时候用它
- 中小样本(几十到几千行),自变量个数不多且都经过挑选
- 类别边界是弯的但整体光滑,不需要树那样的阶梯状分块
- 边界附近的少数样本才是关键,远处的样本你不希望它们左右结论
- 需要一个与树集成思路完全不同的对照结果,用来判断结论稳不稳
前提:因变量是定类列,2~20 个类别、每类至少 5 例;整表至少 30 行,含缺失的整行剔除。本模块对特征尺度敏感——量纲大的一列会独占间隔的计算,卡① 表3 的“特征尺度差异”行显示演示数据里最大与最小标准差相差 32.22 倍,管线已在每个训练折内做 Z 标准化把它抹平。另有一条压在上限的约束:训练复杂度随样本量超线性增长,上万行起会明显变慢。
什么时候不要用它
- 因变量是连续数值:用「支持向量回归(SVR)」。
- 要报告每个自变量的效应方向、大小与显著性:本模块没有系数表,即使选 linear 核也没有;二分类结局用「逻辑回归」,结局有序用「有序逻辑回归」。
- 样本上万行起:训练时间随样本量超线性增长,等不起;改用为大样本设计的「LightGBM分类」。
- 自变量里有类别数很多的定类变量:独热后大量 0/1 列会稀释核函数算出的距离,效果明显下降;这种数据交给按变量逐层切分的「随机森林分类」。
- 要把预测概率当成风险数值直接报出去:那层概率是二次拟合出来的,用之前必须先验校准,用「校准曲线」。
- 观测之间不独立(同一对象多期、机构内嵌套):同一个体的记录会分别落进训练折与验证折,判别面等于事先见过答案,成绩虚高;用「面板模型」或「混合模型」。
容易误读的地方
- 在演示数据上默认的 rbf 核不是表现最好的那个,而“哪个最好”其实分不出来。 四个核各跑一遍,交叉验证 Accuracy 分别是 poly 0.7792、linear 0.7708、rbf 0.7375、sigmoid 0.7250,κ 依次为 0.5562、0.5410、0.4740、0.4498——默认排第三。但四者的 95%CI 大幅重叠(linear 的 [0.7299, 0.8117] 直接盖住了 rbf 的点估计),差距落在折与折之间的波动里。照均值排名挑核,挑到的多半是分折的运气。 真要选核,得有一批独立数据复核。
- gamma 的两个选项在自变量全是定量列时是同一个数。 实测把 gamma 从 scale 改成 auto,表4 的每一位数字都不变(Accuracy 0.7375、κ 0.4740)。原因在管线:定量列被标准化成方差 1,于是 scale=1/(特征数×方差) 与 auto=1/特征数 相等。一旦拖入一个定类自变量,独热出来的 0/1 列不参与标准化,方差不再是 1,两档才真的分开——实测加一个四水平定类变量后,scale 给 0.7500、auto 给 0.7583。
- 表8 里出现了 95%CI 整体小于 0 的变量,这是一个明确信号。 本次“促销折扣力度(%)”的 ΔF1=−0.0364、95%CI[−0.0538, −0.0190],判定“未见正贡献”——把这一列打乱,模型在留出的 48 例上稳定地更准了。它的含义不是“这个变量与结局无关”(卡① 不做这个检验),而是“模型在这一列上学到的是训练样本里的偶然模式”。看到区间整体在 0 以下,应当考虑把该列拿掉重跑,而不是把它写进结论。
- C 既不是越大越好也不是越小越好,而产品没有网格搜索。 实测 C=0.1 / 1 / 100 的交叉验证 Accuracy 是 0.7458 / 0.7375 / 0.7292,κ 是 0.4911 / 0.4740 / 0.4573,默认的 1 落在中间。核函数、C、gamma 三者要一起定才有意义,只能手工改一个、重跑、比表4。这里有个容易忽略的坑:用交叉验证均值反复挑参数,挑出来的那个数字本身已经乐观了,因为选择和评估用的是同一批数据——卡⑤ 最后一条提示写着“若在同一数据上反复调参并挑选最优结果,交叉验证性能会被乐观偏倚”。
- 这里的概率天生就“不敢说满”,别拿它跟树模型的概率比数值。 演示数据 240 例折外预测里,最大类概率的均值是 0.7751、中位 0.8115、最小 0.5000,没有一例超过 0.99。Platt 校准拟合的是一条平滑的 S 形曲线,端点本来就压得紧。这一层保证的是排序(所以 ROC-AUC 可用),至于“0.78 是不是真的对应 78% 的把握”,得另外验——报告里没有校准图。
报告里有什么
- 输出结果一:数据概览与前提检验
- 输出结果二:交叉验证性能主结果表
- 输出结果三:分类效果可视化
- 输出结果四:效应量与事后分析
- 输出结果五:结论与学术表述
卡③ 全部基于交叉验证折外预测绘制:混淆矩阵与曲线所用的预测都来自模型未见过该样本的那一折,不是训练集回代结果。