SVM支持向量机简介和sklearn中参数设置详解

SVM⽀持向量机简介和sklearn中参数设置详解
1.SVM简介
SVM⽅法建⽴在统计学VC维和结构风险最⼩化原则上,既可以⽤于分类(⼆/多分类)、也可⽤于回归和异常值检测。SVM具有良好的鲁棒性,对未知数据拥有很强的泛化能⼒,特别是在数据量较少的情况下,相较其他传统机器学习算法具有更优的性能。
使⽤SVM作为模型时,通常采⽤如下流程:
1.对样本数据进⾏归⼀化
2.应⽤核函数对样本进⾏映射(最常采⽤和核函数是RBF和Linear,在样本线性可分时,Linear效果要⽐RBF好)
3.⽤cross-validation和grid-search对超参数进⾏优选
4.⽤最优参数训练得到模型
服务质量差距模型5.测试
牛津小学英语5a教案
sklearn中⽀持向量分类主要有三种⽅法:SVC、NuSVC、LinearSVC,扩展为三个⽀持向量回归⽅法:SVR、NuSVR、
LinearSVR。
SVC和NuSVC⽅法基本⼀致,唯⼀区别就是损失函数的度量⽅式不同(NuSVC中的nu参数和SVC中的C参数);LinearSVC是实现线性核函数的⽀持向量分类,没有kernel参数,也缺少⼀些⽅法的属性,如support_等。
2.参数
SVC class 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)
C: 惩罚系数,⽤来控制损失函数的惩罚系数,类似于LR中的正则化系数。C越⼤,相当于惩罚松弛变量,希望松弛变量接近0,即对误分类的惩罚增⼤,趋向于对训练集全分对的情况,这样会出现训练集测试时准确率很⾼,但泛化能⼒弱,容易导致过拟合。
C值⼩,对误分类的惩罚减⼩,容错能⼒增强,泛化能⼒较强,但也可能⽋拟合。
kernel: 算法中采⽤的和函数类型,核函数是⽤来将⾮线性问题转化为线性问题的⼀种⽅法。参数选择有RBF, Linear, Poly,
Sigmoid,precomputed或者⾃定义⼀个核函数,默认的是"RBF",即径向基核,也就是⾼斯核函数;⽽Linear指的是线性核函数,Poly指的是多项式核,Sigmoid指的是双曲正切函数tanh核;
degree:
当指定kernel为’poly’时,表⽰选择的多项式的最⾼次数,默认为三次多项式;若指定kernel不是’poly’,则忽略,即该参数只对’poly’有⽤。(多项式核函数是将低维的输⼊空间映射到⾼维的特征空间)
gamma: 核函数系数,该参数是rbf,poly和sigmoid的内核系数;默认是’auto’,那么将会使⽤特征位数的倒数,即1 /
n_features。(即核函数的带宽,超圆的半径)。gamma越⼤,σ越⼩,使得⾼斯分布⼜⾼⼜瘦,造成模型只能作⽤于⽀持向量附近,可能导致过拟合;反之,gamma越⼩,σ越⼤,⾼斯分布会过于平滑,在训练集上分类效果不佳,可能导致⽋拟合。
coef0: 核函数常数值(y=kx+b中的b值),只有‘poly’和‘sigmoid’核函数有,默认值是0。
shrinking : 是否进⾏启发式。如果能预知哪些变量对应着⽀持向量,则只要在这些样本上训练就够了,其他样本可不予考虑,这不影响训练结果,但降低了问题的规模并有助于迅速求解。进⼀步,如果能预知哪些变量在边界上(即a=C),则这些变量可保持不动,只对其他变量进⾏优化,从⽽使问题的规模更⼩,训练时间⼤⼤降低。这就是Shrinking技术。 Shrinking技术基于这样⼀个事实:⽀持向量只占训练样本的少部分,并且⼤多数⽀持向量的拉格朗⽇乘⼦等于C。
probability: 是否使⽤概率估计,默认是False。必须在 fit( ) ⽅法前使⽤,该⽅法的使⽤会降低运算速度。
tol: 残差收敛条件,默认是0.0001,即容忍1000分类⾥出现⼀个错误,与LR中的⼀致;误差项达到指定值时则停⽌训练。
cache_size: 缓冲⼤⼩,⽤来限制计算量⼤⼩,默认是200M。
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的值⾃动调整与输⼊数据中的类频率成反⽐的权重。)
中央一号文件2018全文verbose : 是否启⽤详细输出。在训练数据完成之后,会把训练的详细信息全部输出打印出来,可以看到训练了多少步,训练的⽬标值是多少;但是在多线程环境下,由于多个线程会导致线程变量通信有困难,因此verbose选项的值就是出错,所以多线程下不要使⽤该参数。
max_iter: 最⼤迭代次数,默认是-1,即没有限制。这个是硬限制,它的优先级要⾼于tol参数,不论训练的标准和精度达到要求没有,都要停⽌训练。
decision_function_shape : 原始的SVM只适⽤于⼆分类问题,如果要将其扩展到多类分类,就要采取⼀定的融合策略,这⾥提供了三种选择。‘ovo’ ⼀对⼀,为one v one,即将类别两两之间进⾏划分,⽤⼆分类的⽅法模拟多分类的结果,决策所使⽤的返回的是(样本数,类别数*(类别数-1)/2); ‘
ovr’ ⼀对多,为one v rest,即⼀个类别与其他类别进⾏划分,返回的是(样本数,类别数),或者None,就是不采⽤任何融合策略。默认是ovr,因为此种效果要⽐oro略好⼀点。万有引力定律及其应用
random_state: 在使⽤SVM训练数据时,要先将训练数据打乱顺序,⽤来提⾼分类精度,这⾥就⽤到了伪随机序列。如果该参数给定的是⼀个整数,则该整数就是伪随机序列的种⼦值;如果给定的就是⼀个随机实例,则采⽤给定的随机实例来进⾏打乱处理;如果啥都没给,则采⽤默认的 np.random实例来处理。
NuSVC  class sklearn.svm.NuSVC(nu=0.5, 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)
nu: 训练误差部分的上限和⽀持向量部分的下限,取值在(0,1)之间,默认是0.5
LinearSVC class sklearn.svm.LinearSVC(penalty=‘l2’, loss=‘squared_hinge’, dual=True, tol=0.0001, C=1.0,
multi_class=‘ovr’, fit_intercept=True, intercept_scaling=1, class_weight=None, verbose=0, random_s
tate=None,
max_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_si
nger’
是直接针对⽬标函数设置多个参数值,最后进⾏优化,得到不同类别的参数值⼤⼩
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核参数多,分类结果⾮常依赖于参数,需要交叉验证或⽹格搜索最佳参数,⽐较耗时;
应⽤最⼴的应该就是RBF核,⽆论是⼩样本还是⼤样本,⾼维还是低维等情况,RBF核函数均适⽤。
6. 总结
⽀持向量机的优点:
1. 在⾼维空间中⾮常⾼效; 即使在数据维度⽐样本数量⼤的情况下仍然有效;
2. 在决策函数(称为⽀持向量)中使⽤训练集的⼦集,因此它也是⾼效利⽤内存的; 通⽤性:不同的核函数与特定的决策函数⼀⼀对应;⽀持向量机的缺点:
1. 如果特征数量⽐样本数量⼤得多,在选择核函数时要避免过拟合;
2. ⽀持向量机不直接提供概率估计,这些都是使⽤昂贵的五次交叉验算计算的。

本文发布于:2024-09-21 22:04:54,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/569900.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:函数   参数   训练   样本
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议