使用Libsvm自动分类训练数据详细入门流程(一)

注:本文只讲解了在 windows x64平台下使用python语言和libsvm工具包进行数据分类训练的入门级流程,本文不涉及相关知识点和算法的讲解,所涉及的资料是博主这段时间学习查阅以及亲自动手实践后整理得来,转载请注明来源

准备工作:

1、下载libsvm压缩包及gnuplot
下载地址:
libsvm:http://www.csie.ntu.edu.tw/cjlin/cgi-bin/libsvm.cgi?+http://www.csie.ntu.edu.tw/cjlin/libsvm+zip

gnuplot:https://sourceforge.net/projects/gnuplot/files/gnuplot/

2、下载安装python以及配置环境变量,教程请自行百度

3、python编译器(个人推荐pycharm)

使用流程:

  1. 新建一个python工程

  2. 将解压缩的libsvm包放入工程目录下,工程目录示例:
    这里写图片描述

  3. 测试项目,在新建的main.py文件中加入下列代码(注意一定按要求修改下面的路径,否则无法正常运行):

	import sys
	#修改下列路径为你的工程文件路径下的libsvm包的python文件夹下的路径
	path = "C:\\Users\Tron\PycharmProjects\machineLearning\libsvm-3.22\python"
	sys.path.append(path)
	import os 
	os.chdir(path)
	from svmutil import *
	#读取样例文件
	y, x = svm_read_problem(r'../heart_scale')

    # 使用样例数据进行训练,svm_train返回的是model类,表示通过训练产生的model
    m = svm_train(y, x, '-c 4')

    # 使用后70个数据对训练的model m进行检验
    p_label, p_acc, p_val = svm_predict(y, x, m)

    # 能够将训练产生的model保留成为文件
    svm_save_model('heart_scale.model', m)

    #读取保存的model
    m = svm_load_model('heart_scale.model')
    # 预测
    p_label, p_acc, p_val = svm_predict(y, x, m)

    # 得到训练检验结果
    ACC, MSE, SCC = evaluations(y, p_label)

如果python环境配置无误,运行以上代码将会得到以下结果:
 *//恭喜,你已经快要成功了*

4.使用自己的数据进行训练,当然不是任何数据都可以进行训练,我们必须使用libsvm支持的数据格式才行,标准数据格式如下:

<label1> <index1>:<value1> <index2>:<value2>     .....  <index L>:<valueL>

label:是你要进行分类的类别的标识,如果是回归,这就是目标值
index:特征值的序列号
value:就是要训练的数据,从分类的角度来说就是特征值,数据之间用空格隔开,如果特征值为0,特征冒号前面的序号可以不连续

我们可以打开官方的样例数据heart_scale查看数据格式,样例如下:
heart_scale

博主个人拿到的数据格式如下:
trian.data

标签值在最后一列,特征值在前面,而且没有序列号,因此,我编写了一些代码来帮助转换数据格式(使用语言为python3),这些代码如下:

# -*- coding = utf-8 -*-
def read_file(file_path): # 文件读取
    fin = open(file_path, 'r')
    return fin


def save_file(data, file_name):  # 文件保存
    with open(file_name, 'w') as fout:
        fout.write(data)


def data_process(read_path, save_path):  # 文件路径,保存路径
    fin = read_file(read_path)
    result = ""
    for line in fin.readlines():
        out_line = ""
        line = line.split('\n')[0]
        temp_line = line.split(" ")
        k = 1
        out_line += temp_line[len(temp_line) - 1]
        for i in range(0, len(temp_line)-1):
            out_line += ' ' + str(k) + ':' + temp_line[i]
            k += 1
        # print(out_line)
        result += out_line + '\n'
    # print(result)
    fin.close()
    save_file(result, save_path)

将训练数据和测试数据准备好了以后就可以准备开始svm分类训练了,下面是我编写的一个测试样例:

import sys
path = "C:\\Users\Tron\PycharmProjects\machineLearning\libsvm-3.22\python"
sys.path.append(path)
import os
os.chdir(path)
from svmutil import *
if __name__ == '__main__':
	y, x = svm_read_problem('new_train.data')
    y1, x1 = svm_read_problem('new_test.data')
    m = svm_train(y, x)
    print('----------------')
    lable, acc, val = svm_predict(y1, x1, m)

对了,因为第二行代码中将默认路径放在了工程文件libsvm包下的python文件夹下,因此我将转换后的训练数据和测试数据都放在了python文件夹中方便读取。如果你的训练数据和测试数据的路径正确的话,运行以上代码将会看到以下结果:

测试1

其中,iter为迭代次数
nu是你选择的核函数类型的参数
obj为SVM文件转换为的二次规划求解得到的最小值
rho为判决函数的偏置项b
nSV为标准支持向量个数
nBSV为边界上的支持向量个数
Total nSV为支持向量总个数
Accuracy 为分类测试准确率

走到这一步,你离成功就已经很近了,还有最后也是最重要的一个步骤,那就是:参数调优

为训练函数(也就是svm_train()函数)添加参数可以让我们“更快”的得到更加优质的结果,也就是更高的准确率-----如果不考虑 过拟合 的情况。

在上述代码中,我没有为训练函数添加参数,那接下来我们就需要为svm_train函数补充一些参数使它训练出来的模型优化,那么有哪些参数可以添加呢,查阅官方文档找到svmtrain的函数原型:

 svmtrain [options] training_set_file [model_file]

其中,options就是我们要添加的参数,可用的参数以及表示的涵义如下所示:

-s  设置svm类型:

	0 – C-SVC
	
	1 – v-SVC
	
	2 – one-class-SVM
	
	3 –ε-SVR
	
	4 – n - SVR

-t设置核函数类型,默认值为2

	0 --线性核:u'*v
	
	1 --多项式核:(g*u'*v+coef0)degree
	
	2 -- RBF核:exp(-γ*||u-v||2)
	
	3 -- sigmoid核:tanh(γ*u'*v+coef0)

-d degree:设置多项式核中degree的值,默认为3

-gγ:设置核函数中γ的值,默认为1/k,k为特征(或者说是属性)数;

-r coef 0:设置核函数中的coef 0,默认值为0;

-c cost:设置C-SVC、ε-SVR、n - SVR中从惩罚系数C,默认值为1;

-n v:设置v-SVC、one-class-SVM与n - SVR中参数n,默认值0.5;

-pε:设置v-SVR的损失函数中的e,默认值为0.1;

-m cachesize:设置cache内存大小,以MB为单位,默认值为40;

-eε:设置终止准则中的可容忍偏差,默认值为0.001;

-h shrinking:是否使用启发式,可选值为0或1,默认值为1;

-b概率估计:是否计算SVC或SVR的概率估计,可选值0或1,默认0;

-wi weight:对各类样本的惩罚系数C加权,默认值为1;

-v n:n折交叉验证模式;

model_file:可选项,为要保存的结果文件,称为模型文件,以便在预测时使用

这些参数的使用方式为:参数名 + 设置的参数值,示例如下:

  svm_train(y, x, '-c 5 -g 0.03 -h 0')

那这么多的参数和参数值我们要怎么去寻找最优的参数和参数值呢,正常情况下,我们需要人工的去遍历这些参数值或者编写脚本来帮助我们遍历,好在libsvm包为我们提供了全自动的参数寻优的脚本文件 ------ tools文件夹下的 grid.py 以及 easy.py 文件。

由于篇幅有限,博主将会在下一篇文章中介绍如何使用这两个脚本文件来进行自动参数寻优以及相关的环境配置。博主也是一个刚入门的菜鸟,本文是博主在学习过程中总结出的小小经验,希望能帮助大家在入门的时候绕过博主所踩到的一些坑,如果有错误的地方还请各位大佬批评指正,如果你遇到了相关问题,也欢迎你在评论区留言,我们共同讨论解决

本文项目文件及进一步参数调优请见下一章:

下一篇:使用Libsvm自动分类训练数据详细入门流程(二)

  • 8
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值