windows下用命令行调用libsvm进行分类

目标:对4类特征样本利用SVM进行分类。

步骤1:对4类特征样本(样本大小为120*7)划分训练集和测试集,分类标签与之一一对应,将这两个数据集和对应标签分别存放在train_sample.mat、test_sample.mat,其中分类标签分别放在两个mat文件的第一列。
步骤2:对mat格式的文件转换为libsvm所用格式。
步骤3:运用win+R和cmd进入windows的命令行提示符窗口。
步骤4:输入命令,对数据进行缩放、训练、测试,得到分类精度。

一、libsvm工具箱包含的内容:
(1)Java文件夹,主要应用于java平台;
(2)Python文件夹,是用来参数优选的工具,稍后介绍;
(3)tools文件夹,主要包含四个python文件,用来数据集抽样(subset),参数优选(grid),集成测试(easy),数据检查(checkdata);
(4)windows文件夹包含libSVM四个exe程序包,我们所用的库就是他们,里面还有个heart_scale,是一个样本文件,可以用记事本打开,用来测试用的。
(5)svm-toy文件,一个可视化的工具,用来展示训练数据和分类界面,里面是源码,其编译后的程序在windows文件夹下;
(6)heart_scale文件,是测试用的训练文件
(7)其他.h和.cpp文件都是程序的源码,可以编译出相应的.exe文件。其中,最重要的是svm.h和svm.cpp文件,svm-predict.c、svm-scale.c和svm-train.c(还有一个svm-toy.c在svm-toy文件夹中)都是调用的这个文件中的接口函数,编译后就是windows下相应的四个exe程序。另外,里面的README跟FAQ是很好的帮助文件。

二、libsvm数据格式
[label] [index1] [value1] [index2] [value2] …
[label] [index1] [value1] [index2] [value2] …
label:目标值,分类标签,通常是一些整数。如果是回归,目标值是连续的取值。
index:索引值,是整数升序排列。
value:特征值(属性数据),用来train的数据,通常是一堆实数组成。
从参考博客[1]中复制了write4libsvm.m,这是一个格式转换程序,不需要看懂,在matlab的命令窗口中输入调用函数名,然后选择需要转换的数据文件即可。write4libsvm.m代码如下:

function write4libsvm 
% 为了使得数据满足libsvm的格式要求而进行的数据格式转换 注意原始格式是mat的数据格式,转化成txt或者dat都可以。
% 原始数据保存格式为: 
%             [标签 第一个属性值 第二个属性值...] 
% 转换后文件格式为满足libsvm的格式要求,即: 
%             [标签 1:第一个属性值 2:第二个属性值 3:第三个属性值 ...] 
% Genial@ustc 
% 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 

选择保存的文本类型为txt格式,但是后来发现在windows的命令行提示符窗口输入命令却出现了问题。关键的解决方法会在后面讲解。

三、数据缩放
svm-scale是用来对原始样本进行缩放的,范围可以自己定,一般是[0,1]或[-1,1]。缩放的目的主要是:(1)防止某个特征过大或过小,从而在训练中起的作用不平衡;(2)为了计算速度,因为在核计算中,会用到内积运算或exp运算,不平衡的数据可能造成计算困难。
用法:svm-scale [-l lower -u upper]
[-y y_lower y_upper]
[-s save_filename]
[-r restore_filename] filename
其中,[]中都是可选项:-l:设定数据下限;lower:设定的数据下限值,缺省为-1;-u设定数据上限;upper:设定的数据上限值,缺省为1;-y:是否对目标值同时进行缩放;y_lower为下限值,y_upper为上限值;-s save_filename:表示将缩放的规则保存为文件save_filename;-r restore_filename:表示将按照已经存在的规则文件restore_filename进行缩放;filename:待缩放的数据文件,文件格式按照libSVM格式。
例如:
(1)将libsvmtrain_sample文件转换为libSVM格式
svm-scale -l 0 -u 1 -s data.range libsvmtrain_sample>train_scale.txt
(2)将libsvmtest_sample文件按照已经存在的规则文件data.range进行缩放,转换为libSVM格式
svm-scale -r data.range libsvmtest_sample>test_scale.txt

四、训练数据svm-train
svm-train主要实现对训练数据集的训练,并可以获得SVM模型。
用法: svm-train [options] training_set_file [model_file]
其中:(1)options为操作参数,可用的选项即表示的涵义参考博客[5];
(2) training_set_file为需要进行训练的数据(已经过缩放);
(3) model_file为要保存的结果文件,称为模型文件,以便在预测时使用;
训练完了之后,我们就可以对数据进行预测了,但训练的数据未必是最优参数,所以需要进一步优化,这里我们暂且跳过这一步,读者可参考博客[3],里面有详细的过程。

五、测试数据svm- predict
用法:svmpredict [options] test_file model_file output_file
其中:(1)options为操作参数,可用的选项即表示的涵义参考博客[5];
(2)test_file:是要进行预测的数据文件,格式也要符合libSVM格式,即使不知道label的值,也要任意填一个,svmpredict会在output_file中给出正确的label结果,如果知道label的值,就会输出正确率;
(3) model_file: 前面svm-train训练好的模型;
(4)output_file:是svmpredict的输出文件,表示预测的结果值。

六、实例
运用win+R和cmd进入windows的命令行提示符窗口。输入命令如下。
输入E: (表示进入E盘),接着出现E:>,再输入cd\路径(表示进入当前盘根目录)
然后就输入以下四行代码。
数据缩放:svm-scale -l 0 -u 1 -s data.range libsvmtrain_sample>train_scale.txt
svm-scale -r data.range libsvmtest_sample>test_scale.txt
数据训练:svm-train -t 0 -c 1.4142 train_scale.txt model
数据测试:svm-predict test_scale.txt model predict_result
会出现如图1所示问题,显示无法打开这个文件。
图1 显示无法打开libsvmtrain_sample
解决的办法就是改变训练数据文件和测试数据文件的格式,去点.txt后缀,文件图标会变为空白,但仍可以用记事本打开。
重新输入上述命令,问题得到解决,如图2所示。
图2 输入的命令以及测试结果
测试结果显示,分类的精度为90%。

参考博客
[1]如何转成libsvm支持的数据格式并做回归分析。
[2] MATLAB环境使用LIBSVM-数据格式解析(二)。
[3]libsvm简介和函数调用参数说明。
[4]windows下LIBSVM使用方法及例子。
[5] svmtrain和svmpredict的用法和参数含义。

猜你喜欢

转载自blog.csdn.net/weixin_45317919/article/details/108433618