【SVM回归预测】基于LibSVM实现多特征数据的预测

前言

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

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

一、数据集

数据集大小为150x6,第一列到第五列为自变量 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的用法和参数含义

  • 17
    点赞
  • 119
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zhi Zhao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值