趋近智
支持向量机(SVM)是一类多功能且强大的监督学习算法,用于分类和回归任务,尽管它们最常与分类相关联。支持向量机背后的基本思想是找到一个最优超平面,它能在特征空间中最佳地分离属于不同类别的数据点。这种“最优性”是通过最大化边距来实现的,边距是超平面与任何类别最近数据点之间的距离。这些最近的点被称为支持向量,因为它们是支持或定义超平面的核心元素。
支持向量机在高维空间中特别有效,即使维度数量大于样本数量,它们也能表现良好。它们还通过使用不同的核函数提供了灵活性,使其能够对非线性决策边界进行建模。
在查看 Julia 实现之前,我们先巩固几个核心思想:
下图显示了支持向量机模型中涉及的主要组成部分:
上图显示了输入数据、支持向量机的目标以及超平面、支持向量、边距和核函数等主要组成部分之间的关系。
在 Julia 中,支持向量机实现可通过外部包获得,并且 MLJ.jl 提供了一致的接口来使用它们。提供支持向量机最常用的包是 LIBSVM.jl,它是广泛使用的 LIBSVM C++ 库的封装。您通常会通过 MLJLIBSVMInterface.jl 与它交互。
我们来一步步实现一个用于分类任务的支持向量机。
首先,请确保您已拥有必要的包。如果您的 Julia 环境中尚未安装 MLJLIBSVMInterface,您需要添加它:
# 在 Julia REPL 中,按 ']' 进入 Pkg 模式
# pkg> add MLJLIBSVMInterface
# 按 Backspace 退出 Pkg 模式
现在,我们来设置我们的 Julia 脚本:
using MLJ
using DataFrames, Random, StableRNGs
# 从 MLJLIBSVMInterface 加载支持向量分类器 (SVC) 模型类型
# modest=false 返回模型类型本身,而不是实例。
SVC = @load SVC pkg=LIBSVM modest=false
# 对于专用线性支持向量机,如果数据线性可分离,它会更快:
LinearSVC = @load LinearSVC pkg=LIBSVM modest=false
# 为了结果可复现,使用一个稳定的 RNG
rng = StableRNG(123)
# 生成用于分类的合成 2D 数据
# X 将是特征,y 将是分类标签
X_raw, y = make_blobs(150, 2; centers=2, cluster_std=0.9, rng=rng, as_table=false)
X = DataFrame(X_raw, :auto) # 将数据转换为 DataFrame 以供 MLJ 使用
make_blobs 函数生成各向同性高斯斑点,用于聚类或分类。在这里,我们正在二维空间中创建两组不同的点。下图显示了此类生成数据的一个示例。
一个包含两个不同类别的合成 2D 数据的散点图,适用于训练支持向量机分类器。
如果您怀疑数据是线性可分离的,或者需要一个基准,那么线性核函数是一个不错的开始。LinearSVC 为此进行了优化,但您也可以将 SVC 与线性核函数一起使用。
# 实例化一个线性支持向量机模型
# LinearSVC 对于线性问题通常更快。
# 它内部使用 LIBSVM 的线性求解器。
linear_svm_model = LinearSVC(cost=1.0) # 'cost' 是 C 参数
# 或者,使用 SVC:
# linear_svm_model = SVC(kernel=LIBSVM.Kernel.LINEAR, cost=1.0)
# 创建一个 MLJ 机器
mach_linear_svm = machine(linear_svm_model, X, y)
# 训练机器
fit!(mach_linear_svm, verbosity=0)
# 进行预测
y_pred_linear = predict_mode(mach_linear_svm, X)
# 评估(评估指标将在另一部分详细介绍)
# 例如,计算错误分类率:
accuracy_linear = accuracy(y_pred_linear, y)
println("线性 SVM 准确度: $(round(accuracy_linear, digits=3))")
这里的 cost 参数是正则化参数 。cost=1.0 是一个常见的默认值。
对于非线性可分离数据,RBF 核函数因其灵活性而成为常用选择。
# 实例化一个使用 RBF 核函数的支持向量机模型
rbf_svm_model = SVC(kernel=LIBSVM.Kernel.RADIAL, # RADIAL 即 RBF
cost=1.0, # 正则化参数 C
gamma=0.5) # RBF 的核函数系数
# `LIBSVM.Kernel` 提供对核函数类型的访问:
# LIBSVM.Kernel.LINEAR, LIBSVM.Kernel.POLY, LIBSVM.Kernel.RADIAL, LIBSVM.Kernel.SIGMOID
# 创建一个 MLJ 机器
mach_rbf_svm = machine(rbf_svm_model, X, y)
# 训练机器
fit!(mach_rbf_svm, verbosity=0)
# 进行预测
y_pred_rbf = predict_mode(mach_rbf_svm, X)
accuracy_rbf = accuracy(y_pred_rbf, y)
println("RBF 核 SVM 准确度: $(round(accuracy_rbf, digits=3))")
在这个 SVC 模型中:
kernel=LIBSVM.Kernel.RADIAL 指定 RBF 核函数。cost=1.0 是正则化参数 。gamma=0.5 特定于 RBF 和多项式等核函数。对于 RBF 核函数,,gamma 定义了单个训练示例的影响程度。
您可以使用 params(model_name) 检查模型的所有可调超参数:
# println(params(rbf_svm_model))
核函数的选择以及 和 等超参数的值对于支持向量机的性能非常重要。这些通常使用交叉验证和超参数调优等技术确定,本章后面会详细介绍。
优点:
需要考虑的因素:
支持向量机是以下情况的不错选择:
虽然支持向量机可能并非总是最快的训练算法,但它们查找复杂决策边界的能力以及坚实的理论支撑使它们成为机器学习实践者工具包中的一个有价值的工具。与任何模型一样,它们的性能应使用适当的指标和验证策略进行严格评估,本章后续部分将对此进行介绍。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造