LIBSVM2 工具及验证
官方下载的文件中tools和windows文件夹 下面分别放置了LIBSVM的一些工具及打包好可用的程序,可以用来测试及使用LIBSVM,下面记录LIVSVM工具的使用及封装的LIBSVM库的测试。
1 工具
第一个工具是subset.py ,它的主要作用是将数据集进行分解,一部分做训练集一部分做测试集。使用的方法首先要在tools文件夹下面启动cmd程序,一个方法是打开cmd然后一步一步cd到当前文件夹,另一个方法就是在文件夹目录显示的地方输入cmd然后回车。
subset的运行命令如下,opetion为可选设置,0代表按照原顺序,1代表随机顺序,dataset 代表要划分的数据文件,number 表示第一个自己的数目。[output1]表示第一个子集,数目为number ,[output2]为另一个子集。例子中运行命令后就会将数据分成两部分,svmguide2.train.txt里面有200个数据,svmguide2.test.txt是剩下的数据。
1 2 python subset.py [options] dataset number [output1] [output2] # 例子:python subset.py svmguide2 200 svmguide2.train.txt svmguide2.test.txt
第二个工具是checkdata.py ,它的主要作用是按照官方格式检查数据集有没有问题。运行命令如下,只需要设置数据文件名,没有问题就会输出No Error。
1 2 python checkdata.py dataset # 例子:python checkdata.py svmguide2.train.txt
第三个工具是grid.py ,它的主要作用是用于C-SVM分类的参数选择工具 ,通过交叉验证 得到径向基函数(RBF)核的最优参数C和gamma,安装gnuplot还会输出参数寻优的图。运行命令如下,grid_options主要设置参数的范围及交叉验证折数(默认为**-5 <= log2c <= 15,3 >= log2g >= -15**,步进均为2,一般无需设置默认就好),svm_options也无须设置,最后就是数据集名字。
1 2 grid.py [grid_options] [svm_options] dataset # grid.py svmguide2.train.txt
第四个工具easy.py ,它的主要作用是直接使用LIBSVM(必须安装gnuplot,没装所以我没运行成功这个),命令如下,dataset为训练集,testset为测试集。
1 python easy.py dataset testset
1.5 svm-scale.exe
svm-scale.exe 的主要作用是将数据集归一化,归一化对数据集的准确度有很大影响,在运行之前一定要把数据归一化。参数中-l和-u后面是归一化的范围(默认[-1, 1]),后面依次是归一化生成的文件,归一化之前的数据,> 后面是归一化后的数据。
1 2 3 4 # 对训练集 svm-scale -l -1 -u 1 -s range1 svmguide2.txt > svmguide2.scale # 对测试集 svm-scale -r range1 svmguide1.test > svmguide2.test.scale
1.6 svm-train
svm-train 就是进行模型训练的工具,训练完成后就会输出模型文件。
1 2 svm-train [options] training_set_file [model_file] # 例子:svm-train svmguide2.scale svmguide2_model.txt
1 2 3 4 5 6 7 8 9 # 输出文件截取如下 svm_type c_svc#模型类型 kernel_type rbf#核参数类型 gamma 0.050000000000000003#参数 nr_class 3#分类数 total_sv 145#形成的分类向量数量 rho 0.12443633076217939 -0.11695518593653856 -0.17414531538560016#参数 label 1 2 3#标签号 nr_sv 59 58 28
1.7 svm-predict
svm-predict 会对测试集进行测试,并给出正确率。
1 2 3 svm-predict [options] test_file model_file output_file # 例子:svm-predict svmguide2_test.scale svmguide2_model.txt predict_res.txt # 输出:Accuracy = 80.1047% (153/191) (classification)
2 验证
自己在svm的基础上对归一化,交叉验证等步骤进行封装(程序github ),数据输入定义了自己的结构体(分类号和特征,特征做成一个数组方便调整输入特征数量),下面是封装的验证结果。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 int main () { CRecogSVM testSVM; std::vector<stuFeatures>trainData = loadData ("E:\\LIB_SVM\\libsvm\\windows\\svmguide2.scale" ); testSVM.train (trainData, "E:\\LIB_SVM\\libsvm\\windows\\model2.txt" ); std::ofstream out ("E:\\LIB_SVM\\libsvm\\tools\\predict_res.txt" ) ; int false_cnt = 0 ; std::vector<stuFeatures>testData = loadData ("E:\\LIB_SVM\\libsvm\\windows\\svmguide2_test.scale" ); for (int i = 0 ; i < testData.size ();i++) { int id = testSVM.predict (testData[i], "E:\\LIB_SVM\\libsvm\\windows\\model2.txt" ); out << id << std::endl; if (id != testData[i].id) false_cnt++; } std::cout << 1.0 * (testData.size () - false_cnt) / testData.size () << std::endl; cin.get (); return 0 ; }
2.1 交叉验证
自己封装的交叉验证和官方的比较,官方并没有遍历所有组合,而自己遍历了所有组合,且结果稍有不同,但差别不大,验证的数据集对预测结果没有影响。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 # 官方数据(部分) log2c=5 log2g=-7 rate=79.5 log2c=-1 log2g=-7 rate=56.0 log2c=5 log2g=-1 rate=80.5 log2c=-1 log2g=-1 rate=76.0 log2c=11 log2g=-7 rate=81.5 log2c=11 log2g=-1 rate=80.5 log2c=5 log2g=-13 rate=56.0 log2c=-1 log2g=-13 rate=56.0 log2c=11 log2g=-13 rate=79.5 log2c=-3 log2g=-7 rate=56.0 log2c=-3 log2g=-1 rate=56.0 log2c=-3 log2g=-13 rate=56.0 # 自己测试得到(部分) log2c=5 log2g=-15 rate=56.000000 log2c=5 log2g=-13 rate=56.000000 log2c=5 log2g=-11 rate=61.500000 log2c=5 log2g=-9 rate=77.500000 log2c=5 log2g=-7 rate=78.000000 log2c=5 log2g=-5 rate=81.500000 log2c=5 log2g=-3 rate=82.000000 log2c=5 log2g=-1 rate=79.500000 log2c=5 log2g=1 rate=65.000000 log2c=5 log2g=3 rate=56.000000 log2c=7 log2g=-15 rate=56.000000 log2c=7 log2g=-13 rate=61.000000 log2c=7 log2g=-11 rate=77.000000
2.2 训练
训练结果对比如下,也稍有不同。
1 2 3 4 5 6 7 8 9 # 自己的结果 svm_type c_svc kernel_type rbf gamma 0.5 nr_class 3 total_sv 156 rho 0.00024106569023043715 -0.22084643493646292 -0.16816789475272773 label 1 2 3 nr_sv 73 56 27
2.3 预测
预测结果是 81.1518,甚至比官方结果稍高。
3 参考
libsvm库简介及使用
LIBSVM使用说明、简介及感悟
LIBSVM安装和使用实验(Windows 10)