我们依次分享了 随机森林、GBDT、XGBoost 这些基于树的集成模型,它们在处理大规模数据时,往往表现出了极强的预测能力和泛化性能。
但是在生信数据中,树模型未必是最优解,今天分享一个经典模型—— 支持向量机(Support Vector Machine, SVM)
SVM 的核心思想非常直观:找到一条能够 最大化类别间间隔(margin) 的超平面,并通过 核函数(Kernel trick) 将非线性问题映射到高维空间,从而实现线性可分。很适合解决“小样本,高维度”数据的分类问题
原理详解
Step1:线性可分的超平面
假设我们有两类样本(红色点和蓝色点),SVM 的目标是找到一个 能够最大化类别间间隔(margin) 的超平面:


分类规则为:

Step2: 最大化间隔(Margin)
SVM既要正确分类所有点,又要最大化两类样本到超平面的间隔,于是我们定义:
距离超平面最近的点 → 支持向量
这些点到超平面的距离,就是 间隔 (Margin)
而单个支持向量到超平面的距离为1/||w||,所以总间隔(Margin) = 两边加起来:

优化问题写成:

Step3: 软间隔(Soft Margin)
现实数据往往不能完全分开,如果强制所有点都分对,就会导致边界被“奇怪的点”拖歪,模型过拟合。
于是我们引入 松弛变量 ξ,允许少量点分错,并用 C 来控制“分错点的惩罚力度”。

C(惩罚系数)
C 大:强制分类正确,间隔可能变小 → 容易过拟合。
C 小:允许少量错误,间隔更大 → 泛化更好。
Step4: 核函数(Kernel Trick)
当样本在原始空间不可分时,可以通过核函数把数据“升维”,在高维空间里再拉直线,核函数的核心就是,不是真的算高维坐标,而是直接用核函数来计算两个点在高维空间的相似度。
常见核函数有下面几种:
线性核:高维稀疏数据(如基因表达谱)。
RBF 核:万能核,适合非线性复杂关系(常用在甲基化、蛋白质组学)。
-
多项式核:适合存在交互作用的特征。
以RBF 核 (Radial Basis Function, 高斯核)为例:

γ(gamma)参数:
γ 大:模型复杂,两个点只要距离稍微远一点,核值就接近 0,即每个点影响范围小,模型容易过拟合。
γ 小:即使两个点距离比较远,核值也还不小,即每个点影响范围更大,模型更平滑,泛化能力强。
代码实现

横轴 (Sigma)
RBF 核的参数,值越大 → 决策边界越曲折;值越小 → 决策边界越光滑。
纵轴 (ROC Cross-Validation)
用交叉验证计算的平均 ROC AUC。
不同颜色/线条 (Cost)
图例里的 0.01, 0.1, 1, 10, 100 是 C(惩罚系数)。
library(caret)library(kernlab)#十折交叉ctrl <- trainControl(method = "cv", # 单次 k 折交叉验证number = 10, # 10 折classProbs = TRUE, # 启用概率输出(评估ROC需要)summaryFunction = twoClassSummary, # 使用ROC、敏感度、特异度作为指标savePredictions = "final" # 保存最优模型下的预测结果)#提前输入参数sig <- as.numeric(kernlab::sigest(X))[2] # 中位数估计grid <- expand.grid(C = 10^seq(-2, 2, by = 1), # 0.01~100sigma = sig * c(0.25, 0.5, 1, 2, 4) # 围绕估计值搜索)# 训练set.seed(123)svm_rbf_fit <- train(x = X, y = y, # 特征矩阵method = "svmRadial", # 使用 SVM + RBF核metric = "ROC", # 用 ROC AUC 作为调参的指标trControl = ctrl, # 交叉验证的控制参数preProcess = c("center", "scale"), # 预处理:中心化、标准化tuneGrid = grid # 自定义超参数网格 (C 和 sigma))svm_rbf_fit # 查看最优参数与CV表现plot(svm_rbf_fit) # 不同(C, sigma)下的ROC对比