推荐使用SVM的步骤为:
- 将原始数据转化为SVM算法软件或包所能识别的数据格式;
- 将数据标准化;(防止样本中不同特征数值大小相差较大影响分类器性能)
- 不知使用什么核函数,考虑使用RBF;
- 利用交叉验证网格搜索寻找最优参数(C, γ);(交叉验证防止过拟合,网格搜索在指定范围内寻找最优参数)
- 使用最优参数来训练模型;
- 测试。
sklearn.svm.SVC
class sklearn.svm.SVC(C = 1.0,kernel ='rbf',degree = 3,gamma ='auto_deprecated',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 : float,可选(默认值= 1.0) 错误术语的惩罚参数C. kernel : string,optional(default ='rbf') 指定要在算法中使用的内核类型。它必须是'linear','poly','rbf','sigmoid','precomputed'或者callable之一。如果没有给出,将使用'rbf'。如果给出可调用,则它用于从数据矩阵预先计算内核矩阵; 该矩阵应该是一个形状的数组。 度 : int,可选(默认= 3) 多项式核函数的次数('poly')。被所有其他内核忽略。 gamma : float,optional(默认='auto') 'rbf','poly'和'sigmoid'的核系数。 当前默认值为'auto',它使用1 / n_features,如果 coef0 : float,optional(默认值= 0.0) 核函数中的独立项。它只在'poly'和'sigmoid'中很重要。 shrinking : 布尔值,可选(默认= True) 是否使用收缩启发式。 probability : 布尔值,可选(默认=假) 是否启用概率估计。必须在调用之前启用它 tol : float,optional(默认值= 1e-3) 容忍停止标准。 cache_size : float,可选 指定内核缓存的大小(以MB为单位)。 class_weight : {dict,'balanced'},可选 将类i的参数C设置为SVC的class_weight [i] * C. 如果没有给出,所有课程都应该有一个重量。“平衡”模式使用y的值自动调整与输入数据中的类频率成反比的权重 详细说明 : bool,默认值:False 启用详细输出。请注意,此设置利用libsvm中的每进程运行时设置,如果启用,则可能无法在多线程上下文中正常运行。 max_iter : int,optional(默认值= -1) 求解器内迭代的硬限制,或无限制的-1。 decision_function_shape : 'ovo','ovr',默认='ovr' 是否将形状(n_samples,n_classes)的one-vs-rest('ovr')决策函数作为所有其他分类器返回,或者返回具有形状的libsvm的原始one-vs-one('ovo')决策函数(n_samples) ,n_classes *(n_classes - 1)/ 2)。但是,一对一('ovo')总是被用作多级策略。 在版本0.19中更改: decision_function_shape默认为'ovr'。 版本0.17中的新功能:建议使用decision_function_shape ='ovr'。 更改版本0.17:已弃用decision_function_shape ='ovo'且无。 random_state : int,RandomState实例或None,可选(默认=无) 伪随机数生成器的种子在对数据进行混洗以用于概率估计时使用。如果是int,则random_state是随机数生成器使用的种子; 如果是RandomState实例,则random_state是随机数生成器; 如果为None,则随机数生成器是由其使用的RandomState实例 |
|---|
重要参数解析:
C:C-SVC的惩罚参数C?默认值是1.0,C越大,相当于惩罚松弛变量,希望松弛变量接近0,即对误分类的惩罚增大,趋向于对训练集全分对的情况,这样对训练集测试时准确率很高,但泛化能力弱。C值小,对误分类的惩罚减小,允许容错,将他们当成噪声点,泛化能力较强。
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)
degree :多项式poly函数的维度,默认是3,选择其他核函数时会被忽略。
gamma : ‘rbf’,‘poly’和‘sigmoid’的核函数参数。默认是’auto’,如果是auto,则值为1/n_features
coef0 :核函数的常数项。对于‘poly’和 ‘sigmoid’有用。
probability :是否采用概率估计?.默认为False
shrinking :是否采用shrinking heuristic方法,默认为true
tol :停止训练的误差值大小,默认为1e-3
cache_size :核函数cache缓存大小,默认为200
class_weight :类别的权重,字典形式传递。设置第几类的参数C为weight*C(C-SVC中的C)
verbose :允许冗余输出
max_iter :最大迭代次数。-1为无限制。
decision_function_shape :‘ovo’, ‘ovr’ or None, default=ovr
random_state :数据洗牌时的种子值,int值
参数kernel
代表了svm的核函数,不同的核函数对最后的分类效果影响也比较大,其中precomputed表示自己提前计算好核函数矩阵,这时候算法内部就不再用核函数去计算核矩阵,而是直接用你给的核矩阵,我们说说另外的几种。
线性核函数
κ(x,xi)=x⋅xi
线性核,主要用于线性可分的情况,我们可以看到特征空间到输入空间的维度是一样的,其参数少速度快,对于线性可分数据,其分类效果很理想,因此我们通常首先尝试用线性核函数来做分类,看看效果如何,如果不行再换别的
多项式核函数
κ(x,xi)=((x⋅xi)+1)d
多项式核函数可以实现将低维的输入空间映射到高纬的特征空间,但是多项式核函数的参数多,当多项式的阶数比较高的时候,核矩阵的元素值将趋于无穷大或者无穷小,计算复杂度会大到无法计算。
高斯(RBF)核函数
κ(x,xi)=exp(−||x−xi||2δ2)
高斯径向基函数是一种局部性强的核函数,其可以将一个样本映射到一个更高维的空间内,该核函数是应用最广的一个,无论大样本还是小样本都有比较好的性能,而且其相对于多项式核函数参数要少,因此大多数情况下在不知道用什么核函数的时候,优先使用高斯核函数。
sigmoid核函数
κ(x,xi)=tanh(η<x,xi>+θ)
采用sigmoid核函数,支持向量机实现的就是一种多层神经网络。 因此,在选用核函数的时候,如果我们对我们的数据有一定的先验知识,就利用先验来选择符合数据分布的核函数;如果不知道的话,通常使用交叉验证的方法,来试用不同的核函数,误差最下的即为效果最好的核函数,或者也可以将多个核函数结合起来,形成混合核函数。在吴恩达的课上,也曾经给出过一系列的选择核函数的方法:
- 如果特征的数量大到和样本数量差不多,则选用LR或者线性核的SVM;
- 如果特征的数量小,样本的数量正常,则选用SVM+高斯核函数;
- 如果特征的数量小,而样本的数量很大,则需要手工添加一些特征从而变成第一种情况。
实际上使用可以对多个核函数进行测试,选择表现效果最好的核函数。
参数degree
该参数上文中也说的比较详细了,仅适用于poly,在实际应用中当数据量达到二十w以上,3层degree将会收敛的极其慢,不推荐使用。
参数gamma
这个值可能看官方文档不怎么看得懂,它是一个浮点数,作为三个核函数的参数,隐含地决定了数据映射到新的特征空间后的分布,gamma越大,支持向量越少,。gamma值越小,支持向量越多。支持向量的个数影响训练与预测的速度。
参数C
这个值官方文档说的比较明白了,就是在泛化能力和准确度间做取舍,一般来说不需要做修改,如果不需要强大的泛化能力,可减小C的值,即:C值越大,在测试集效果越好,但可能过拟合,C值越小,容忍错误的能力越强,在测试集上的效果越差。参数C和gamma是svm中两个非常重要的参数,对其值的调整直接决定了整个模型最终的好坏。
参数coef0
该参数默认值为0,是poly和sigmoid的核函数常数项,用于解决poly函数中当<x,y>值趋近,没有明显区分时,对于不同值之间差异的衡量问题,一般采用默认值0即可。在scikit-learn-svc-coef0-parameter-range这个问题中有比较详细的讲解。
参数probability
默认为False决定最后是否按概率输出每种可能的概率,但需注意最后的预测函数应改为clf.predict_proba,代码举例:
x=[[1,2,3],[11,18,16],[22,27,26],[33,34,39]]
y=[1,1,2,2]
clf=svm.SVC(probability=True,kernel='poly', degree=2,gamma=0.1,coef0=1)
clf.fit(x,y)
print clf.predict_proba([10,15,13])
output:
[[ 0.62913274 0.37086726]]
参数shrinking
该参数默认为True,即采用启发式收缩方式,如果能预知哪些变量对应着支持向量,则只要在这些样本上训练就够了,其他样本可不予考虑,这不影响训练结果,但降低了问题的规模并有助于迅速求解,起到一个加速训练的效果。
参数tol
svm停止训练的误差精度,float参数 默认为1e^-3,精度达到该标准则停止训练。
参数cache_size
该参数很明显,就是设置svm在训练时允许的缓存大小,默认为200。
参数class_weight
字典类型或者‘balance’字符串,默认为None。 给每个类别分别设置不同的惩罚参数C,如果没有给,则会给所有类别都给C=1,即前面指出的参数C.
本文介绍了SVM的SVC API使用步骤,包括数据预处理、选择核函数、参数调优等。重点解析了SVC的重要参数如C、kernel、degree、gamma等,其中C影响泛化能力,kernel选择对分类效果至关重要,高斯核函数(RBF)常用且适应性强。此外,还讨论了degree、gamma、coef0等相关参数的作用。
788

被折叠的 条评论
为什么被折叠?



