关键词:
本次实验的数据是来自老师给的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个功能... 查看详情