数据挖掘十大算法(三):支持向量机SVM sklearn实现

版权声明:本文为博主原创文章,转载请附上此地址。 https://blog.csdn.net/qq_36523839/article/details/81706027

今天进入了支持向量机(SVM)的学习,如果只是对支持向量机的表面理论了解,那么还算不是太难。但是对于里面的数学推导真的不是一两天能看懂的(尤其是我这种数学功底不是很强的),使用编码实现数学推导的一系列过程也不是那么好理解的。由于时间关系,直接学习sklearn中SVM的使用,以后有时间再更新对支持向量机深入的了解。

主要关于SVCLinearSVC的翻译,有疑惑的地方可以查看最下面官方文档,自行理解。(在大量样本时,最好选择LinearSVC模型)

一 sklearn的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=None,random_state=None)

参数:

l  C:C-SVC的惩罚参数C。默认值是float=1.0

C越大,相当于惩罚松弛变量,希望松弛变量接近0,即对误分类的惩罚增大,趋向于对训练集全分对的情况,这样对训练集测试时准确率很高,但泛化能力弱。C值小,对误分类的惩罚减小,允许容错,将他们当成噪声点,泛化能力较强。

l  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)

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

l  gamma : ‘rbf’,‘poly’ 和‘sigmoid’的核函数参数。默认是’auto’,则会选择1/n_features

l  coef0 :核函数的常数项。对于‘poly’和 ‘sigmoid’有用。

l  probability :是否采用概率估计。.默认为False

l  shrinking :是否采用shrinking heuristic方法,默认为true

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

l  cache_size :核函数cache缓存大小,默认为200

l  class_weight :类别的权重,字典形式传递。设置第几类的参数C为weight*C(C-SVC中的C)

l  verbose :允许冗余输出

l  max_iter :最大迭代次数。-1为无限制。

l  decision_function_shape :‘ovo’, ‘ovr’ or None, default=None3

l  random_state :数据洗牌时的种子值,int型

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

方法:

decision_function(X)          样品X到分离超平面的距离。
fit(X,y [,sample_weight])    根据给定的训练数据拟合SVM模型。
get_params([deep])            获取此估算工具的参数。
predict(X)                             对X中的样本进行分类。
score(X,y [,sample_weight])     返回给定测试数据和标签的平均准确度。
set_params(** PARAMS)    设置此估算器的参数。

二 sklearn的LinearSVC部分文档翻译,主要涉及的是模型参数的意义和方法:

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_state=None, max_iter=1000)

|  penalty : string, ‘l1’ or ‘l2’ (default=’l2’)
指定惩罚中使用的规范。 'l2'惩罚是SVC中使用的标准。 'l1'引导稀疏的coef_向量。

|  loss : string, ‘hinge’ or ‘squared_hinge’ (default=’squared_hinge’)
指定损失函数。 “hinge”是标准的SVM损失(例如由SVC类使用),而“squared_hinge”是hinge损失的平方。

|  dual : bool, (default=True)
选择算法以解决双优化或原始优化问题。 当n_samples> n_features时,首选dual = False。

|  tol : float, optional (default=1e-4)
误差停止标准

|  C : float, optional (default=1.0)
错误项的惩罚参数

|  multi_class : string, ‘ovr’ or ‘crammer_singer’ (default=’ovr’)
如果y包含两个以上的类,则确定多类策略。 “ovr”训练n_classes one-vs-rest分类器,而“crammer_singer”优化所有类的联合目标。 虽然crammer_singer在理论上是有趣的,因为它是一致的,但它在实践中很少使用,因为它很少能够提高准确性并且计算成本更高。 如果选择“crammer_singer”,则将忽略选项loss,penalty和dual。

|  fit_intercept : boolean, optional (default=True)
是否计算此模型的截距。 如果设置为false,则不会在计算中使用截距(即,预期数据已经居中)。

|  intercept_scaling : float, optional (default=1)
当self.fit_intercept为True时,实例向量x变为[x,self.intercept_scaling],即具有等于intercept_scaling的常量值的“合成”特征被附加到实例向量。 截距变为intercept_scaling *合成特征权重注意! 合成特征权重与所有其他特征一样经受l1 / l2正则化。 为了减小正则化对合成特征权重(并因此对截距)的影响,必须增加intercept_scaling。

|  class_weight : {dict, ‘balanced’}, optional
将种类i的参数C设置为SVC的class_weight [i] * C. 如果没有给出,所有种类都应该有一个权重。 “balanced”模式使用y的值自动调整与输入数据中的类频率成反比的权重,如n_samples /(n_classes * np.bincount(y))

|  verbose : int, (default=0)
启用详细输出。 注意,此设置利用liblinear中的每进程运行时设置,如果启用,可能无法在多线程上下文中正常工作。

|  random_state : int, RandomState instance or None, optional (default=None)
在随机数据混洗时使用的伪随机数生成器的种子。 如果是int,则random_state是随机数生成器使用的种子; 如果是RandomState实例,则random_state是随机数生成器; 如果为None,则随机数生成器是np.random使用的RandomState实例。

|  max_iter : int, (default=1000)
要运行的最大迭代次数。

方法:

decision_function(X)          预测样本的置信度分数。
densify()                               将系数矩阵转换为密集阵列格式。
fit(X,y [,sample_weight])    根据给定的训练数据拟合模型。
get_params([deep])            获取此估算工具的参数。
predict(X)                             预测X中样本的类标签。
score(X,y [,sample_weight])     返回给定测试数据和标签的平均准确度。
set_params(** PARAMS)           设置此估算器的参数。
sparsify()                             将系数矩阵转换为稀疏格式。

SVC和LinearSVC的区别以及SGDClassifier:

SVC:
使用libsvm实现支持向量机分类器:内核可以是非线性的,但其SMO算法不能像LinearSVC那样扩展到大量样本。此外,SVC多类模式使用一对一方案实现,而LinearSVC使用一个对剩余方案。通过使用sklearn.multiclass.OneVsRestClassifier包装器,可以使用SVC实现一个与剩余的一个。最后,如果输入是C连续的,SVC可以在没有内存复制的情况下拟合密集数据。稀疏数据仍然会产生内存复制。
sklearn.linear_model.SGDClassifier:
SGDClassifier可以通过调整惩罚和损失参数来优化与LinearSVC相同的成本函数。此外,它需要更少的内存,允许增量(在线)学习,并实现各种损失功能和正规化机制。

官方文章地址:

SVC:http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html

LinearSVC:http://scikit-learn.org/stable/modules/generated/sklearn.svm.LinearSVC.html#sklearn.svm.LinearSVC

猜你喜欢

转载自blog.csdn.net/qq_36523839/article/details/81706027