除了具有两个特征(即可以表示在二维坐标图)的数据分类,实际应用中的数据往往具有很多个特征,fitclinear函数可以训练用于高维数据的SVM二分类模型。
以下内容基于MATLAB官网的介绍文档,进行了一点个人的理解和整理,不算原创,但也不是单纯的翻译,也就恬不知耻的算作原创了。具体内容缺斤少两的,想看具体的英文内容请点击链接fitclinear。
MATLAB实现SVM二分类之fitclinear
fitclinear
要在高维数据集(即包含许多预测变量的数据集)上训练用于二分类的线性支持向量机模型,可以改用fitclinear。
fitclinear训练线性分类模型,用于高维、完整或稀疏的预测数据的二类(binary)学习。现有的线性分类模型包括正则化支持向量机(SVM)和logistic回归模型。fitclinear使用减少计算时间的技术(如随机梯度下降)最小化目标函数。
为了减少在包含多个预测变量的高维数据集上的计算时间,利用fitchinear训练一个线性分类模型。对于低维到中维预测数据集,请参阅低维数据的备选方案。
几个例子
Train Linear Classification Model
训练线性分类模型,样本大小为31572*34023,比较大。
% 导入NLP数据集
load nlpdata
% X是预测数据的稀疏矩阵,Y是类别标签的分类向量,数据中有两个以上的类。
% 标识与“统计和机器学习工具箱”文档网页对应的标签。
Ystats = Y == 'stats';
% 训练一个二进制线性分类模型,该模型可以识别文档网页中的字数是否来自统计和机器学习工具箱文档。使用整个数据集训练模型。通过提取拟合摘要,确定优化算法将模型拟合到数据的程度。
rng(1); % For reproducibility
[Mdl,FitInfo] = fitclinear(X,Ystats);
Mdl是一个线性分类模型。可以通过模型和训练数据(或新数据)的损失来检查样本中的分类错误,也可以通过Mdl预测新的数据。
FitInfo是一个结构数组,其中包含终止状态(TerminationStatus)以及解算器将模型拟合到数据所需的时间(FitTime)。最好使用FitInfo来确定优化终止测量是否令人满意。因为训练时间很短,可以尝试重新训练模型,但要增加通过数据的次数。这可以改进诸如DeltaGradient之类的措施。
Find Good Lasso Penalty Using Cross-Validation
使用交叉验证找到好的套索惩罚(Lasso Penalty),Lasso是Least Absolute Shrinkage and Selection Operator的简称,是一种采用了L1正则化(L1-regularization)的线性回归方法,采用了L1正则会使得部分学习到的特征权值为0,从而达到稀疏化和特征选择的目的。
具体是个啥我也不太懂,还是得学习啊。
要为使用Logistic回归学习器的线性分类模型确定良好的lasso-penalty strength,实施5倍交叉验证。使用的数据集和前一个例子的一样。具体过程见代码:
% 导入数据集
load nlpdata
Ystats = Y == 'stats';
% 生成从10的-6次方到10的-0.5次方之间按对数等分的11个元素的行向量,即11个正则化强度
Lambda = logspace(-6,-0.5,11);
% 对模型进行交叉验证。 要提高执行速度,请转置预测变量数据并指定观察值在列中。
% 使用SpaRSA估算系数。 将目标函数的梯度公差降低到1e-8。
X = X';
rng(10); % For reproducibility
CVMdl = fitclinear(X,Ystats,'ObservationsIn','columns','KFold',5,...
'Learner','logistic','Solver','sparsa','Regularization','lasso',...
'Lambda',Lambda,'GradientTolerance',1e-8)
numCLModels = numel(CVMdl.Trained)
% CVMdl是ClassificationPartitionedLinear模型。由于fitclinear实现5折交叉验证,因此CVMdl包含5个ClassificationLinear模型,该软件在每次折叠时进行训练。
% 显示第一个训练有素的线性分类模型。
Mdl1 = CVMdl.Trained{1}
% Mdl1是线性分类模型,fitclinear通过在前四个折叠中进行训练来构造Mdl1。
% 因为Lambda是一系列正则化强度,所以可以将Mdl1视为11个模型,Lambda中每个正则化强度都对应一个模型。
% 估计交叉验证的分类误差。
% 因为有11个正则化强度,所以ce是分类错误率组成的1×11向量。
ce = kfoldLoss(CVMdl);
% 较高的Lambda值导致预测变量稀疏性,这是一个良好的分类器质量。
% 对于每个正则化强度,使用整个数据集和交叉验证模型时的相同选项来训练线性分类模型。确定每个模型的非零系数的数量。
Mdl = fitclinear(X,Ystats,'ObservationsIn','columns',...
'Learner','logistic','Solver','sparsa','Regularization','lasso',...
'Lambda',Lambda,'GradientTolerance',1e-8);
numNZCoeff = sum(Mdl.Beta~=0);
% 在同一图中,针对每个正则化强度绘制交叉验证的分类错误率和非零系数的频率。 在对数刻度上绘制所有变量。
figure;
[h,hL1,hL2] = plotyy(log10(Lambda),log10(ce),...
log10(Lambda),log10(numNZCoeff));
hL1.Marker = 'o';
hL2.Marker = 'o';
ylabel(h(1),'log_{10} classification error')
ylabel(h(2),'log_{10} nonzero-coefficient frequency')
xlabel('log_{10} Lambda')
title('Test-Sample Statistics')
hold off
% 选择平衡预测变量稀疏性和低分类误差的正则化强度指标。在这种情况下,10的-4次方至10的-1次方之间的值就足够了。
idxFinal = 7;
% 从Mdl中选择具有选定正则化强度的模型。
% MdlFinal是包含一个正则化强度的ClassificationLinear模型。可以使用MdlFinal和新数据预测新数据的标签。
MdlFinal = selectModels(Mdl,idxFinal);
Optimize Linear Classifier
本示例说明如何使用fitclinear在线性分类器中最小化交叉验证误差。 该示例仍然使用NLP数据集,但是我没看,哈哈哈。
输入参数Input Arguments
X是预测数据,指定为n×p全矩阵或稀疏矩阵。
注意,如果调整预测数据矩阵的方向,使观测值对应于列并指定“ ObservationsIn”,“ columns”,则优化执行时间可能会大大减少。
Y是分类模型的类标签,指定为分类,字符或字符串数组,逻辑或数字向量或字符向量的单元格数组。fitclinear仅支持二进制分类。 Y必须完全包含两个截然不同的类,或者必须使用’ClassNames’名称/值对参数指定两个用于训练的类。有关多类学习的信息,请参见fitcecoc。如果Y是一个字符数组,则每个元素必须对应于该数组的一行。Y的长度必须等于X中的观测数目。一个好的做法是使用ClassNames名称/值对参数指定类顺序。
输出参数Output Arguments
输出参数包括经过训练的分类模型Mdl,优化的详细信息FitInfo,以及超参数的交叉验证优化结果。
此外,More About和Tips中还给出了更多的注意事项,值得学习。
应用
ClassificationLinear class介绍了线性分类器的应用。分类线性模型是经过训练的线性模型对象,用于二元分类。线性模型是支持向量机(SVM)或逻辑回归模型。fitclinear通过使用减少高维数据集(例如,随机梯度下降)的计算时间的技术来最小化目标函数,从而拟合了CategoryLinear模型。分类损失加正则项构成目标函数。
与其他分类模型不同,出于节省内存的目的,ClassificationLinear模型对象不存储训练数据。 但是,它们存储了估计的线性模型系数,先验概率和正则化强度。
可以使用训练过的ClassificationLinear模型来预测新数据的标签或分类分数。有关详细信息,请参见predict。