推荐栏目
当我们构建svm模型时,可以设置以下参数。
SVC(C=1.0,cache_size=200,class_weight=None,coef0=0.0,
决策功能形状='ovr
,度=3,gamma='auto '内核='rbf '
max_iter=-1,概率=假,random _ state=无,收缩=真,
tol=0.001,详细=假)
让我们先来看看这些参数的含义:
(1)C:目标函数的惩罚系数C,用于平衡分类区间余量和误分类样本,默认C=1.0;
(2)核:参数为RBF(高斯核)、线性核(线性核函数)、Poly(多项式核函数)、Sigmoid核函数,默认为‘RBF’;
(3)次数:如果核使用多项式核函数,次数决定多项式的最高次幂;
(4)gamma:核函数(' Poly '' RBF '和' Sigmoid ')的系数,默认值为gamma=1/n _ features;
(5)coef0:核函数中的独立项,‘RBF’和‘sigmoid’有效;
(6)概率:是否使用可能性估计(真或假);
(7)收缩:是否进行启发式;
(8) TOL(默认=1e-3):SVM终止标准的精度;
(9)cache_size:使训练所需的内存(以MB为单位)。在大样本的情况下,缓存大小会影响训练速度。所以如果机器内存大,建议用500MB甚至1000MB。默认为200,即200MB。
(10)class_weight:指定每类样本的权重,主要是为了防止训练集在某些类中样本过多,导致训练决策过于偏向这些类。在这里,您可以自己指定每个样品的重量,或者使用“平衡”。如果使用‘平衡’的话,算法会自己计算权重,样本量小的类别对应的样本权重会高一些。当然,如果你的样本类别分布没有明显的偏向,你可以选择默认的' None'(11)verbose而不管这个参数:它和多线程有关,所以你不太明白它的意思;
(12)max_iter:最大迭代次数,默认=1,如果max_iter=-1,无限制;
(13)决策_功能_形状:分类决策
“Ovo”一对一,“ovr”多对多或无,默认值=ovr
OvR(one ve rest)的思路很简单。不管你是多少元分类,我们都可以把它看成二元分类。具体来说,对于K类的分类决策,我们把K类的所有样本作为正例,把除K类以外的所有样本作为负例,然后对它们做二元分类,得到K类的分类模型.得到其他类的分类模型等等。
OV(一对一)是每次从所有T类样本中选择两类样本,也可以归为T1和T2。将所有输出为T1和T2的样本放在一起,以T1为正例,以T2为负例,进行二元分类,得到模型参数。我们总共需要T(T-1)/2个分类。
从上面的描述可以看出,OvR相对简单,但是分类效果相对略差(这里指的是大部分样本的分布,在某些样本分布下OvR可能更好)。OvO分类比较准确,但是分类速度没有OvR快。通常,建议使用OvO来获得更好的分类结果。
(14)random_state:用于概率估计的数据重排的伪随机数发生器的种子。
1)线性核的表达式为:k (x,z)=xzk (x,z)=xz,是普通的内积。LinearSVC和LinearSVR只能用。
2)多项式核是线性不可分SVM常用的核函数之一,其表达式为:k (x,z)=( xzr) DK (x,z)=( xzr) d,其中,r,d ,r,d都需要自己定义,比较麻烦。
3)高斯核,在SVM也叫径向基函数,RBF),是libsvm的默认核函数,也是scikit-learn的默认核函数。表达式为:k (x,z)=exp ( || xz || 2) k (x,z)=exp ( || xz || 2),其中 大于0,需要自己定义。
4)Sigmoid核也是线性不可分SVM中常用的核函数之一。表达式为:k (x,z)=tanh ( xzr) k (x,z)=tanh ( xzr),其中,r,r都需要自己定义参数。
虽然核函数这么多,但其实常用的只有两种,一种是线性核函数,一种是高斯核函数。原因是它们往往效果最好,调参量比较少,不是很麻烦。当我们使用线性核函数时,我们的主要调优目标是C,当我们使用高斯核函数时,我们的主要调优目标是C和gamma。
就是调整两个参数,一个是C,一个是gamma。
c是惩罚系数,即松弛变量的系数。在优化函数中,主要平衡支持向量复杂度和误分类率之间的关系,可以理解为正则化系数。当它更大时,我们的损失函数也会更大,这意味着我们不愿意放弃遥远的离群值。这样我们会有更多的支持向量,也就是说支持向量和超平面的模型会变得更加复杂,容易过拟合。相反,当它很小时,意味着我们不关心那些离群点,我们会选择更少的样本作为支持向量,最终的支持向量和超平面模型会很简单。scikit-learn中的默认值是1。
另一个超参数是RBF核函数的参数。回想一下RBF核函数,它主要定义了单个样本对整个分类超平面的影响。大的时候单个样本对整个分类超平面的影响比较小,不容易被选为支持向量,或者整个模型的支持向量会比较小。套件学习中的默认值为“自动”
其实我们最常做的就是调整这两个参数。下面是实际使用高斯核函数时参数调整的情况。它使用sklearn的打包参考库进行在线参考,也叫暴力参考。
从sklearn导入svm从sklearn.model_selection导入GridSearchCV从sklearn导入metrics导入numpy as np导入pandas as pd导入scip y . io as SiO mat=SiO . loadmat(' ex 6 data 3 . mat ')print(mat . keys())training=PD。DataFrame(mat.get('X '),columns=['X1 '' X2 '])training[' y ']=mat . get(' y ')cv=PD。DataFrame(mat.get('Xval '),columns=['X1 '' X2 '])cv[' y ']=mat . get(' yval ')candidate=[0.01,0.03,0.1,0.3,1,3,10,30,100]combination=[(C,gamma)for C in candidate for gamma in candidate]if _ _ name _ _=' _ _ main _ _ 'parameters={ ' C 'candidate,' gamma' candidate} svc=svm。SVC() clf=GridSearchCV(svc,parameters,n _ jobs=-1)clf . fit(training[[' X1 '' X2']],training[' y '])print(clf . best _ params _)print(clf . best _ score _)ypred=clf . predict(cv[' X1 '' X2 ']])print(metrics . classification _ report(cv[' y '],ypred))