svm.SVC中各个参数含义:
1.C:根据官方文档,这是一个软间隔分类器,对于在边界内的点有惩罚系数C,C的取值在0-1。0之间,默认值为1.0
C越大代表这个分类器对在边界内的噪声点的容忍度越小,分类准确率高,但是容易过拟合,泛化能力差。所以一般情况下,应该适当减小C,对在边界范围内的噪声有一定容忍。
2.kernel:核函数类型,默认为‘rbf’,高斯核函数,exp(-gamma|u-v|^2)
其他可选项有:
'linear':线性核函数,u'*v
'poly':多项式核函数,(gamma*u'*v + coef0)^degree
'sigmoid':sigmoid核函数,tanh(gamma*u'*v + coef0)
3.degree:多项式核的阶数,默认为3
对其他核函数不起作用
4.gamma:核函数系数,只对'rbf','poly','sigmoid'起作用
默认为'auto',此时值为样本特征数的倒数,即1/n_features.
5.coef0:核函数的常数项,只对'poly','sigmoid'有用
6.shrinking:是否启用启发式收缩方式,默认为True
启发式收缩方式就是:如果能预知哪些变量对应着支持向量,则只要在这些样本上训练就够了,其他样本可不予考虑,这不影响训练结果,但降低了问题的规模并有助于迅速求解,起到一个加速训练的效果。
7.tol:停止训练的误差精度,默认值为0.001
8.probability:默认为False,决定最后是否按概率输出每种可能的概率,但需注意最后的预测函数应改为clf.predict_proba。
x=[[1,2,3]. [2,3,4], [54,6,7], [5,8,2] ] y=[1,2,1,2] clf=svm.SVC(probability=True) clf.fit(x,y) print clf.predict_proba([10,15,13]) output: [[ 0.62913274 0.37086726]]9.class_weight:默认为None,给每个类别分别设置不同的惩罚参数C,如果没有给,则会给所有类别都给C=1,即前面指出的参数C.
x=[[1,2,3],[11,18,16],[22,27,26],[33,34,39]] y=[2,1,2,3] clf=svm.SVC(probability=True,kernel='rbf', degree=2,gamma=0.1,decision_function_shape="ovr",class_weight={1:10}) clf.fit(x,y) print clf.predict([10,15,13])#预测的分类结果 print clf.predict_proba([10,15,13])#输出属于每一类的概率 print clf.decision_function([10,15,13])#每个点与分类边界的距离 output: [2] [[ 0.23039413 0.44680601 0.32279986]] [[ 1.01201676 2.48798324 -0.5 ]]10.verbose:是否启用详细输出,一般为Flase。
11.max_iter:int参数 默认为-1,最大迭代次数,如果为-1,表示不限制
12.decision_function_shape:决定了分类时,是一对多的方式来构建超平面,还是一对一。'ovo'还是'ovr'。
a.一对多法(one-versus-rest,简称1-v-r SVMs)。训练时依次把某个类别的样本归为一类,其他剩余的样本归为另一类,这样k个类别的样本就构造出了k个SVM。分类时将未知样本分类为具有最大分类函数值的那类。
OVR模式: x=[[1,2,3],[11,18,16],[22,27,26],[33,34,39]] y=[1,1,2,3] clf=svm.SVC(probability=True,kernel='rbf', degree=2,gamma=0.1,random_state=2,decision_function_shape="ovr") clf.fit(x,y) print clf.predict([10,15,13]) print clf.predict_proba([10,15,13]) print clf.decision_function([10,15,13]) output: [1] [[ 0.34890691 0.32548254 0.32561055]]#属于类别1的概率值最大 [[ 2.5 0.75 -0.25]]#到第一个分类平面的距离最大,即分类为1b.一对一法(one-versus-one,简称1-v-1 SVMs)。其做法是在任意两类样本之间设计一个SVM,因此k个类别的样本就需要设计k(k-1)/2个SVM。当对一个未知样本进行分类时,最后得票最多的类别即为该未知样本的类别。Libsvm中的多类分类就是根据这个方法实现的。
x=[[1,2,3],[11,18,16],[22,27,26],[33,34,39],[3,3,9],[13,24,49]] y=[1,1,2,3,4,3] from sklearn.svm import SVC clf=svm.SVC(probability=True,kernel='rbf', degree=2,gamma=0.1,random_state=2,decision_function_shape="ovo") clf.fit(x,y) print(clf.predict([[10,15,13]])) print(clf.predict_proba([[10,15,13]])) print(clf.decision_function([[10,15,13]])) output: [1] [[ 0.23456566 0.23289301 0.29844741 0.23409392]] [[ 5.74784310e-01 1.49568619e-01 5.81831270e-01 -5.00000000e-01 -8.38002527e-10 4.99999999e-01]]#4类有6个一对一的超平面,得票最多的类别为最终类别13.random_state:默认为None,在混洗数据时用于概率估计,没什么影响.
【常用函数】
predict:返回一个数组表示个测试样本的类别。predict_probe:返回一个数组表示测试样本属于每种类型的概率。decision_function:返回一个数组表示测试样本到对应类型的超平面距离。get_params:获取当前svm函数的各项参数值。score:获取预测结果准确率。set_params:设置SVC函数的参数clf.n_support_:各类的支持向量的个数clf.support_:各类的支持向量在训练样本中的索引clf.support_vectors_:全部支持向量 接着上面的例子训练出的clf: print(clf.n_support_) print(clf.support_) print(clf.support_vectors_) output: [2 1 2 1]#共四类,支持向量分别有2,1,2,1个 [0 1 2 3 5 4]#第一类的支持向量有2个,在训练集中对应的索引为0和1,后面三类同理 [[ 1. 2. 3.] [ 11. 18. 16.] [ 22. 27. 26.] [ 33. 34. 39.] [ 13. 24. 49.] [ 3. 3. 9.]]