【ML-9-5】SVM的sklearn.svm.SVC()函数应用

经常用到sklearn中的SVC函数,这里把文档中的参数:

本身这个函数也是基于libsvm实现的,所以在参数设置上有很多相似的地方。(PS: libsvm中的二次规划问题的解决算法是SMO)。

sklearn.svm.SVC(C=1.0, kernel='rbf', degree=3, gamma='auto', coef0=0.0, shrinking=True, probability=False,

Tol=0.001, cache_size200, class_weight=None, verbose=False,  max_iter=-1, 

decision_function_shape=None,random_state=None)

参数:

1、C:C-SVC的惩罚参数C默认值是1.0,C越大,相当于惩罚松弛变量,希望松弛变量接近0,即对误分类的惩罚增大,趋向于对训练集全分对的情况,这样对训练集测试时准确率很高,但泛化能力弱。C值小,对误分类的惩罚减小,允许容错,将他们当成噪声点,泛化能力较强。

C一般可以选择为:0.0001 到10000,选择的越大,表示对错误例惩罚程度越大,可能会导致模型过拟合

2、kernel :核函数,默认是rbf,可以是'linear', 'poly', 'rbf', 'sigmoid', 'precomputed' 

    0 – 线性:u'v

    1 – 多项式:(gamma*u'*v + coef0)^degree

    2 – RBF函数:exp(-gamma|u-v|^2)

    3 –sigmoid:tanh(gamma*u'*v + coef0)

数学表达式:

3、degree :多项式poly函数的维度,默认是3,选择其他核函数时会被忽略。建议设置为2;

4、gamma :'rbf','poly'和'sigmoid'的核系数。当前默认值为'auto',它使用1 / n_features,如果gamma='scale'传递,则使用1 /(n_features * X.std())作为gamma的值。当前默认的gamma''auto'将在版本0.22中更改为'scale'。

5、 coef0 :核函数的常数项。对于'poly'和 'sigmoid'有用。

6、probability :默认False。是否启用概率估计。必须在调用fit之前启用它,并且会减慢该方法的速度。

7、shrinking :默认为true,是否采用shrinking heuristic(收缩启发式)方法

8、 tol :默认为1e-3,停止训练的误差值大小,

9、cache_size :默认为200,核函数cache缓存大小

10、 class_weight :{dict,'balanced'}。将类i的参数C设置为SVC的class_weight [i] * C. 如果没有给出,所有类都应该有一个权重。"平衡"模式使用y的值自动调整与输入数据中的类频率成反比的权重n_samples / (n_classes * np.bincount(y))

11、verbose :默认False。启用详细输出。请注意,此设置利用libsvm中的每进程运行时设置,如果启用,则可能无法在多线程上下文中正常运行。

12、max_iter :最大迭代次数。-1为无限制。

13、decision_function_shape :'ovo', 'ovr' or None, default=None3

14、random_state :默认 无。伪随机数生成器的种子在对数据进行混洗以用于概率估计时使用。如果是int,则random_state是随机数生成器使用的种子; 如果是RandomState实例,则random_state是随机数生成器; 如果没有,随机数生成器所使用的RandomState实例np.random。

主要调节的参数有:C、kernel、degree、gamma、coef0。

   

与核函数相对应的libsvm参数建议:

1)对于线性核函数,没有专门需要设置的参数

2)对于多项式核函数,有三个参数。-d用来设置多项式核函数的最高此项次数,也就是公式中的d,默认值是3。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/k(k是类别数)。-r用来设置核函数中的coef0,也就是公式中的第二个r,默认值是0。

3)对于RBF核函数,有一个参数。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/k(k是类别数)。

4)对于sigmoid核函数,两个参数g以及r:gamma一般可选1 2 3 4,coef0选0.2 0.4 0.60.8 1

属性:

support_ :支持向量索引。

support_vectors_ :支持向量。

n_support_ :每一类的支持向量数目

dual_coef_ :决策函数中支持向量的系数

coef_ :赋予特征的权重(原始问题中的系数)。这仅适用于线性内核。

intercept_ :决策函数中的常量。

  

---实验练习

对身高体重的数据进行svm分类,要求分别使用线性函数、三次多项式函数、径向基函数和Sigmoid函数作为核函数进行模型训练,并观察分类效果(利用plt绘制样本点,胖的样本点与瘦的样本点用颜色区分,结果绘制出分类曲线):

   

代码:

   
%matplotlib inline  
import numpy as np  
import scipy as sp  
from sklearn import svm
from sklearn.model_selection import train_test_split
# 注意: 如果sklearn是0.18之前的版本,则执行下面的语句:
# from sklearn.cross_validation import train_test_split  
import matplotlib.pyplot as plt  
#导入数据
data   = []  
labels = []  
# 读取身高体重数据集
with open("./Input/data.txt") as ifile:  
        for line in ifile:  
            tokens = line.strip().split(' ')  
            # data列表存储身高体重数据
            data.append([float(tk) for tk in tokens[:-1]]) 
            # label列表存储此人被定义为胖还是瘦
            labels.append(tokens[-1])  
# x: 以array形式存储身高体重构成的坐标
x = np.array(data)  
# labels: 将label列表array化
labels = np.array(labels)  
y = np.zeros(labels.shape) 
# y:存储0,1化的体重标签,值为0说明此人被定义为瘦,值为1说明此人定义为胖
y[labels=='fat']=1  
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.0)  
# 建立画布(可以不用关心具体的实现过程)
h = .02    
x_min, x_max = x_train[:, 0].min() - 0.1, x_train[:, 0].max() + 0.1  
y_min, y_max = x_train[:, 1].min() - 1, x_train[:, 1].max() + 1  
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),  
                     np.arange(y_min, y_max, h))  
# 绘图名称
titles = ['LinearSVC (linear kernel)',  
          'SVC with polynomial kernel',  
          'SVC with RBF kernel',  
          'SVC with Sigmoid kernel'] 

'''
svm.SVC(kernel='linear'):核函数为线性函数
svm.SVC(kernel='poly', degree=3):核函数为3次多项式函数,如果degree=n,则使用的核函数是n次多项式函数
svm.SVC():核函数为径向基函数
svm.SVC(kernel='sigmoid'):核函数为Sigmoid函数
'''
#以下是参数的重点部分:
# 核函数为线性函数
clf_linear  = svm.SVC(kernel='linear',C=50).fit(x, y)
# 核函数为多项式函数
clf_poly    = svm.SVC(kernel='poly', degree=2,coef0=10).fit(x, y)   
# 核函数为径向基函数
clf_rbf     = svm.SVC(kernel='rbf',C=100,gamma=0.5).fit(x, y)  
# 核函数为Sigmoid函数
clf_sigmoid = svm.SVC(kernel='sigmoid',C=1000000,gamma=0.0001,coef0=-1.5).fit(x, y)  

for i, clf in enumerate((clf_linear, clf_poly, clf_rbf, clf_sigmoid)):  
    answer = clf.predict(np.c_[xx.ravel(), yy.ravel()]) 
    plt.subplot(2, 2, i + 1)  
    plt.subplots_adjust(wspace=0.4, hspace=0.4)      
    # 将数据点绘制在坐标图上  
    z = answer.reshape(xx.shape)  
    plt.contourf(xx, yy, z, cmap=plt.cm.Paired, alpha=0.8)  
  
    plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train, cmap=plt.cm.Paired)  
    plt.xlabel('Height(m)')  
    plt.ylabel('Weight(kg)')  
    plt.xlim(xx.min(), xx.max())  
    plt.ylim(yy.min(), yy.max())  
    plt.xticks(())  
    plt.yticks(())  
    plt.title(titles[i])  
plt.show()  

实验结果:

   

   

   

   

   

   

   

   

   

   

   

   

   

   

posted @ 2019-11-14 23:00  忆凡人生  阅读(9727)  评论(3编辑  收藏  举报