MATLAB中的支持向量机SVM

最近和组内的师兄聊到SVM的实现,发现身边很多朋友还在用libsvm和老版本matlab中自带的svmtrain函数(该函数在新版本中已被移除),因此写篇blog向大家介绍一下新版MATLAB中机器学习工具箱里的fitcsvm函数。

fitcsvm和svmtrain的个人使用感想

旧版matlab中的svmtrain函数使用体验确实不好,所以笔者以前也是用libsvm工具包中的svmtrain函数。去年发现新版matlab的机器学习工具箱内的fitcsvm函数使用体验还不错,所以转用了这个新工具。笔者所用的matlab版本为2018a及以上。

1 fitcsvm函数简介

1.1 基本语法
1.1.1 输入为double类型矩阵
Mdl = fitcsvm(X,Y);

Mdl—训练好的分类器
X—训练集数据特征矩阵
Y—训练集数据标签

以上为最常见的fitcsvm使用方法,它的输入变量可以是double类型的矩阵,也可以是table类型的表格

例如,我有一个包含109个样本的训练集,每个样本具有150个特征
在这里插入图片描述
训练集保存在一个名为data的double类型矩阵中,第151列是样本标签

我们可以直接使用这个double类型矩阵进行SVM训练

mdl = fitcsvm(data(:,1:150),data(:,151));
1.1.2 输入为table类型的表格
Mdl = fitcsvm(Tbl,ResponseVarName)

Tbl—包含了训练集样本特征和标签的表格,是一个table类型的变量
ResponseVarName—对应Tbl中数据标签的变量名
也可以用函数array2table将这个double类型的矩阵转换为table类型的表格再进行SVM训练

data_tbl = array2table(data);

在这里插入图片描述
array2table函数会自动给每列编上一个变量名,命名规则为原矩阵名+列数,也可以使用输入参数VariableNames来规定每一列的变量名

	data_tbl = array2table(data,'VariableNames',{'Column_1','Column2'});%以前两列为例,后面略
1.2 基本参数设置

fitcsvm函数和许多常见的matlab函数一样,其输入参数同样采用参数对(Name,Value)的形式

1.2.1 BoxConstraint 框约束

框约束直观上可以理解为一个惩罚因子(或者说正则参数),这个参数和svmtrain里的-c是一个道理。其实际上涉及到软间隔SVM的间隔(Margin)大小。
基本思想如下:当原始数据未能呈现出较好的可分性时,算法允许其在训练集上呈现出一些误分类,matlab默认的BoxConstraint为1。框约束的数值越大,意味着惩罚力度越小,最后得到的分类超平面的间隔越小,支持向量数越多,模型越复杂。这也就是很多机器学习理论书中一开始推导的硬间隔支持向量机(Hard-Margin SVM)。因为该参数默认为1,所以使用默认参数训练时,我们采用的是软间隔SVM。

1.2.2 KernelFunction 核函数

该参数对应的输入为字符串型变量,例如
‘KernelFunction’,‘linear’

fitcsvm共支持三类核函数,线性核 ‘linear’ ,多项式核 ‘polynomial’ ,以及高斯核 ‘rbf’ or ‘gaussian’

笔者一般是先将样本分布可视化,然后再选用合适的核函数。

1.2.3 KernelScale 核规模

这个参数搭配高斯核SVM使用在这里插入图片描述
高斯核的表达式如上,其中的σ是高斯核的带宽,KernelScale和高斯核带宽之间的关系如下式在这里插入图片描述

1.2.4 PolynomialOrder 多项式次数

该参数搭配多项式核函数polynomial使用,代表所采用的多项式核的次数/阶数。
在这里插入图片描述

1.2.5 Standardize 标准化

该参数对应的输入为logical变量,true or false
开启标准化后,matlab会根据样本数据对应的加权列均值和标准差来对所有的样本数据进行标准化,这在一定程度上可以抵消原始样本特征数值的分布对分类造成的干扰。

1.2.6 ClassNames 类名称

该参数表示了训练集内的样本类名称,例如对于一个二分类任务,我定义这两个类的名称为0和1,那么该参数可设置为 ‘ClassNames’, [0; 1]

1.2.7 基本参数的应用

介绍了上面这六个基本参数,其最简单的应用代码如下

classificationSVM = fitcsvm(...
 data, ...
 label, ...
 'KernelFunction', 'gaussian', ...
  'PolynomialOrder', [], ...
 'KernelScale', 12, ...
  'BoxConstraint', 100, ...
 'Standardize', true, ...
  'ClassNames', [0; 1]);

data—训练样本数据集矩阵
label—样本标签向量
训练了一个高斯核SVM,KernelScale=12,BoxConstraint=100。

2.调参与参数优化

有了fitcsvm函数后,我们的调参工作就很简单了,matlab为了我们提供了一个自动优化超参数的输入参数,OptimizeHyperparameters。
该参数的输入同样为字符串类型的变量,默认为none
此外还有all和auto两个选项

none—不开启自动超参数优化
auto—仅优化BoxConstraint和KernelScale这两个参数
all—优化所有的符合条件的超参数,包括以上六个基本参数中的五个,即{BoxConstraint,KernelScale,KernelFunction,Standardize,PolynomialOrder}

此外,还可以使用元胞数组cell来手动规定要优化的超参数,或者与hyperparameters函数搭配使用

关于超参数优化的细节以及以上部分基本参数的数学原理,留待日后讨论。
欢迎大家批评指正。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐