1.2 线性回归
支持向量机定义
支持向量机(Support Vector Machine,简称SVM)是一种监督式学习的方法,可以广泛地应用于统计分类以及回归分析。SVM是一种广义线性分类器,其基本思想是通过寻找一个线性或非线性的超平面,将数据分成两个或多个类别。这个超平面可以用一个线性方程wx + b = 0来表示,其中w是法向量,b是位移项,x是样本点的特征向量。
支持向量机回归的定义
支持向量机回归(Support Vector Regression,简称SVR)是一种基于支持向量机的回归方法。与传统的回归方法不同,SVR的目标是找到一个在高维特征空间中最好地拟合数据的超平面。它通过最小化预测结果与实际结果之间的差异,同时考虑到支持向量与超平面之间的最大间隔,从而实现回归任务。SVR可以应用于线性和非线性回归问题,并且在处理小样本和高维数据时具有较好的泛化性能
支持向量机SVM与SVR的区别
图1 SVM与SVR的区别
支持向量机回归的构成
支持向量机回归的主要步骤,其中重点在于超参数优化部分进行的超参数选择
表1.2.1支持向量机回归的步骤
序号 | 步骤 | 备注 |
1 | 准备数据集,矩阵或者table形式 | 可进行数据预处理如标准化等等 |
2 | 模型训练 | 超参数优化,选择需要优化的超参数类型,如核函数... |
3 | 模型预测 | 将新的数据集进行预测或者指标评价 |
支持向量机回归有什么作用
支持向量机回归的作用主要是根据一系列已有的数据预测未知的连续性数据,其主要作用有着:
- 建模预测,在制造业中可以预测生产成本,故障率,产品质量,效益等等,也可用于其他领域,如经济学、气象学、生态学、生物学等等学科领域
- 异常检测,可根据已有数据进行未来数据估计,得到范围性数据,任何超出此范围的数据均可作为异常数据,在网络安全、欺诈检测等领域特别有用
总体来说,SVR是一种强大的预测性工具,它可在各种复杂的数据集上实现高精度的预测,并在许多实际应用中取得了良好的效果。
1.2.1 支持向量机回归模型构建
第一部分:内容介绍
本节介绍如何利用matlab的statistics and machine learning toolbox中 fitrsvm函数进行支持向量机回归模型的构建
首先选择需要回归数据集,这是进行回归模型构建的基础,其次选择需要的核函数,以及是否交叉验证,是否选择超参数等等,后利用fitrsvm进行训练,以及参数选择
第二部分:函数介绍
Fitrsvm(支持向量机回归函数)——输入输出参数
常用训练方式代码方式,返回模型Mdl
Mdl = fitrsvm(Tbl,ResponseVarName)
Mdl = fitrsvm(Tbl,formula)
Mdl = fitrsvm(Tbl,Y)
Mdl = fitrsvm(X,Y)
Mdl = fitrsvm(___,Name,Value)
Tbl 是一个表格(table)数据,其中包含了用于训练SVM模型的输入和输出数据。
- ResponseVarName为需要回归因变量名称ResponseVarName = 'Salary';
- formula 是一个字符串,它指定了Tbl中哪些列是输入(预测变量)和哪些列是输出(响应变量)formula = 'Salary ~ Age';
- X,Y代表了矩阵数据,从矩阵X为自变量,矩阵Y为因变量
- Name与Value代表了其他参数与参数值,利用指定核函数,待优化超参数等等
表1.2.2:训练时fitrsvm其他参数说明
参数(Name) | Value | 作用 |
'Standardize' | Ture or False | 是否数据标准化 |
'KFold' | n | n倍交叉验证 |
'KernelFunction' | 'linear' | 选择核函数 线性核函数 高斯核函数 多项式核函数 |
'gaussian' | ||
'polynomial' | ||
BoxConstraint | n | 默认1,框约束n |
'Epsilon', | n | 默认0.1,控制向量与最大间隔距离 |
'OptimizeHyperparameters' | “auto”,”none”,”all” | 优化参数与否 |
'HyperparameterOptimizationOptions' | eg: 'AcquisitionFunctionName',... 'expected-improvement-plus' | 指定优化结构 |
其他详细信息详见matlab说明书 |
第三部分:例子(2-3个)初始化构建函数
Mdl = fitrsvm(Tbl,ResponseVarName)
Mdl = fitrsvm(Tbl,formula)
Mdl = fitrsvm(Tbl,Y)
Mdl = fitrsvm(X,Y)
Mdl = fitrsvm(___,Name,Value)
1.2.2 支持向量机回归模型训练
第一部分:内容介绍
第二部分:函数介绍
第三部分:例子(2-3个)
本模块已在1.2.1中进行了详细的介绍
1.2.3 支持向量机回归模型预测
第一部分:内容介绍
本模块将介绍如何利用已经训练好的支持向量机回归模型进行预测,可利用以下两种函数进行预测,分别预测训练旧数据集与新数据集
第二部分:函数介绍
表1.2.3 支持向量机回归模型预测相关函数
函数 | 相关作用 | 例子 |
resubPredict | 利用mdl. x进行预测 | yfit = resubPredict (mdl) |
predict | 使用新的x中数据进行预测 | yfit = predict(Mdl,xnew) |
resubLoss | 计算损失函数,评价模型指标 | L = resubLoss (mdl) L = resubLoss (mdl, name, value) |
第三部分:例子(2-3个)
l = resubLoss(Mdl) %计算均方差
Yfit=predict(Mdl,xnew) %预测值
yfit = resubPredict (mdl) %计算mdl.x中数值
1.2.4 应用实例
基础应用1——使用标准化与否训练模型——carsmall数据集
clc
clear all
close all
% 加载数据
load carsmall
rng 'default' % For reproducibility
% 马力和重量作为自变量,MPG作为因变量
X = [Horsepower,Weight];
Y = MPG;
% 返回一个默认的回归支持向量模型
Mdl = fitrsvm(X,Y)
MdlStd = fitrsvm(X,Y,'Standardize',true) %数据标准化
l = resubLoss(Mdl) %计算均方差
lStd = resubLoss(MdlStd) %计算均方差
基础应用2——定义列表进行训练
clc
clear all
close all
% 加载数据
% 使用UCI机器学习存储库中的abalone数据训练支持向量机回归模型
% 下载数据,并将其保存在当前文件夹中,名称为“ abalone.csv”
url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/abalone/abalone.data';
websave('abalone.csv',url);
% 将数据读入表。指定变量名称
varnames = {'Sex'; 'Length'; 'Diameter'; 'Height'; 'Whole_weight';...
'Shucked_weight'; 'Viscera_weight'; 'Shell_weight'; 'Rings'};
Tbl = readtable('abalone.csv','Filetype','text','ReadVariableNames',false);
Tbl.Properties.VariableNames = varnames;
% 样本数据包含4177个观测值。除性别外,所有预测变量都是连续的,这是一个类别变量,
% 其可能值为“ M”(对于男性),“ F”(对于女性)和“ I”(对于婴儿)。
% 目的是预测abalone的环数(存储在“环”中)并使用物理测量确定其年龄。
rng default % For reproducibility
Mdl = fitrsvm(Tbl,'Rings','KernelFunction','gaussian','KernelScale','auto',...
'Standardize',true)
% 使用点表示法显示Mdl的属性。 例如,检查以确认模型是否收敛以及完成了多少次迭代。
conv = Mdl.ConvergenceInfo.Converged %查询是否收敛
iter = Mdl.NumIterations %查询迭代次数
基础应用3——交叉验证与优化
clc
clear all
close all
% 加载数据
load carsmall
rng 'default' % For reproducibility
X = [Horsepower Weight];
Y = MPG;
% 使用5-fold交叉验证对两个SVM回归模型进行交叉验证。
% 对于这两种模型,请指定以标准化预测变量。 对于其中一个模型,
% 指定使用默认线性核进行训练,而对于另一个模型,则指定使用高斯核。
MdlLin = fitrsvm(X,Y,'Standardize',true,'KFold',5)
MdlGau = fitrsvm(X,Y,'Standardize',true,'KFold',5,'KernelFunction','gaussian')
mseLin = kfoldLoss(MdlLin) %计算样本外均方误差,选择更优核函数
mseGau = kfoldLoss(MdlGau)
MdlGau = fitrsvm(X,Y,'Standardize',true,'KernelFunction','gaussian');%比较后最优结果
% 使用fitrsvm自动优化超参数。通过使用自动超参数优化,找到使交叉验证损失减少五倍的超参数。
rng default
Mdl = fitrsvm(X,Y,'OptimizeHyperparameters','auto',...
'HyperparameterOptimizationOptions',struct('AcquisitionFunctionName',...
'expected-improvement-plus')) %自动优化超参数,超参数名称
% 预测
fit = predict(Mdl,X)
% plot(Y,fit,'.')
基础实验4——优化高斯核函数预测鲍鱼环数
clc;
clear;
varnames = {'Sex'; 'Length'; 'Diameter'; 'Height'; 'Whole_weight';...
'Shucked_weight'; 'Viscera_weight'; 'Shell_weight'; 'Rings'};
Tbl = readtable('abalone.csv','Filetype','text','ReadVariableNames',false);
Tbl.Properties.VariableNames = varnames;
rng default % For reproducibility
Mdl = fitrsvm(Tbl,"Rings",'KernelFunction','gaussian','OptimizeHyperparameters','auto')
%是否收敛,循环次数,损失函数,预测结果
Mdl.ConvergenceInfo.Converged
iter = Mdl.NumIterations
lStd = resubLoss(Mdl)
yfit=resubPredict(Mdl)
x=Tbl(:,"Rings");
x1=(1:4177);
x=table2array(x);
yfit=double(yfit);
%fplot(x1,y,'--or',x1,x,'^g:');
subplot(1,2,1)
plot(x1,x);%真实结果
title("真实结果")
subplot(1,2,2)
plot(x1,y);%预测结果
title("预测结果")
实验结果
图2 鲍鱼环数回归预测结果