如何转成libsvm支持的数据格式并做回归分析

author author     2022-08-12     445

关键词:

本次实验的数据是来自老师给的2006-2008年的日期,24小时的温度、电力负荷数据,以及2009年的日期,24小时的温度数据,目的是预测2009年每天24小时的电力负荷,实验数据本文不予给出。

用libsvm进行预测的步骤大体是:将数据进行归一化处理,并转换成livsvm需要的格式,然后进行参数择优,用选的最佳参数使用2006-2008 3年的数据建立模型,再用该模型预测2009年的电力负荷。实际过程中,我先用2006-2007年的数据建模,预测2008年的数据,以得到测试误差。事实证明,用2006-2007 两年的数据建模来预测2008年的电力负荷,效果要比单用2007年的数据建模预测2008年的电力负荷的效果好。所以最终我是用2006-2008 三年的数据进行建模,来预测。

libsvm训练模型时,设置的参数有:
-s SVM类型,取值有 0,1,2,3,4 回归的话选3或4.
-t 核函数类型,取值有0,1,2,3 0是线性核函数,1是多项式核函数,2是RBF径向基核函数,3是sigmoid 核函数。
-g gamma,这是针对多项式、RBF、sigmoid 核函数才有的参数选项。默认是1/k,k是属性数/类别数。
-c 为 c-SVC、e-SVR 和 nu-SVR 设置的损失函数,默认为1.

详细的参数描述见 LIBSVM使用方法及参数设置(转)

下面是进行回归预测的步骤:

1.将数据转换成libsvm需要的格式

数据格式需要:

target属性第1个属性:值第2个属性:值
2 1:7 2:5
1 1:4 2:2

即如果是分类问题的话,第一列是类别属性。

在网上下载一个 write4libsvm.m 格式转换程序,在matlab中直接运行,然后选择需要转换的数据文件即可,非常简便易用。

write4libsvm.m

function write4libsvm 
% 为了使得数据满足libsvm的格式要求而进行的数据格式转换 注意原始格式是mat的数据格式,转化成txt或者dat都可以。
% 原始数据保存格式为: 
%             [标签 第一个属性值 第二个属性值...] 
% 转换后文件格式为满足libsvm的格式要求,即: 
%             [标签 1:第一个属性值 2:第二个属性值 3:第三个属性值 ...] 
% [email protected] 
% 2004.6.16 
[filename, pathname] = uigetfile( {*.mat, ... 
       数据文件(*.mat); ... 
       *.*,                   所有文件 (*.*)}, ... 
   选择数据文件); 
try 
   S=load([pathname filename]); 
   fieldName = fieldnames(S); 
   str = cell2mat(fieldName); 
   B = getfield(S,str); 
   [m,n] = size(B); 
   [filename, pathname] = uiputfile({*.txt;*.dat ,数据文件(*.txt;*.dat);*.*,所有文件 (*.*)},保存数据文件); 
   fid = fopen([pathname filename],w); 
   if(fid~=-1) 
       for k=1:m 
           fprintf(fid,%3d,B(k,1)); 
           for kk = 2:n 
               fprintf(fid,	%d,(kk-1)); 
               fprintf(fid,:); 
               fprintf(fid,%d,B(k,kk)); 
           end 
           k 
           fprintf(fid,
); 
       end 
       fclose(fid); 
   else 
       msgbox(无法保存文件!); 
   end 
catch 
end 

2. 选择核函数类型

我选择的是RBF核函数。

2.将数据做归一化处理

不做归一化处理的话,最后预测误差会很大。
通过程序对属性进行归一化处理。一开始我并没有做归一化处理,结果测试误差MAPE达14%,做属性归一化处理后,测试数据的MAPE是3.9556% 。

clear;
load(X1.mat);% X1.mat 是训练集。
load(X2.mat);% X2.mat 是测试集。

X1_1 =normalization(X1);
X2_1 =normalization(X2);

%另存为X1_1.mat X2_1.mat 然后运行 **write4libsvm.m** 转成符合需要的格式的文件 X1_1.csv 和 X2_1.csv。


%进入D:softwares_diyMATLABR2014a	oolboxlibsvm-3.21目录,将D:softwares_diyMATLABR2014a	oolboxlibsvm-3.21matlab添加到路径

[Y1, X1] = libsvmread(X1_1.csv);% Y1 X1 是2006-2008年的数据。
[Y2, X2] = libsvmread(X2_1.csv);%Y2 X2 是2009年的数据。

Y1_train =  Y1(1:17520,:); %06-07年的数据做训练
X1_train = X1(1:17520,:);
Y1_test =  Y1(17521:end,:);%08年的数据做测试
X1_test = X1(17521:end,:);

3.参数寻优

需调整的重要参数是 -c 和 -g。 -c指定损失函数,-g是针对多项式、RBF、sigmoid核函数的γ值设置。

我用程序 SVM.cg.m 通过指定c的变化范围和g的变化范围来寻找最优的参数c和g。

这是 预测代码

%寻找最优的 c 和 g
result1 = [];
% 06-07年的数据训练,08年的数据做测试。
%SVMcg(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,accstep)
%参数 c的变化范围是 [2^cmin,2^cmax]
%参数g的变化范围是[2^gmin,2^gmax]
%cstep是c的变化步长,gstep是g的变化步长。
[bestacc,bestc,bestg] = SVMcg(Y1_train,X1_train,0,8,-1,4,2,1,1,0.9);
%跑了很久才出来
cmd = [-s 3 -t 2, -c ,num2str(bestc), -g ,num2str(bestg)];
model = libsvmtrain(Y1_train, X1_train, cmd);
[y_08_pre,mse,decision_values] = libsvmpredict(Y1_test,X1_test,model);
MAPE = mean(abs(y_test_pre-Y1_test)./Y1_test);%计算08年的MAPE
RMSE = sqrt(mean((y_test_pre-Y1_test).^2));
MAE = mean(abs(y_test_pre-Y1_test));
MSE = mean((y_test_pre-Y1_test).^2);     
clear model cmd y_test_pre mse decision_values MAPE RMSE MAE MSE bestacc bestc bestg;

%06-08年的数据做训练,09年测试。
[bestacc,bestc,bestg] = SVMcg(Y1,X1,0,8,-1,4,2,1,1,0.9);
cmd = [-s 3 -t 2, -c ,num2str(bestc), -g ,num2str(bestg)];

model = libsvmtrain(Y1, X1, cmd);
[y_09_pre,mse,decision_values] = libsvmpredict(Y2,X2,model);

其中 y_09_pre 是预测的 2009年每天24小时的电力负荷,由于并没有2009年电力负荷的真实值,所以忽略libsvmpredict的返回值mse。

SVM.cg.m

function [bestacc,bestc,bestg] = SVMcg(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,accstep)
%SVMcg cross validation by faruto
%Email:[email protected] QQ:516667408 http://blog.sina.com.cn/faruto BNU
%last modified 2009.8.23
%Super Moderator @ www.ilovematlab.cn
%% about the parameters of SVMcg 
if nargin < 10
    accstep = 1.5;
end
if nargin < 8
    accstep = 1.5;
    cstep = 1;
    gstep = 1;
end
if nargin < 7
    accstep = 1.5;
    v = 3;
    cstep = 1;
    gstep = 1;
end
if nargin < 6
    accstep = 1.5;
    v = 3;
    cstep = 1;
    gstep = 1;
    gmax = 5;
end
if nargin < 5
    accstep = 1.5;
    v = 3;
    cstep = 1;
    gstep = 1;
    gmax = 5;
    gmin = -5;
end
if nargin < 4
    accstep = 1.5;
    v = 3;
    cstep = 1;
    gstep = 1;
    gmax = 5;
    gmin = -5;
    cmax = 5;
end
if nargin < 3
    accstep = 1.5;
    v = 3;
    cstep = 1;
    gstep = 1;
    gmax = 5;
    gmin = -5;
    cmax = 5;
    cmin = -5;
end
%% X:c Y:g cg:acc
[X,Y] = meshgrid(cmin:cstep:cmax,gmin:gstep:gmax);
[m,n] = size(X);
cg = zeros(m,n);
%% record acc with different c & g,and find the bestacc with the smallest c
bestc = 0;
bestg = 0;
bestacc = 0;
basenum = 2;
for i = 1:m
    for j = 1:n
        cmd = [-v ,num2str(v), -c ,num2str( basenum^X(i,j) ), -g ,num2str( basenum^Y(i,j) )];
        cg(i,j) = libsvmtrain(train_label, train, cmd);

        if cg(i,j) > bestacc
            bestacc = cg(i,j);
            bestc = basenum^X(i,j);
            bestg = basenum^Y(i,j);
        end
        if ( cg(i,j) == bestacc && bestc > basenum^X(i,j) )
            bestacc = cg(i,j);
            bestc = basenum^X(i,j);
            bestg = basenum^Y(i,j);
        end

    end
end
%% to draw the acc with different c & g
[C,h] = contour(X,Y,cg,60:accstep:100);
clabel(C,h,FontSize,10,Color,r);
xlabel(log2c,FontSize,10);
ylabel(log2g,FontSize,10);
grid on;

 

如何在matlab里安装libsvm包

有时我们需要用到SVR(支持向量回归)方法,而matlab自带的svm工具箱不能做回归分析,于是有了安装libsvm包的打算。中间遇到一些困难,比如找不到编译器等等,经过一下午和一晚上的努力,在matlab里可以使用libsvm了。1.下载好l... 查看详情

LIBSVM 数据准备:将 Excel 数据转换为 LIBSVM 格式

...mat【发布时间】:2017-03-1902:45:47【问题描述】:我想研究如何执行LIBSVM进行回归,我目前正忙于准备数据。目前我有这种.csv和.xlsx格式的数据,我想把它转换成libsvm数据格式。到目前为止,我了解数据应该是这种格式,以便可以... 查看详情

如何使用libsvm进行回归预测

参考技术A<1>下载Libsvm、Python和Gnuplot。我用的版本分别是:Libsvm(2.8.1),Python(2.4),Gnuplot(3.7.3)。注意:Gnuplot一定要用3.7.3版,3.7.1版的有bug.<2>修改训练和测试数据的格式(可以自己用perl编个小程序):目标值第... 查看详情

libsvm的数据格式

首先介绍一下 libSVM的数据格式Label1:value2:value….Label:是类别的标识,比如上节train.model中提到的1-1,你可以自己随意定,比如-10,0,15。当然,如果是回归,这是目标值,就要实事求是了。Value:就是要训练的数据,从分类... 查看详情

如何理解 Spark MLlib 的 libsvm 的格式类型?

】如何理解SparkMLlib的libsvm的格式类型?【英文标题】:HowtounderstandtheformattypeoflibsvmofSparkMLlib?【发布时间】:2017-12-1110:07:36【问题描述】:我是学习SparkMLlib的新手。当我阅读二项式逻辑回归的示例时,我不了解“libsvm”的格式类... 查看详情

libsvm 不提供支持向量/没有支持向量

】libsvm不提供支持向量/没有支持向量【英文标题】:libsvmnotgivingsupportvectors/nosupportvectors【发布时间】:2014-06-2812:08:27【问题描述】:我正在使用jlibsvm做SVM进行回归。我的数据集非常小(42个样本)。当我使用数据集使用带有sigm... 查看详情

如何使用 libsvm 格式的数据集构建机器学习模型

】如何使用libsvm格式的数据集构建机器学习模型【英文标题】:Howtobuildamachinelearningmodelusingdatasetwithlibsvmformat【发布时间】:2016-11-0118:54:54【问题描述】:我有一个以.libsvm格式编写的数据集,我想使用机器学习算法构建一个分类... 查看详情

如何训练 libsvm 格式的图像(像素)数据以用于 Java 识别

】如何训练libsvm格式的图像(像素)数据以用于Java识别【英文标题】:Howtotrainimage(pixel)datainlibsvmformattouseforrecognitionwithJava【发布时间】:2013-07-1401:29:08【问题描述】:我想制作一个使用libsvm来识别字符的Java应用程序,但是当涉... 查看详情

libsvm

...解这一统计方法的辅助资料;      LibSVM是台湾林智仁(Chih-JenLin)教授2001年开发的一套支持向量机的库,这套库运算速度还是挺快的,可以很方便的对数据做分类或回归。由于libSVM程序小,运用灵活,输入参数... 查看详情

Spark:如何将 DataFrame 更改为 LibSVM 并执行逻辑回归

】Spark:如何将DataFrame更改为LibSVM并执行逻辑回归【英文标题】:Spark:HowchangeDataFrametoLibSVMandperformlogisticregression【发布时间】:2016-02-0607:51:06【问题描述】:我正在使用此代码将数据从Hive获取到Spark:valhc=neworg.apache.spark.sql.hive.Hi... 查看详情

如何从 libSVM 中使用的数据集转换为 weka 中使用的格式数据(*.arff 或 *.csv)

】如何从libSVM中使用的数据集转换为weka中使用的格式数据(*.arff或*.csv)【英文标题】:howtoconvertfromdatasetusinginlibSVMtofomatdatausinginweka(*.arffor*.csv)【发布时间】:2018-04-1721:15:20【问题描述】:我想使用数据集是Weka工具的libSVM的输... 查看详情

matlab安装libsvm工具箱的方法(代码片段)

...发的工具箱有很多种,下面我们要安装的是十分受欢迎的libsvm工具箱。libsvm简介LIBSVM是台湾大学林智仁(LinChih-Jen)副教授等开发设计的一个简单、易于使用和快速有效的SVM模式识别与回归的软件包,它不仅提供了编译好的可在Windo... 查看详情

Matlab 中的 Libsvm 回归预测测试集实例的相同值

】Matlab中的Libsvm回归预测测试集实例的相同值【英文标题】:LibsvmregressioninMatlabpredictsamevaluesfortestsetinstances【发布时间】:2013-07-2006:20:15【问题描述】:我正在尝试使用libsvm(Matlab库)来解决回归问题。我有一个包含192个实例的... 查看详情

使用 libsvm 具有滞后时间序列的多元回归

】使用libsvm具有滞后时间序列的多元回归【英文标题】:Multipleregressionwithlaggedtimeseriesusinglibsvm【发布时间】:2012-08-2518:56:05【问题描述】:我正在尝试开发一种电力消耗预测器。所以我想使用一整年的每日数据进行回归。我的... 查看详情

Libsvm 模型中的支持向量是如何排列的?

】Libsvm模型中的支持向量是如何排列的?【英文标题】:HowissupportvectorsarrangedinLibsvmmodel?【发布时间】:2016-06-0511:52:49【问题描述】:我想使用从Libsvm模型派生的参数来预测新数据(不是在matlab中)。请问model中的支持向量(nSV,s... 查看详情

基于r语言实现lasso回归分析

...式,逗号分隔在R中,读取数据,然后将数据转成矩阵形式加载lars包,先安装调用lars函数确定Cp值最小的步数确定筛选出的变量,并计算回归系数具体代码如下:需要注意的地方:1、数据读取的方法... 查看详情

LibSVM 输入格式

...家代码?)星期几真实性(0-非真实性,1-真实性)-标签如何格式化这些数据以输入到SVM?【问题讨论】:位置和IP地址重叠,因此您可能只想选择其中之一(实验找出哪个最 查看详情

如何区分回归分析中的分类变量和有序变量?

】如何区分回归分析中的分类变量和有序变量?【英文标题】:Howtodifferentiatecategoricalandordinalvariablesinregressionanalysis?【发布时间】:2016-03-1204:19:51【问题描述】:我正在对与房屋有关的数据进行线性回归分析。目前我有23个功能... 查看详情