此文献给帆帆,笔芯~
一、导入相应的库
from sklearn import svm
import numpy as np
from sklearn.model_selection import train_test_split
1.sklearn封装了大量的机器学习算法,甚至包含一些数据集。这里 引入svm相关函数。
官方学习文档
2.NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库,有助于利用python进行机器学习。
3.sklearn.model_selection,用于划分数据集,见第四部分。
二、读取数据
path='c:/DATA/DATA1000.txt'
data=np.loadtxt(path,dtype=float,delimiter=',')
使用numpy中的loadtxt函数来读取数据。
参数说明:
1.fname:读取数据路径
2.dtype:数据类型,常用str,float
3.delimiter:分隔符,例如 逗号
4.converters:将数据列与转换函数进行映射的字典。eg:{1:fun},含义是将第2列对应转换函数进行转换。如果前期数据集都在预处理阶段处理成合适的样子,就可以不用这个参数。
三、划分数据与标签
在我使用的数据集里,经过预处理之后如上图所示。前四列是数据,第五列是标签,标签由0或1表示,且全部由逗号相隔。
这一步的作用是告诉分类器 前四列是训练根据,即特征值,第五列是训练结果,即标签。
#x是数据,y为标签
x,y=np.split(data,indices_or_sections=(4,),axis=1)
split()参数说明
1.data:要划分的数据,这个在前面有说明,就是通过loadtxt读取进来的数据
2.indices_or_sections:如果是一个整数n,就平均分成n份;如果是带括号的,例如(4,):分为两部分,前四列和之后的其他部分。
3.axis:沿着哪一个维度进行切分:=0,横向切分;=1纵向切分。
四、划分训练集和测试集
我们需要将整个数据集划分为训练集和测试集两部分。
训练集训练分类器svm,并用测试集来测试准确率。
train_data,test_data,train_label,test_label=sklearn.model_selection.train_test_split(x,y,random_state=1,train_size=0.6,test_size=0.4)
参数说明:
1.x:特征值
2.y:标签
3.random_state:是随机数的种子。
随机数种子:其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。比如你每次都填1,其他参数一样的情况下你得到的随机数组是一样的。但填0或不填,每次都会不一样。随机数的产生取决于种子,随机数和种子之间的关系遵从以下两个规则:种子不同,产生不同的随机数;种子相同,即使实例不同也产生相同的随机数。
4.train_size:训练集所占的比例
5.test_size:测试集所占的比例
五、训练SVM
classifier=svm.SVC(C=1,kernel='rbf',gamma=1,decision_function_shape='ovr')#设置训练器
classifier.fit(train_data,train_label.ravel())#对训练集部分进行训练
参数说明:
svm.SVC参数详细说明
简单说一下我的理解:kernel='liner’时为线性分类,此时不再需要其他参数。
但是 当数据线性不可分时(如下图),就需要将数据映射到高维中,进行求解。
高维时kernel=‘rbf’,在这种情况下,有两个比较重要的参数:C,gamma。这两个参数的取值需要自己想办法确定,比如可以使用大多数人的选择。当然也有一些特殊的算法来找到最优的参数。
1.网格搜索法:简单理解就是在一定的范围内遍历。
优点:简单,可以找到全局最优。缺点:效率低,非常不适用于大数据集。
2.遗传算法、粒子群算法、蚁群算法,我还在学习中~
六、计算准确率
print("训练集:",classifier.score(train_data,train_label))
print("测试集:",classifier.score(test_data,test_label))
这一步直接调用函数即可。