精华内容
下载资源
问答
  • 2018-04-09 20:52:09

    SVM模型超参数优化目前常用的方法是让C和g在一定的范围内取值,对于取定的c和g,把训练集作为原始数据集利用K-CV方法得到在此对c和g组合下验证集的分类准确率,最终取得训练集验证分类准确率最高的那组c和g作为最佳参数。对于可能会有多组的c和g对应着最高的验证分类准备率的情况下,选取能够达到最高验证分类准确率中参数c最小的那对c和g作为最佳的参数,在取最小c的情况下,可能还会存在多组g,那么就选取搜索到的第一组c和g作为最佳参数。因为惩罚系数c值过大,会导致过于拟合的情况,模型泛化能力不好。

    这种寻优思想可以用网格参数优化来实现。惩罚参数的变化范围在[2^cmin,2^cmax],即在该范围内寻找最佳的参数c,默认值为cmin=-8,cmax=8,。RBF中的g变化范围也在[2^gmin,2^gmax],,默认值同样为为gmin=-8,gmax=8。c,g分别构成横轴和纵轴,cstep,gstep分别是进行网格参数须有时 c和g的步进太小,即c的取值为 2^cmin,2^(cmin+cstep),…,2^cmax ,同理g,默认步进取值为1,通过这种方法找到最佳的c和g组合。

    import numpy as np
    from sklearn import svm
    from sklearn.linear_model import LogisticRegression
    
    my_matrix=np.loadtxt("E:\\pima-indians-diabetes.txt",delimiter=",",skiprows=0) 
    
    lenth_x=len(my_matrix[0])
    
    data_y=my_matrix[:,lenth_x-1]
    
    data_x=my_matrix[:,0:lenth_x-1]
    print(data_x[0:2],len(data_x[0]),len(data_x))
    data_shape=data_x.shape
    data_rows=data_shape[0]
    data_cols=data_shape[1]
    
    data_col_max=data_x.max(axis=0)#获取二维数组列向最大值
    data_col_min=data_x.min(axis=0)#获取二维数组列向最小值
    for i in xrange(0, data_rows, 1):#将输入数组归一化
        for j in xrange(0, data_cols, 1):
            data_x[i][j] = \
                (data_x[i][j] - data_col_min[j]) / \
                (data_col_max[j] - data_col_min[j])
    print(data_x[0:2])
    (array([[   6.   ,  148.   ,   72.   ,   35.   ,    0.   ,   33.6  ,
               0.627,   50.   ],
           [   1.   ,   85.   ,   66.   ,   29.   ,    0.   ,   26.6  ,
               0.351,   31.   ]]), 8, 768)
    [[ 0.35294118  0.74371859  0.59016393  0.35353535  0.          0.50074516
       0.23441503  0.48333333]
     [ 0.05882353  0.42713568  0.54098361  0.29292929  0.          0.39642325
       0.11656704  0.16666667]]
    
    n_train=int(len(data_y)*0.7)#选择70%的数据作为训练集,15%的数据作为超参数选择,15%做验证
    n_select=int(len(data_y)*0.85)
    X_train=data_x[:n_train]
    y_train=data_y[:n_train]
    print(len(y_train))
    X_select=data_x[n_train:n_select]
    y_select=data_y[n_train:n_select]
    print(len(y_select))
    X_test=data_x[n_select:]
    y_test=data_y[n_select:]
    print(len(y_test))
    537
    115
    116
    
    result =[]
    for i in (-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5):
        C = 2 ** i
        for j in (-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5):
            G = 2 ** j
            clf1 = svm.SVC(kernel='rbf', gamma=G, C=C).fit(X_train,y_train)
            y_predictions1=clf1.predict(X_select)
            k=0
            for i in range(len(y_select)):
                if y_predictions1[i]==y_select[i]:
                    k+=1
            result.append([C,G,k])
    result1 = sorted(result, key=lambda x:x[2])
    
    for i in result1:
        print i
    [0.03125, 0.03125, 81]
    [0.03125, 0.0625, 81]
    [0.03125, 0.125, 81]
    [0.03125, 0.25, 81]
    [0.03125, 0.5, 81]
    [0.03125, 1, 81]
    [0.03125, 2, 81]
    [0.03125, 4, 81]
    [0.03125, 8, 81]
    [0.03125, 16, 81]
    [0.03125, 32, 81]
    [0.0625, 0.03125, 81]
    [0.0625, 0.0625, 81]
    [0.0625, 0.125, 81]
    [0.0625, 0.25, 81]
    [0.0625, 0.5, 81]
    [0.0625, 1, 81]
    [0.0625, 8, 81]
    [0.0625, 16, 81]
    [0.0625, 32, 81]
    [0.125, 0.03125, 81]
    [0.125, 0.0625, 81]
    [0.125, 0.125, 81]
    [0.125, 0.25, 81]
    [0.125, 16, 81]
    [0.125, 32, 81]
    [0.25, 0.03125, 81]
    [0.25, 0.0625, 81]
    [0.25, 0.125, 81]
    [0.25, 0.25, 81]
    [0.25, 32, 81]
    [0.5, 0.03125, 81]
    [0.5, 0.0625, 81]
    [0.5, 32, 81]
    [1, 0.03125, 81]
    [0.125, 0.5, 82]
    [0.0625, 2, 83]
    [0.5, 0.125, 83]
    [0.0625, 4, 84]
    [1, 0.0625, 84]
    [2, 0.03125, 84]
    [32, 16, 86]
    [0.125, 8, 87]
    [0.25, 16, 87]
    [8, 32, 87]
    [16, 32, 87]
    [32, 32, 87]
    [4, 32, 88]
    [8, 16, 90]
    [16, 16, 90]
    [0.125, 1, 91]
    [8, 0.125, 91]
    [2, 32, 92]
    [4, 0.25, 92]
    [16, 0.0625, 92]
    [16, 0.125, 92]
    [16, 8, 92]
    [32, 0.125, 92]
    [0.125, 4, 93]
    [0.5, 1, 93]
    [1, 0.125, 93]
    [1, 0.25, 93]
    [1, 0.5, 93]
    [1, 1, 93]
    [2, 0.0625, 93]
    [2, 0.125, 93]
    [2, 0.25, 93]
    [2, 0.5, 93]
    [4, 0.03125, 93]
    [4, 0.0625, 93]
    [4, 16, 93]
    [8, 0.25, 93]
    [16, 0.25, 93]
    [32, 0.0625, 93]
    [32, 8, 93]
    [0.25, 0.5, 94]
    [0.25, 1, 94]
    [0.25, 2, 94]
    [0.5, 0.25, 94]
    [4, 0.125, 94]
    [4, 0.5, 94]
    [8, 0.03125, 94]
    [8, 0.0625, 94]
    [16, 0.03125, 94]
    [16, 1, 94]
    [32, 0.03125, 94]
    [32, 4, 94]
    [0.125, 2, 95]
    [0.25, 4, 95]
    [0.5, 0.5, 95]
    [0.5, 2, 95]
    [1, 32, 95]
    [8, 0.5, 95]
    [8, 2, 95]
    [8, 8, 95]
    [16, 2, 95]
    [32, 0.25, 95]
    [32, 0.5, 95]
    [32, 2, 95]
    [0.25, 8, 96]
    [0.5, 4, 96]
    [0.5, 16, 96]
    [1, 2, 96]
    [2, 1, 96]
    [16, 0.5, 96]
    [16, 4, 96]
    [32, 1, 96]
    [0.5, 8, 97]
    [1, 4, 97]
    [1, 8, 97]
    [1, 16, 97]
    [2, 2, 97]
    [2, 4, 97]
    [2, 8, 97]
    [2, 16, 97]
    [4, 2, 97]
    [4, 8, 97]
    [8, 1, 97]
    [8, 4, 97]
    [4, 1, 98]
    [4, 4, 98]
    

    我们可以选择C=0.5,G=8作为模型的超参数

    clf_final= svm.SVC(kernel='rbf', gamma=8, C=0.5).fit(X_train,y_train)
    clf2=LogisticRegression()#模型2逻辑回归还是选择默认参数
    clf2.fit(X_train,y_train)
    LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
              intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,
              penalty='l2', random_state=None, solver='liblinear', tol=0.0001,
              verbose=0, warm_start=False)
    
    X_test_final=data_x[n_train:]
    y_test_final=data_y[n_train:]
    y_predictions_final=clf_final.predict(X_test_final)
    y_predictions2=clf2.predict(X_test_final)
    k,h=0,0
    for i in range(len(y_test_final)):
        if y_predictions_final[i]==y_test_final[i]:
            k+=1
    for i in range(len(y_test_final)):
        if y_predictions2[i]==y_test_final[i]:
            h+=1 
    print(k,h)
    (186, 181)
    
    accuracy_svm=float(k)/float(len(y_test_final))
    accuracy_LogR=float(h)/float(len(y_test_final))
    print"The accuracy of SVM is %f, and the accuracy of LogisticRegression is %f"%(accuracy_svm,accuracy_LogR)
    The accuracy of SVM is 0.805195, and the accuracy of LogisticRegression is 0.783550
    

    通过对SVM超参数优化后,可以明显看出模型预测结果准确率超过了逻辑回归,比第一次和第二次实验只使用默认参数效果来的好。

    更多相关内容
  • 乳腺癌诊断SVM模型实验报告.docx
  • SVM模型详解

    千次阅读 2022-03-25 08:53:21
    一、SVM定义与解决目标 SVM是一个二类分类器。其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终可转化成一个凸二次规划问题的求解。即找到一个超平面,使两类数据离超平面越远越...

    入门小菜鸟,希望像做笔记记录自己学的东西,也希望能帮助到同样入门的人,更希望大佬们帮忙纠错啦~侵权立删。

    目录

    一、SVM定义与解决目标

    二、SVM算法原理

    1、线性可分

    (1)无松弛变量

    (2)带松弛变量​和惩罚因子C

    2、线性不可分

    (1)核函数定义和应用背景

    (2)线性核函数 LINEAR

    (3)高斯径向基核函数 RBF

    (4)多项式核函数 POLY

    (5)神经元的非线性作用核函数 Sigmoid

    (6)核函数选择技巧

    三、SVM代码实现


    一、SVM定义与解决目标

    SVM是一个二类分类器。其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终可转化成一个凸二次规划问题的求解。即找到一个超平面,使两类数据离超平面越远越好,这样就可以让模型对新的数据分类更准确,即分类器更加稳定。

    🎈支持向量:离分隔超平面最近的一些点

    🎈间隔最大化:寻找最大化支持向量到分隔超平面的距离,以此为目标来求出分隔超平面

    🎈数据分类的类别

    (1)线性可分

    (2)线性不可分


    二、SVM算法原理

    1、线性可分

    分为2种:无松弛变量和带松弛变量

    以2个特征为例:

    如下图所示:如何分类黑点点和红点点,我们直观来看粉色那条线作为分界最好(因为该超平面对训练样本局部扰动的容忍性最好,即稳定性更高)

    🌳原始待分类的数据:(x11,x12,y1),……,(xm1,xm2,ym)

    x1,x2就是不同维的特征

    y的取值为1或-1(因为2分类)

    🌳目标超平面:w^{T}X+b = 0 —— 求最优w和b

    (这里其实展开就是w_{1}x_{1} + w_{2}x_{2}+b=0

    w是法向量,决定了超平面的方向;

    b是位移项,决定了超平面与原点间的距离)

    🌳那么空间中任意一点(x1,x2)到目标超平面的距离则为:

    r=\frac{\left|\omega^{T} x+b\right|}{|| \omega||}

    🌳又有定义:(其中x^{(i)}y^{(i)}分别是第i个样本和第i个样本值所对应的目标值)

    y_{i}(w^{T}x_{i} + b),i=1,.....,m为函数距离;

    所以我们把函数距离和点到面的距离进行一个综合,就变成了:

    \min\frac{y^{(i)}\left(w^{T} x^{(i)}+b\right)}{\|w\|}, i=1, \ldots, m为数据集与分隔超平面的几何距离;

    (1)这里用几何距离而不用函数距离的原因:

    当w,b成倍增加时,函数距离也会相应的成倍的增加,但几何函数则不会

    (2)我们刚刚不是说y的取值是1或-1嘛,这就保证了如果样本分类正确,则这个值是一个正数;如果样本分类错误,这个值是一个负数。这很好理解,分类对了就是同一边,就是正数嘛,即公式如下:

    \left\{\begin{array}{ll} \omega^{T} x_{i}+b>0, & y_{i}=+1 \\ \omega^{T} x_{i}+b<0, & y_{i}=-1 \end{array}\right.

    🌳但如果只以w^{T}X+b = 0来划分,那么它的容错性可能不是很好,所以SVM这里引入了这个:

    \left\{\begin{array}{ll} \omega^{T} x_{i}+b>=1, & y_{i}=+1 \\ \omega^{T} x_{i}+b<=-1, & y_{i}=-1 \end{array}\right.

    如图所示:(图里的转置符号我就懒得写上去了嘻嘻)

    🌳间隔

    其中,支持向量使上式的等号成立。两个异类支持向量到超平面的距离之和,也称为间隔:

    \gamma=\frac{2}{\|\omega\|}(其实就是那两条橙色的线的距离)

    🌳最大间隔划分超平面

    所以我们要找到对应的w和b让\gamma最大,即以下公式:

    \max _{\omega, b} \frac{2}{\|\omega\|}, s . t . y_{i}\left(\omega^{T} x_{i}+b\right) \geq 1, i=1,2, \ldots, m

    条件由以下所得:

    \left\{\begin{array}{ll} \omega^{T} x_{i}+b>=1, & y_{i}=+1 \\ \omega^{T} x_{i}+b<=-1, & y_{i}=-1 \end{array}\right.   左右乘上y_{i} 

    (1)无松弛变量

    🌳由上式进行变式

    为了最大化间隔,仅需最大化 \frac{1}{\|\omega\|}  ,这等价于最小化 \|\omega\|^2

    \min _{\omega, b} \frac{\|\omega\|^2}{2}, s . t . y_{i}\left(\omega^{T} x_{i}+b\right) \geq 1, i=1,2, \ldots, m

    这就是SVM的基本型

    🌳我们把约束条件融合到优化目标函数中,建立拉格朗日公式

    L(w, b, \alpha)=\frac{1}{2}\|w\|^{2}+\sum_{i=1}^{m} \alpha_{i}\left(1-y_{i}\left(w^{T} x_{i}+b\right)\right)

    令 L(w,b,α)对 w和b的偏导为零,得到:

    w =\sum_{i=1}^{m} \alpha_{i} y_{i} x_{i}     \sum_{i=1}^{m} \alpha_{i} y_{i} = 0

    代入L得

    \max _{\alpha} \sum_{i=1}^{m} \alpha_{i}-\frac{1}{2} \sum_{i=1}^{m} \sum_{j=1}^{m} \alpha_{i} \alpha_{j} y_{i} y_{j} x_{i}^{T} x_{j} --s.t. \sum_{i=1}^{m} \alpha_{i} y_{i}=0, \alpha_{i} \geq 0, i=1,2, \ldots, m

    解出\alpha后代入得:

     (这里的x和y都是支持向量)

    (2)带松弛变量\xi_{i}和惩罚因子C

    \min \frac{1}{2}\|w\|^{2}+C \sum_{i=1}^{n} \xi_{i} -- s . t . y_{i}\left(\omega^{T} x_{i}+b\right) \geq 1-\xi_{i} , i=1,2, \ldots, m,\xi_{i}\geq0

    其余与上述一样

    2、线性不可分

    如果训练样本线性不可分,那么只要样本的属性是有限个,就可以将其映射到高维特征空间,使这些样本线性可分。

    Note:升维后不一定线性可分,不过一般情况下升维后会更接近线性可分

    凡是遇到线性不可分的情况,一律映射到高维度空间,会出现维度爆炸的情况,那么计算难度会很大的。此时我们可以使用核函数来简化计算,核函数虽然也是将特征进行从低维到高维的转化 但是是在低维上进行计算 而实际的效果表现在高维上 解决了维度爆炸的问题

    (1)核函数定义和应用背景

    只要一个对称函数所对应的核矩阵半正定,它就能作为核函数使用。

    但是在不知道特征映射的形式时,我们并不知道什么样的核函数才是合适的。因此,核函数的选择成为SVM的最大变数

    构建核函数首先要确定输入空间到特征空间的映射,想要获取输入空间到映射空间的映射,我们需要明确输入空间内数据的分布情况,但大多数情况下,我们并不知道自己所处理的数据的具体分布,故一般很难构造出完全符合输入空间的核函数,因此我们用几种常用的核函数来代替自己构造核函数

    (2)线性核函数 LINEAR

    k(x,x_{i}) = x * x_{i}(内积)

    LINEAR主要用于线性可分的情况。我们可以看到特征空间到输入空间的维度是一样的,其参数少,速度快。对于线性可分数据,其分类效果很理想,因此我们通常首先尝试用线性核函数来做分类,看看效果如何,如果不行再换别的。

    (3)高斯径向基核函数 RBF

    k(x, x i)=\exp \left(-\frac{\|x-x i\|^{2}}{\delta^{2}}\right)

    它是一种局部性强的核函数,其可以将一个样本映射到一个更高维的空间,它是应用最广的一个,无论大样本还是小样本都有比较好的性能,而且其相对于多项式核函数参数要少,因此大多数情况下在不知道用什么核函数的时候,优先使用高斯核函数

    (4)多项式核函数 POLY

    k(x,x_{i}) = ((x * x_{i})+1)^{d}

    它也可以实现将低维的输入空间映射到高维的特征空间。但多项式核函数的参数多,当多项式的阶数比较高的时候,核矩阵的元素值将趋于无穷大或者无穷小,计算复杂度会大到无法计算

    (5)神经元的非线性作用核函数 Sigmoid

    关于Sigmoid函数的介绍可以看往期文章中

    基于分层softmax的CBoW模型详解_tt丫的博客-CSDN博客_分层softmax中有关逻辑回归Sigmoid函数的讲解

    k\left(x, x_{i}\right)=\tanh \left(\eta<x, x_{i}>+\theta\right)

    这样SVM实现的就是一种多层神经网络

    (6)核函数选择技巧

    如果我们对数据有个初步的分布了解等等,就根据这些特点去选择核函数

    如果我们不清楚的话,可以使用交叉验证的方法来试用不同的核函数,误差最小的就是效果最好的核函数;或者也可以将多个核函数结合起来,形成混合核函数。

    如果特征的数量大到和样本数量差不多,则选用线性核SVM;

    如果特征的数量小,样本的数量正常,则选用高斯核函数SVM;

    如果特征的数量小,而样本的数量很大,则需要手工添加一些特征从而变成第一种情况。


    三、SVM代码实现

    我们可以调用sklearn库中的SVM

    比如说

    model=sklearn.svm.SVC(C=2,kernel='rbf',gamma=10,decision_function_shape='ovo')

    参数说明:

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

    (2)kernel :核函数,默认是rbf,可以是

    0 —— 'linear';1 —— 'poly';2 —— 'rbf';3 —— 'sigmoid'

    (3)degree :多项式poly函数的维度,默认是3,选择其他核函数时会被忽略

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

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

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

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


    欢迎大家在评论区批评指正,谢谢~

    展开全文
  • 主要介绍了python SVM 线性分类模型的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 基于OpenCV3的SVM训练出来的车牌识别模型,能识别全国各地蓝底白字的车牌类型。
  • 粒子群算法优化支持向量机模型参数代码,代码包含注释和数据文件
  • 文章针对SVM中的参数选择问题,提出了利用遗传算法进行优化的方法,并将其应用于商业银行的个人信用评估中,构建了个人信用评估GA-SVM模型;通过对GA适应度函数的设置来控制个人信用评估中给商业银行造成较大损失的...
  • SVM模型的应用.rar

    2020-12-23 10:11:05
    附件为SVM模型应用案例的源文件及代码。
  • 设计三层粒子群优化算法(tlPSO)对SVM模型进行参数寻优,使用训练集建立分类模型,利用测试集评估模型性能,得到tlPSO-SVM模型。tlPSO算法能有效降低陷入局部最优解的机率,获取全局最优参数,从而使模型具有最优的...
  • SVM模型 java代码

    2014-09-01 11:01:47
    SVM模型 java代码 工程可直接运行
  • hog svm matlab代码此文件夹用于存放好的/坏的锅过滤器代码,如果您想...三、运行hog_svm.py,使用hog_svm模型进行训练和测试; 或者您可以运行 train.py 和 test.py 以使用基于 tensorflow 的 ML 模型进行训练和测试。
  • fitrsvm在中低维预测变量数据集上训练或交叉验证支持向量机(SVM)回归模型。 fitrsvm支持使用内核函数映射预测变量数据,并支持通过二次编程实现目标函数最小化。要在高维数据集(即包含许多预测变量的数据集)上...
  • MATLAB实现SVM模型建立,可以模拟预测(包含BP神经网络)
  • excel的SVM模型工具

    2017-09-08 15:51:17
    excel的svm模型工具安装包,可直接安装执行,按照说明使用时可在excel内进行多种聚类、分类处理,方便快捷。
  • 针对现有SVM模型选择方法中人为指定核函数类型导致SVM模型性能难以达到最优的问题,提出了核函数原型的概念,并在此基础上提出一种基于核函数原型和自适应遗传算法的SVM模型选择方法。该方法针对具体问题选择最优的...
  • 根据某贷款平台的个人信用数据集,可以通过实验得出结论,与全变量Logistic模型和逐步Logistic模型相比,Group Lasso-Logistic模型的变量选择能力最强,其次是套索物流和套索SVM。 这三个基于套索变量选择模型都...
  • svm模型初步理解

    千次阅读 2020-10-12 19:35:06
    什么是SVM模型 支持向量机,因其英文名为support vector machine,故一般简称SVM,通俗来讲,它是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终可转化为一...

    什么是SVM模型
    支持向量机,因其英文名为support vector machine,故一般简称SVM,通俗来讲,它是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。

    KKT(Karush-Kuhn-Tucker)条件
    拉格朗日乘法(Lagrange multiplier)是一种在最优化的问题中寻找多元函数在其变量受到一个或多个条件的相等约束时的求局部极值的方法。这种方法可以将一个有 n 个变量和 k 个约束条件的最优化问题转换为一个解有 n+k 个变量的方程组的解的问题。KKT条件(Karush-Kuhn-Tucker Conditions),它是在满足一些有规则的条件下,一个非线性规划问题能有最优化解法的一个必要和充分条件。
    kkt定理:
    在这里插入图片描述
    拉格朗日函数的对偶问题
    在这里插入图片描述
    比如在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    核函数
    在这里插入图片描述
    使用拉格朗日对偶推导参数w和b
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • Python: SVM模型简介

    千次阅读 2021-01-21 17:33:08
    SVM简介及sklearn参数 1.SVM简介  支持向量机SVM(Support Victory Machines)方法建立在统计学VC维和结构风险最小化原则上,既可以用于分类(二/多分类)、也可用于... 使用SVM作为模型时,通常采用如下流程:

    文章来源:https://www.cnblogs.com/solong1989/p/9620170.html


    SVM简介及sklearn参数

    1.SVM简介

      支持向量机SVM(Support Victory Machines)方法建立在统计学VC维和结构风险最小化原则上,既可以用于分类(二/多分类)、也可用于回归和异常值检测。SVM具有良好的鲁棒性,对未知数据拥有很强的泛化能力,特别是在数据量较少的情况下,相较其他传统机器学习算法具有更优的性能。 

      使用SVM作为模型时,通常采用如下流程:

    1. 对样本数据进行归一化
    2. 应用核函数对样本进行映射(最常采用和核函数是RBF和Linear,在样本线性可分时,Linear效果要比RBF好)
    3. 用cross-validation和grid-search对超参数进行优选
    4. 用最优参数训练得到模型
    5. 测试

      sklearn中支持向量分类主要有三种方法:SVC、NuSVC、LinearSVC,扩展为三个支持向量回归方法:SVR、NuSVR、LinearSVR。

      SVC和NuSVC方法基本一致,唯一区别就是损失函数的度量方式不同(NuSVC中的nu参数和SVC中的C参数);LinearSVC是实现线性核函数的支持向量分类,没有kernel参数,也缺少一些方法的属性,如support_等。

    2. 参数

    • SVC
    sklearn.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)

     参数介绍:

    1. C: 惩罚系数,用来控制损失函数的惩罚系数,类似于LR中的正则化系数。C越大,相当于惩罚松弛变量,希望松弛变量接近0,即对误分类的惩罚增大,趋向于对训练集全分对的情况,这样会出现训练集测试时准确率很高,但泛化能力弱,容易导致过拟合。 C值小,对误分类的惩罚减小,容错能力增强,泛化能力较强,但也可能欠拟合。
    2. kernel: 算法中采用的和函数类型,核函数是用来将非线性问题转化为线性问题的一种方法。参数选择有RBF, Linear, Poly, Sigmoid,precomputed或者自定义一个核函数, 默认的是"RBF",即径向基核,也就是高斯核函数;而Linear指的是线性核函数,Poly指的是多项式核,Sigmoid指的是双曲正切函数tanh核;。
    3. degree: 当指定kernel为'poly'时,表示选择的多项式的最高次数,默认为三次多项式;若指定kernel不是'poly',则忽略,即该参数只对'poly'有用。(多项式核函数是将低维的输入空间映射到高维的特征空间)
    4. gamma: 核函数系数,该参数是rbf,poly和sigmoid的内核系数;默认是'auto',那么将会使用特征位数的倒数,即1 / n_features。(即核函数的带宽,超圆的半径)。gamma越大,σ越小,使得高斯分布又高又瘦,造成模型只能作用于支持向量附近,可能导致过拟合;反之,gamma越小,σ越大,高斯分布会过于平滑,在训练集上分类效果不佳,可能导致欠拟合。 
    5. coef0: 核函数常数值(y=kx+b中的b值),只有‘poly’和‘sigmoid’核函数有,默认值是0。
    6. shrinking :  是否进行启发式。如果能预知哪些变量对应着支持向量,则只要在这些样本上训练就够了,其他样本可不予考虑,这不影响训练结果,但降低了问题的规模并有助于迅速求解。进一步,如果能预知哪些变量在边界上(即a=C),则这些变量可保持不动,只对其他变量进行优化,从而使问题的规模更小,训练时间大大降低。这就是Shrinking技术。 Shrinking技术基于这样一个事实:支持向量只占训练样本的少部分,并且大多数支持向量的拉格朗日乘子等于C。
    7. probability: 是否使用概率估计,默认是False。必须在 fit( ) 方法前使用,该方法的使用会降低运算速度。
    8. tol: 残差收敛条件,默认是0.0001,即容忍1000分类里出现一个错误,与LR中的一致;误差项达到指定值时则停止训练。
    9. cache_size: 缓冲大小,用来限制计算量大小,默认是200M。
    10. class_weight :  {dict, ‘balanced’},字典类型或者'balance'字符串。权重设置,正类和反类的样本数量是不一样的,这里就会出现类别不平衡问题,该参数就是指每个类所占据的权重,默认为1,即默认正类样本数量和反类一样多,也可以用一个字典dict指定每个类的权值,或者选择默认的参数balanced,指按照每个类中样本数量的比例自动分配权值。如果不设置,则默认所有类权重值相同,以字典形式传入。 将类i 的参数C设置为SVC的class_weight[i]*C。如果没有给出,所有类的weight 为1。'balanced'模式使用y 值自动调整权重,调整方式是与输入数据中类频率成反比。如n_samples / (n_classes * np.bincount(y))。(给每个类别分别设置不同的惩罚参数C,如果没有给,则会给所有类别都给C=1,即前面参数指出的参数C。如果给定参数'balance',则使用y的值自动调整与输入数据中的类频率成反比的权重。)
    11. verbose :  是否启用详细输出。在训练数据完成之后,会把训练的详细信息全部输出打印出来,可以看到训练了多少步,训练的目标值是多少;但是在多线程环境下,由于多个线程会导致线程变量通信有困难,因此verbose选项的值就是出错,所以多线程下不要使用该参数。
    12. max_iter: 最大迭代次数,默认是-1,即没有限制。这个是硬限制,它的优先级要高于tol参数,不论训练的标准和精度达到要求没有,都要停止训练。
    13. decision_function_shape :  原始的SVM只适用于二分类问题,如果要将其扩展到多类分类,就要采取一定的融合策略,这里提供了三种选择。‘ovo’ 一对一,为one v one,即将类别两两之间进行划分,用二分类的方法模拟多分类的结果,决策所使用的返回的是(样本数,类别数*(类别数-1)/2); ‘ovr’ 一对多,为one v rest,即一个类别与其他类别进行划分,返回的是(样本数,类别数),或者None,就是不采用任何融合策略。默认是ovr,因为此种效果要比oro略好一点。
    14. random_state: 在使用SVM训练数据时,要先将训练数据打乱顺序,用来提高分类精度,这里就用到了伪随机序列。如果该参数给定的是一个整数,则该整数就是伪随机序列的种子值;如果给定的就是一个随机实例,则采用给定的随机实例来进行打乱处理;如果啥都没给,则采用默认的 np.random实例来处理。 

     

    • NuSVC                 class sklearn.svm.NuSVC(nu=0.5kernel='rbf'degree=3gamma='auto'coef0=0.0shrinking=Trueprobability=Falsetol=0.001cache_size=200class_weight=Noneverbose=Falsemax_iter=-1decision_function_shape='ovr'random_state=None)  

       nu: 训练误差部分的上限和支持向量部分的下限,取值在(0,1)之间,默认是0.5。

     

    • LinearSVC    class sklearn.svm.LinearSVC(penalty='l2'loss='squared_hinge'dual=Truetol=0.0001C=1.0multi_class='ovr'fit_intercept=Trueintercept_scaling=1class_weight=Noneverbose=0random_state=Nonemax_iter=1000)

      penalty: 正则化参数,L1和L2两种参数可选,仅LinearSVC有。

      loss: 损失函数,有‘hinge’和‘squared_hinge’两种可选,前者又称L1损失,后者称为L2损失,默认是是’squared_hinge’,其中hinge是SVM的标准损失,squared_hinge是hinge的平方

      dual: 是否转化为对偶问题求解,默认是True。

      tol: 残差收敛条件,默认是0.0001,与LR中的一致。

      C: 惩罚系数,用来控制损失函数的惩罚系数,类似于LR中的正则化系数。

      multi_class: 负责多分类问题中分类策略制定,有‘ovr’和‘crammer_singer’ 两种参数值可选,默认值是’ovr’,'ovr'的分类原则是将待分类中的某一类当作正类,其他全部归为负类,通过这样求取得到每个类别作为正类时的正确率,取正确率最高的那个类别为正类;‘crammer_singer’ 是直接针对目标函数设置多个参数值,最后进行优化,得到不同类别的参数值大小

      fit_intercept: 是否计算截距,与LR模型中的意思一致。

      class_weight: 与其他模型中参数含义一样,也是用来处理不平衡样本数据的,可以直接以字典的形式指定不同类别的权重,也可以使用balanced参数值。

      verbose: 是否冗余,默认是False。

      random_state: 随机种子。

      max_iter: 最大迭代次数,默认是1000。

     

    3. 属性(Attributes)

      support_: 以数组的形式返回支持向量的索引,即在所有的训练样本中,哪些样本成为了支持向量。

      support_vectors_: 返回支持向量,汇总了当前模型所有的支持向量。

      n_support_: 比如SVC将数据集分成了4类,该属性表示了每一类的支持向量的个数。

      dual_coef_: 对偶系数,即支持向量在决策函数中的系数,在多分类问题中,这个会有所不同。

      coef_: 每个特征系数(重要性),只有核函数是Linear的时候可用。

      intercept_: 决策函数中的常数项(借据值),和coef_共同构成决策函数的参数值。

     

    4. 方法(Method)

      decision_function(X): 获取数据集中样本X到分离超平面的距离。

      fit(X, y): 在数据集(X,y)上拟合SVM模型。

      get_params([deep]): 获取模型的参数。

      predict(X): 预测数据值X的标签。

      score(X,y): 返回给定测试集和对应标签的平均准确率

     

    5. 核函数的使用

    • RBF核:高斯核函数就是在属性空间中找到一些点,这些点可以是也可以不是样本点,把这些点当做base,以这些base为圆心向外扩展,扩展半径即为带宽,即可划分数据。换句话说,在属性空间中找到一些超圆,用这些超圆来判定正反类。
    • 线性核和多项式核:这两种核的作用也是首先在属性空间中找到一些点,把这些点当做base,核函数的作用就是找与该点距离和角度满足某种关系的样本点。当样本点与该点的夹角近乎垂直时,两个样本的欧式长度必须非常长才能保证满足线性核函数大于0;而当样本点与base点的方向相同时,长度就不必很长;而当方向相反时,核函数值就是负的,被判为反类。即,它在空间上划分出一个梭形,按照梭形来进行正反类划分。
    • Sigmoid核:同样地是定义一些base,核函数就是将线性核函数经过一个tanh函数进行处理,把值域限制在了-1到1上。

      总之,都是在定义距离,大于该距离,判为正,小于该距离,判为负。至于选择哪一种核函数,要根据具体的样本分布情况来确定。 

      一般有如下指导规则:

    1. 如果Feature的数量很大,甚至和样本数量差不多时,往往线性可分,这时选用LR或者线性核Linear;
    2. 如果Feature的数量很小,样本数量正常,不算多也不算少,这时选用RBF核;
    3. 如果Feature的数量很小,而样本的数量很大,这时手动添加一些Feature,使得线性可分,然后选用LR或者线性核Linear;
    4. 多项式核一般很少使用,效率不高,结果也不优于RBF;
    5. Linear核参数少,速度快;RBF核参数多,分类结果非常依赖于参数,需要交叉验证或网格搜索最佳参数,比较耗时;
    6. 应用最广的应该就是RBF核,无论是小样本还是大样本,高维还是低维等情况,RBF核函数均适用

     

    6. 总结

      支持向量机的优点:

    • 在高维空间中非常高效;
    • 即使在数据维度比样本数量大的情况下仍然有效;
    • 在决策函数(称为支持向量)中使用训练集的子集,因此它也是高效利用内存的;
    • 通用性:不同的核函数与特定的决策函数一一对应;

      支持向量机的缺点:

    • 如果特征数量比样本数量大得多,在选择核函数时要避免过拟合;
    • 支持向量机不直接提供概率估计,这些都是使用昂贵的五次交叉验算计算的。
    展开全文
  • 基于二重SVM模型的移动互联网用户情绪预测方法.pdf
  • sklearn中的SVM模型

    千次阅读 2020-01-15 17:18:10
    支持向量机(SVM)是一种强大的可用于监督式学习分类问题和回归问题,以及非监督式异常检测问题等的常见... 基于liblinear库的SVM分类模型,仅支持线性核,可调节损失函数和惩罚项。多分类问题采用'ovr'策略。不支...
  • cs优化SVM模型,可以实现,能够帮助大家使用,这是MATLAB的
  • 运用ARIMA-SVM模型、ARIMA模型、SVM模型和Db6-SVM模型对湖北碳排放交易价格进行8期 预测。通过4种模型预测值的 MSE值和 MAE值确定预测精度,对比预测精度,探究 ARIMA-SVM模型是否为准确有效的预测模型,实证结果...
  • SVM模型的应用

    千次阅读 2020-12-23 10:02:38
    接下来,使用非线性SVM模型对该数据集进行重新建模,代码如下: # 使用网格搜索法,选择非线性可分SVM“类”中的最佳C值和核函数 kernel = ['rbf', 'linear', 'poly', 'sigmoid'] C = [0.1, 0.5, 1, 2, 5] parameters...
  • 保存SVM模型并调用

    千次阅读 2019-06-15 18:42:21
    将训练好的模型保存为pickle文件,有以下步骤: 1)以二进制的方式打开文件: file = open("G:/Download_Data_bishe/save_model/model.pickle", "wb") 2)然后将模型写入文件:pickle.dump(classifier, file) 3...
  • mo_3.m_lbp特征提取,fitcecoc训练svm模型,predict预测,人脸分类。使用fitcecoc函数训练一个多分类的SVM模型,使用predict函数利用训练出的模型对测试数据进行预测,将得到的类标预测值与测试数据真实的类标进行...
  • svm_C++_SVM_

    2021-10-03 10:01:43
    此代码是用C写的,用于进行支持向量机(SVM)的训练代码的C文件格式。
  • SVM模型结构

    千次阅读 2019-10-10 10:31:23
    通俗来讲,SVM是一种二类分类模型,其基本模型定义为:特征空间上的间隔最大的线性分类器,其学习策略是间隔最大化,最终可转化为一个凸二次规划问题的求解。 二、模型的构建和结构 2.1 模型构建 1)KEY IDEA1:...
  • Python实现GA(遗传算法)对SVM分类模型参数的优化资料说明:包括数据集+源代码+Word文档说明。 资料内容包括: 1)需求分析; 2)数据采集; 3)数据预处理; 4)探索性数据分析; 5)特征工程; 6)机器建模; 7)模型评估...
  • 于是重新深入理解了SVM的原理,从去工作的学长那里了解到现在的面试都已经开始询问SVM的数学原理,而SVM 的学习难点可能在于算法的理解和理论推导,而几个月前由于数学水平的不足而一知半解,现重新回顾,也是有了不...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 84,234
精华内容 33,693
关键字:

怎么选择svm模型