Press "Enter" to skip to content

【SVM回归预测】基于LibSVM实现多特征数据的预测 本文介绍了如何利用机器学习中的SVM算法来解决生活…

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

文章目录

 

案例:假设有一辆二手电动车,它的价格(万)与其使用年限、总里程(km)、事故次数、电池容量、车身尺寸等指标有关,这些指标影响着电动车的价格,因此,我们希望通过获取上述指标的数据来建立一个预测电动车价格的模型,即通过得到某辆车的这些指标就可以预测这辆车的价格。

 

机器学习中的回归问题与分类问题可以使用同种方法,区别在于分类问题中算法输出的是样本标签,而回归问题中算法输出的是预测样本的值。为了便于描述,在本文的回归问题中,将样本的特征向量称为自变量 x x x ,算法的输出称为因变量 y y y ,训练集、测试集的因变量以及预测值分别称为训练标签、测试标签、预测标签。

 

一、数据集

 

数据集大小为150×6,第一列到第五列为自变量 x x x ,第6列为因变量 y y y

 

二、实现步骤

 

(1)数据集的划分

 

首先,将数据集按照一定比例划分为训练集和测试集,训练集可以训练出一个用于预测的模型,而测试集是为了验证模型的预测准确率。

 

% 训练集与测试集的划分
[m,n] = size(Sample);         % 数据的大小相等
ratio = 2/3;                  % 训练数据比例
m_train = round(m*ratio);      % 训练数据行数
train_sample = Sample(1:m_train,1:5);    % 训练集和测试集的样本
test_sample = Sample(m_train+1:m,1:5);
train_labels = Sample(1:m_train,6);      % 训练集和测试集的样本标签
test_labels = Sample(m_train+1:m,6);

 

(2)数据归一化

 

由于数据集自变量的单位不统一,且不同自变量的值大小相差较大,在使用之前需要进行归一化处理。

 

数据的归一化用matlab自带的函数mapminmax。

 

该函数的默认归一化范围为[-1, 1],本文我们采用的归一化范围是[0, 1],则需要这样使用:

 

B= mapminmax(A,0,1);

 

A为原始数据,B为归一化后的数据。

很明显,对于矩阵,mapminmax函数是按行进行归一化的。所以我们要将训练样本和测试样本先转置,再进行归一化操作。

 

% 将训练集和测试集的样本分别归一化到[0,1]区间
[train_scale,ps] = mapminmax(train_sample',0,1);  
train_x = train_scale';
test_scale = mapminmax('apply',test_sample',ps);
test_x = test_scale';

 

ps是一个结构体,里面存放的是数据归一化的规则。为了使测试样本的归一化与训练样本保持一致,就可以用到ps。

由于在回归问题中训练集和测试集的样本标签并不是真实的整数标签,且数值的变化范围较大,也需要进行归一化处理。

 

% 将训练集和测试集的样本标签分别归一化到[0,1]区间
[train_lab,ps] = mapminmax(train_labels',0,1);  
train_y = train_lab';
test_lab = mapminmax('apply',test_labels',ps);
test_y = test_lab';

 

(3)SVM训练与预测

 

cmd = ('-s 3 -t 2 -b 1');
model = svmtrain(train_y,train_x,cmd); %#ok<SVMTRAIN>
[predict_y,accuracy,prob_estimates] = svmpredict(test_y,test_x,model);

 

有关训练函数svmtrain和预测函数svmpredict的使用方法以及cmd中参数的含义请阅读博文 svmtrain和svmpredict的用法和参数含义

 

(4)预测数据的反归一化

 

先测试一下反归一化操作的有效性,将测试样本的标签反归一化之后得到的值与归一化前的值进行比较,如果相同,则对预测标签进行反归一化。

 

% 反归一化
predict_labels = mapminmax('reverse',predict_y,ps);

 

模型的预测结果如下图:

三、MATLAB代码

 

clc;
clear;
close all;
load Sample;
% 训练集与测试集的划分
[m,n] = size(Sample);         % 数据的大小相等
ratio = 2/3;                  % 训练数据比例
m_train = round(m*ratio);      % 训练数据行数
train_sample = Sample(1:m_train,1:5);    % 训练集和测试集的样本
test_sample = Sample(m_train+1:m,1:5);
train_labels = Sample(1:m_train,6);      % 训练集和测试集的样本标签
test_labels = Sample(m_train+1:m,6);
% 将训练集和测试集的样本分别归一化到[0,1]区间
[train_scale,ps] = mapminmax(train_sample',0,1);  
train_x = train_scale';
test_scale = mapminmax('apply',test_sample',ps);
test_x = test_scale';
% 将训练集和测试集的样本标签分别归一化到[0,1]区间
[train_lab,ps] = mapminmax(train_labels',0,1);  
train_y = train_lab';
test_lab = mapminmax('apply',test_labels',ps);
test_y = test_lab';
%% SVM网络训练、验证与测试
cmd = ('-s 3 -t 2 -b 1');
model = svmtrain(train_y,train_x,cmd); %#ok<SVMTRAIN>
[predict_y,accuracy,prob_estimates] = svmpredict(test_y,test_x,model);
% 反归一化
predict_labels = mapminmax('reverse',predict_y,ps);
%% 结果分析
% 验证集、测试集的实际分类和预测分类图
figure;
hold on;
plot(test_labels,'b-');
plot(predict_labels,'r-.');
axis tight;
xlabel('测试集样本','FontSize',12);
ylabel('标签','FontSize',12);
legend('测试集实际值','测试集预测值');
title('测试集的实际值和预测值','FontSize',12);
grid on;

 

参考资料

 

[1] matlab归一化和反归一化函数——mapminmax

 

[2] svmtrain和svmpredict的用法和参数含义

Be First to Comment

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注