svm.SVC(C=1.0, kernel='rbf', degree=3, gamma='auto', coef0=0.0, 
shrinking=True, probability=False, tol=0.001, cache_size=200,
 class_weight=None, verbose=False, max_iter=-1, decision_function_shape='ovr', random_state=None)

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]]#到第一个分类平面的距离最大,即分类为1

b.一对一法(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,在混洗数据时用于概率估计,没什么影响.

【常用函数】

  1. predict:返回一个数组表示个测试样本的类别。
  2. predict_probe:返回一个数组表示测试样本属于每种类型的概率。
  3. decision_function:返回一个数组表示测试样本到对应类型的超平面距离。
  4. get_params:获取当前svm函数的各项参数值。
  5. score:获取预测结果准确率。
  6. set_params:设置SVC函数的参数
  7. clf.n_support_:各类的支持向量的个数
  8. clf.support_:各类的支持向量在训练样本中的索引
  9. 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.]]

     

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐