先再谈一下需要对svm算法需要熟悉到什么程度,这里引用七月在线创始人July的微博:
SVM理解到了一定程度后,是的确能在脑海里从头至尾推导出相关公式的,最初分类函数,最大化分类间隔,max1/||w||,min1/2||w||^2,凸二次规划,拉格朗日函数,转化为对偶问题,SMO算法,都为寻找一个最优解,一个最优分类平面。一步步梳理下来,为什么这样那样,太多东西可以追究,最后实现。
sklearn.svm
Sklearn包含的常用算法里介绍过常用的算法,scikit-learn中学习模式的调用,有很强的统一性,调用机器学习的方法都是一个道理,算法就是一个类,其中包含fit(),predict()等等许多方法,我们只要输入训练样本和标记,以及模型的一些可能的参数,自然就直接出分类的结果。
总结起来就是8个字:导入-建模-训练-预测
先看个小例子,然后再细解。
import numpy as np X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]]) y = np.array([1, 1, 2, 2]) from sklearn.svm import NuSVC clf = NuSVC() clf.fit(X, y) print(clf.fit(X,y)) NuSVC(cache_size=200, class_weight=None, coef0=0.0, decision_function_shape='ovr', degree=3, gamma='auto', kernel='rbf', max_iter=-1, nu=0.5, probability=False, random_state=None, shrinking=True, tol=0.001, verbose=False) print(clf.predict([[-0.8, -1]]))[1]
更多案例,大家可以移步scikit-learn官网
https://scikit-learn.org/stable/modules/svm.html#svm-classification
scikit-learn中SVM的算法库分为两类,
一类是分类的算法库,包括SVC, NuSVC,和LinearSVC 3个类。
另一类是回归算法库,包括SVR, NuSVR,和LinearSVR 3个类。
相关的类都包裹在sklearn.svm模块之中。
对于SVC, NuSVC,和LinearSVC 3个分类的类,SVC和 NuSVC差不多,区别仅仅在于对损失的度量方式不同,而LinearSVC从名字就可以看出,他是线性分类,也就是不支持各种低维到高维的核函数,仅仅支持线性核函数,对线性不可分的数据不能使用。
同样的,对于SVR, NuSVR,和LinearSVR 3个回归的类, SVR和NuSVR差不多,区别也仅仅在于对损失的度量方式不同。LinearSVR是线性回归,只能使用线性核函数。
下面我们只说看一下SVC详细用法,NuSVC、LinearSVC建议大家看一下刘建平Pinard@cnblogs统计的表格
https://www.cnblogs.com/pinard/p/6117515.html
SVC函数一共有14个参数:
SVC参数解释
(1)C: 目标函数的惩罚系数C,用来平衡分类间隔margin和错分样本的,default C = 1.0;
(2)kernel:参数选择有RBF, Linear, Poly, Sigmoid, 默认的是"RBF";
(3)degree:if you choose 'Poly' in param 2, this is effective, degree决定了多项式的最高次幂;
(4)gamma:核函数的系数('Poly', 'RBF' and 'Sigmoid'), 默认是gamma = 1 / n_features;
(5)coef0:核函数中的独立项,'RBF' and 'Poly'有效;
(6)probablity: 可能性估计是否使用(true or false);
(7)shrinking:是否进行启发式;
(8)tol(default = 1e - 3): svm结束标准的精度;
(9)cache_size: 制定训练所需要的内存(以MB为单位);
(10)class_weight: 每个类所占据的权重,不同的类设置不同的惩罚参数C, 缺省的话自适应;
(11)verbose: 跟多线程有关;
(12)max_iter: 最大迭代次数,default = 1, if max_iter = -1, no limited;
(13)decision_function_shape :‘ovo’ 一对一, ‘ovr’ 多对多 or None 无, default=None
(14)random_state :用于概率估计的数据重排时的伪随机数生成器的种子。
核函数如何选取
1)线性核函数(Linear Kernel)表达式为:K(x,z)=x∙z,就是普通的内积,LinearSVC 和 LinearSVR 只能使用它。
2) 多项式核函数(Polynomial Kernel)是线性不可分SVM常用的核函数之一,表达式为:,其中,γ,r,d都需要自己调参定义,比较麻烦。
3)高斯核函数(Gaussian Kernel),在SVM中也称为径向基核函数(Radial Basis Function,RBF),它是libsvm默认的核函数,当然也是scikit-learn默认的核函数。表达式为:, 其中,γ大于0,需要自己调参定义。
4)Sigmoid核函数(Sigmoid Kernel)也是线性不可分SVM常用的核函数之一,表达式为:, 其中,γ,r都需要自己调参定义。
更多案例,大家可以移步scikit-learn官网
最常用的是核函数是Linear与RBF,需要注意的是对数据归一化处理。
1、Linear:主要用于线性可分的情形。参数少,速度快,对于一般数据,分类效果已经很理想了。
2、RBF:主要用于线性不可分的情形。参数多,分类结果非常依赖于参数。
吴恩达也曾经给出过选择核函数的方法:
1、如果Feature的数量很大,跟样本数量差不多,这时候选用LR或者是Linear Kernel的SVM
2、 如果Feature的数量比较小,样本数量一般,不算大也不算小,选用SVM+Gaussian Kernel
3、 如果Feature的数量比较小,而样本数量很多,需要手工添加一些feature变成第一种情况