sklearn中SVC中的参数说明与常用函数

    xiaoxiao2022-06-28  166

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

    【常用函数】

    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.]]

     


    最新回复(0)