libsvm 训练后的模型参数讲解

简介: libsvm 训练后的模型参数讲解

主要就是讲解利用libsvm-mat工具箱建立分类(回归模型)后,得到的模型model里面参数的意义都是神马?以及如果通过model得到相应模型的表达式,这里主要以分类问题为例子。


测试数据使用的是libsvm-mat自带的heart_scale.mat数据(270*13的一个属性据矩阵,共有270个样本,每个样本有13个属性),方便大家自己测试学习。


首先上一个简短的测试代码:

%% ModelDecryption % by faruto @ faruto's Studio~ % blog.sina.com.cn/faruto% Email:faruto@163.com% www.matlabsky.com% www.mfun.la% video.ourmatlab.com% last modified by 2011.01.06 %% a litte clean work tic; close all; clear; clc; format compact; %% % 首先载入数据 load heart_scale; data = heart_scale_inst; label = heart_scale_label; % 建立分类模型 model = svmtrain(label,data,'-s 0 -t 2 -c 1.2 -g 2.8'); model % 利用建立的模型看其在训练集合上的分类效果 [PredictLabel,accuracy] = svmpredict(label,data,model); accuracy %% toc;


运行结果:

model = Parameters: [5x1 double] nr_class: 2 totalSV: 259 rho: 0.0514 Label: [2x1 double] ProbA: [] ProbB: [] nSV: [2x1 double] sv_coef: [259x1 double] SVs: [259x13 double] Accuracy = 99.6296% (269/270) (classification) accuracy = 99.6296 0.0148 0.9851 Elapsed time is 0.040155 seconds.

这里面为了简单起见没有将测试数据进行训练集和测试集的划分,这里仅仅是为了简单明了而已,分类结果估计可以不要管,参数优化也不要管,另有帖子讲解。

下面我们就看看 model这个结构体里面的各种参数的意义都是神马,model如下:

model = Parameters: [5x1 double] nr_class: 2 totalSV: 259 rho: 0.0514 Label: [2x1 double] ProbA: [] ProbB: [] nSV: [2x1 double] sv_coef: [259x1 double] SVs: [259x13 double]

model.Parameters

我们先来看一下model.Parameters里面承装的都是什么:

model.Parameters

ans = 0 2.0000 3.0000 2.8000 0


重要知识点:

model.Parameters参数意义从上到下依次为: -s svm类型:SVM设置类型(默认0) -t 核函数类型:核函数设置类型(默认2) -d degree:核函数中的degree设置(针对多项式核函数)(默认3) -g r(gama):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数) (默认类别数目的倒数) -r coef0:核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0) 即在本例中通过model.Parameters我们可以得知 –s 参数为0;-t 参数为 2;-d 参数为3;-g 参数为2.8(这也是我们自己的输入);-r 参数为0。


关于libsvm参数的一点小说明:

Libsvm中参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。 model.Label model.nr_class

model.Label

ans = 1 -1

model.nr_class

ans = 2


重要知识点:

model.Label表示数据集中类别的标签都有什么,这里是 1,-1; model.nr_class表示数据集中有多少类别,这里是二分类。

model.totalSVmodel.nSV

model.totalSV

ans = 259

model.nSV

ans = 118 141


重要知识点:

model.totalSV代表总共的支持向量的数目,这里共有259个支持向量; model.nSV表示每类样本的支持向量的数目,这里表示标签为1的样本的支持向量有118个,标签为-1的样本的支持向量为141。 注意:这里model.nSV所代表的顺序是和model.Label相对应的。

model.ProbAmodel.ProbB

关于这两个参数这里不做介绍,使用-b参数时才能用到,用于概率估计。

-bprobability_estimates: whether to train a SVC or SVR model for probabilityestimates, 0 or 1 (default 0)

model.sv_coef model.SVs model.rho

sv_coef: [259x1 double] SVs: [259x13 double] model.rho = 0.0514


重要知识点:

model.sv_coef是一个2591的矩阵,承装的是259个支持向量在决策函数中的系数; model.SVs是一个25913的稀疏矩阵,承装的是259个支持向量。 model.rho是决策函数中的常数项的相反数(-b)


在这里首先我们看一下 通过 –s 0 参数(C-SVC模型)得到的最终的分类决策函数的表达式是怎样的? 这里如果有关于C-SVC模型不懂的地方,请看这个pdf文件: libsvm_library.pdf 附件: 最终的决策函数为: 在由于我们使用的是RBF核函数(前面参数设置 –t 2),故这里的决策函数即为: 其中|| x-y ||是二范数距离 ; 这里面的

b就是-model.rho(一个标量数字); b = -model.rho; n代表支持向量的个数即 n = model.totalSV(一个标量数字); 对于每一个i: wi =model.sv_coef(i); 支持向量的系数(一个标量数字) xi = model.SVs(i,:) 支持向量(113的行向量) x 是待预测标签的样本 (113的行向量) gamma 就是 -g 参数 好的下面我们通过model提供的信息自己建立上面的决策函数如下:

%% DecisionFunction function plabel = DecisionFunction(x,model)

gamma = model.Parameters(4); RBF = @(u,v)( exp(-gamma.*sum( (u-v).^2) ) );

len = length(model.sv_coef); y = 0;

for i = 1:len u = model.SVs(i,:); y = y + model.sv_coef(i)*RBF(u,x); end b = -model.rho; y = y + b;

if y >= 0 plabel = 1; else plabel = -1; end

有了这个决策函数,我们就可以自己预测相应样本的标签了:

%% plable = zeros(270,1); for i = 1:270 x = data(i,:); plabel(i,1) = DecisionFunction(x,model); end

%% 验证自己通过决策函数预测的标签和svmpredict给出的标签相同 flag = sum(plabel == PredictLabel) over = 1;


最终可以看到 flag = 270 ,即自己建立的决策函数是正确的,可以得到和svmpredict得到的一样的样本的预测标签,事实上svmpredict底层大体也就是这样实现的。 最后我们来看一下,svmpredict得到的返回参数的意义都是什么 在下面这段代码中 :

%% % 首先载入数据 load heart_scale; data = heart_scale_inst; label = heart_scale_label; % 建立分类模型 model = svmtrain(label,data,'-s 0 -t 2 -c 1.2 -g 2.8'); model % 利用建立的模型看其在训练集合上的分类效果 [PredictLabel,accuracy] = svmpredict(label,data,model); accuracy

运行可以看到


model = Parameters: [5x1 double] nr_class: 2 totalSV: 259 rho: 0.0514 Label: [2x1 double] ProbA: [] ProbB: [] nSV: [2x1 double] sv_coef: [259x1 double] SVs: [259x13 double] Accuracy = 99.6296% (269/270) (classification) accuracy = 99.6296 0.0148 0.9851


这里面要说一下返回参数accuracy的三个参数的意义。 重要的知识点:

返回参数accuracy从上到下依次的意义分别是: 分类准率(分类问题中用到的参数指标) 平均平方误差(MSE(mean squared error)) [回归问题中用到的参数指标] 平方相关系数(r2(squared correlation coefficient))[回归问题中用到的参数指标] 其中mse 和r2的计算公式分别为: 插图: 写在后面的话,至此关于model中相应参数的一些意义,以及到底如果得到决策函数的表达式或者计算方式的就算是说的很明了了。 可能还有的同学会问,如何得到分类决策函数中的那个alpha系数【这个肯定会有人问】,还是再磨叽说一下吧: 上面的wi其实是alpha和支持向量的类别标签(1或-1的乘积),原始决策函数的表达式如下: 插图: 上面的yi是支持向量的类别标签(1或者-1),在libsvm中将yi和alpha的乘积放在一起用model.sv_coef(w)来承装。



相关文章
|
6月前
|
机器学习/深度学习 JSON 算法
如何在自定义数据集上训练 YOLOv8 实例分割模型
在本文中,我们将介绍微调 YOLOv8-seg 预训练模型的过程,以提高其在特定目标类别上的准确性。Ikomia API简化了计算机视觉工作流的开发过程,允许轻松尝试不同的参数以达到最佳结果。
|
6月前
|
XML 机器学习/深度学习 数据格式
YOLOv8训练自己的数据集+常用传参说明
YOLOv8训练自己的数据集+常用传参说明
7057 0
|
4月前
|
机器学习/深度学习 数据采集 PyTorch
使用 PyTorch 创建的多步时间序列预测的 Encoder-Decoder 模型
本文提供了一个用于解决 Kaggle 时间序列预测任务的 encoder-decoder 模型,并介绍了获得前 10% 结果所涉及的步骤。
71 0
|
XML 数据挖掘 数据格式
|
6月前
|
JSON 数据处理 数据格式
yolov8训练自己的数据集以及权重转化为.engine格式(超详细)
yolov8训练自己的数据集以及权重转化为.engine格式(超详细)
518 0
|
存储 大数据 Linux
基于 YOLOv8 的自定义数据集训练
基于 YOLOv8 的自定义数据集训练
|
机器学习/深度学习 数据采集 监控
五、神经网络过拟合处理方法(二):手写数字识别(Mnist)数据集
五、神经网络过拟合处理方法(二):手写数字识别(Mnist)数据集
175 0
|
PyTorch 算法框架/工具
EfficientNet 训练自己的分类数据集
EfficientNet 训练自己的分类数据集
EfficientNet 训练自己的分类数据集
|
算法 异构计算
ML之catboost:基于自定义数据集利用catboost 算法实现回归预测(训练采用CPU和GPU两种方式)
ML之catboost:基于自定义数据集利用catboost 算法实现回归预测(训练采用CPU和GPU两种方式)
ML之分类预测之ElasticNet之PLoR:在二分类数据集上调用Glmnet库训练PLoR模型(T2)
ML之分类预测之ElasticNet之PLoR:在二分类数据集上调用Glmnet库训练PLoR模型(T2)
ML之分类预测之ElasticNet之PLoR:在二分类数据集上调用Glmnet库训练PLoR模型(T2)
下一篇
无影云桌面