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

本次实验的数据是来自老师给的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,‘\t%d‘,(kk-1));
               fprintf(fid,‘:‘);
               fprintf(fid,‘%d‘,B(k,kk));
           end
           k
           fprintf(fid,‘\n‘);
       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_diy\MATLAB\R2014a\toolbox\libsvm-3.21目录,将D:\softwares_diy\MATLAB\R2014a\toolbox\libsvm-3.21\matlab添加到路径

[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;
时间: 2024-11-08 03:38:10

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

poi excel自动转换成javabean 支持引用类型属性二级转换

最近项目需要使用excel导入功能,导入学生的时候需要指定所在班级,使用excel一次性导入! 将以前的代码改改支持属性内引用类的转换. 测试对象为User对象,javabean结构: private String username; private int id; private String name; private Date birthday; private long height; private double salary; private User user; 使用测试代码: M

putty秘钥转换成xhell支持的格式

使用XShell导入KEY的时候报"Failed to import the user key!"错误 这个错误表明导入的private key文件不是XShell所支持的,有三种可能: 将Public Key当成Private Key导入... 使用Putty的ppk文件,囧,请使用PUTTY的puttygen.exe转换成OPENSSH格式的 Key文件有多种格式(SSH1-RSA, SSH2-RSA, SSH2-DSA, SSH.COM, OPENSSH2-RSA, OPENSS

poi excel自己主动转换成javabean 支持引用类型属性二级转换

近期项目须要使用excel导入功能.导入学生的时候须要指定所在班级,使用excel一次性导入! 将曾经的代码改改支持属性内引用类的转换. 測试对象为User对象,javabean结构: private String username; private int id; private String name; private Date birthday; private long height; private double salary; private User user; 使用測试代码: M

读取样本下的基本行为文件并将其处理成LibSVM需要的格式

SVM是一种很强大的的机器学习分类算法,在很多诸如文本分类,图像分类,生物序列分析和生物数据挖掘,手写字符识别等领域有很多的应用.具体理论性的东西参考博文http://www.dataguru.cn/forum.php?mod=viewthread&tid=371987 看完还是似懂非懂. 最近在做SVM分类,处理对象是恶意程序动态分析生成的基本行为文件,它是1*811的0.1串,libsvm需要的格式是label index:value,刚开始想采用python实现,由于其文件操作没有很强大,

把键盘的大写字母改成小写字母,小写字母改成大写字母,数字不做处理

连续输入输出 #include<stdio.h> int main() { int ch = 0; while ((ch = getchar()) != EOF) { if (ch >= 'a'&&ch <= 'z') { putchar(ch - 32); } else if (ch >= 'A'&& ch<= 'Z') { putchar(ch+32); } else { ; } } return 0; } 原文地址:https://

成都供卵价格做试管婴儿包出生费用多少?

[138.2605.7771薇╇電][供卵包成功][借腹生子][代生孩子]若要快乐,就要随和.若要幸福,就要随缘.快乐是心的愉悦,幸福是心的满足.别和他人争吵,别和自己争吵,别和命运争吵,无计较之心,心常愉悦.尽心之余,随缘起止,随遇而安,心常满足.你随和,愉悦的是自己的心,别人计较,苦闷的是他自己.一天的心情靠随和,一生的幸福靠随缘. ????缘是天意,份在人为.生命本是一场奇异的旅行,遇见谁都是一个美丽的意外.有愿才会有缘,如果无愿,即使有缘的人,也会擦身而过.缘是天意,份在人为.无论缘深缘

将数据处理成easyui控件需要的格式

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using Newtonsoft.Json; using Newtonsoft.Json.Converters; namespace Original.Common { /// <summary> /// 将数据转换成easyui控件支持的数据格式 /// </summary>

libsvm的数据格式及制作

1.libsvm数据格式 libsvm使用的训练数据和检验数据文件格式如下: [label] [index1]:[value1] [index2]:[value2] … [label] [index1]:[value1] [index2]:[value2] … label  目标值,就是说class(属于哪一类),就是你要分类的种类,通常是一些整数. index 是有顺序的索引,通常是连续的整数.就是指特征编号,必须按照升序排列 value 就是特征值,用来train的数据,通常是一堆实数组成.

libSVM的数据格式

首先介绍一下 libSVM的数据格式 Label 1:value 2:value -. Label:是类别的标识,比如上节train.model中提到的1 -1,你可以自己随意定,比如-10,0,15.当然,如果是回归,这是目标值,就要实事求是了. Value:就是要训练的数据,从分类的角度来说就是特征值,数据之间用空格隔开 比如: -15 1:0.708 2:1056 3:-0.3333 需要注意的是,如果特征值为0,特征冒号前面的(姑且称做序号)可以不连续.如: -15 1:0.708 3: