页面树结构

版本比较

标识

  • 该行被添加。
  • 该行被删除。
  • 格式已经改变。

目录

支持向量机(SVM)是一组用于分类, 回归异常值检测的监督学习方法。

支持向量机的优点是:

  • 在高维空间有效。
  • 在维度数量大于样本数量的情况下仍然有效。
  • 在决策功能(称为支持向量)中使用训练点的子集,因此它也是内存有效的。
  • 多功能:可以为决策功能指定不同的内核函数。提供通用内核,但也可以指定自定义内核。

支持向量机的缺点包括:

  • 如果特征数量远远大于样本数量,则该方法可能会导致较差的性能。
  • 支持向量机不直接提供概率估计,这些是使用昂贵的五-折交叉验证计算的(参见下面的分数和概率)。

scikit学习中的支持向量机支持密集(numpy.ndarray可转换为numpy.asarray)和稀疏(任意scipy.sparse)样本向量作为输入。然而,为了使用SVM对稀疏数据进行预测,它必须符合这些数据。为了获得最佳性能,请使用C-ordered numpy.ndarray(密集)或 scipy.sparse.csr_matrix(稀疏)dtype=float64

 

分类

SVCNuSVC并且LinearSVC是能够对数据集执行多类分类的类。

SVC并且NuSVC是类似的方法,但是接受稍微不同的参数集合并具有不同的数学公式(参见数学公式)。另一方面,LinearSVC对于线性内核的情况,是支持向量分类的另一个实现。请注意, LinearSVC不接受关键字kernel,因为这被假定为线性的。它还缺少一些成员 SVCNuSVC一样support_

作为其它分类器,SVCNuSVC和 LinearSVC作为输入的两个阵列:大小的数组X 保持训练样本,类别标签(字符串或整数),大小的量阵列y :通过两个输入阵列(训练集X [n * n],标签集y [n])实现分类:训练集X ( [n_samples, n_features] )提供训练样本;标签集y ([n_samples])标记类别(字符串或整数) :

代码块
languagepy
>>> from sklearn import svm
>>> X = [[0, 0], [1, 1]]
>>> y = [0, 1]
>>> clf = svm.SVC()
>>> clf.fit(X, y)  
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
    decision_function_shape=None, degree=3, gamma='auto', kernel='rbf',
    max_iter=-1, probability=False, random_state=None, shrinking=True,
    tol=0.001, verbose=False)

装配后,可以使用该模型来预测新值:

代码块
languagepy
>>> clf.predict([[2., 2.]])
array([1])

支持向量机的决策功能取决于训练数据的一些子集,称为支持向量。这些支持向量的一些属性可以在成员support_vectors_中找到,support_并且 n_support

代码块
languagepy
>>> # 获取支持向量
>>> clf.support_vectors_
array([[ 0.,  0.],
       [ 1.,  1.]])
>>> # 获取支持向量的索引
>>> clf.support_ 
array([0, 1]...)
>>> # 得到支持向量的每个分类的number
>>> clf.n_support_ 
array([1, 1]...)

多类分类

SVCNuSVC实施“一对一”的方法(Knerr等,1990)进行多类分类。如果n_class是类的数量,那么构造 n_class * (n_class - 1) / 2 【补充说明:两两组合,可以百度查询:组合数公式】 个分类器,并且从两个类中构建每个训练数据。 为了提供与其他分类器的一致的界面,decision_function_shape选项允许将“一对一”分类器的结果聚合到shape  (n_samples, n_classes) 的决策函数:

代码块
languagepy
>>> X = [[0], [1], [2], [3]]
>>> Y = [0, 1, 2, 3]
>>> clf = svm.SVC(decision_function_shape='ovo')
>>> clf.fit(X, Y) 
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
    decision_function_shape='ovo', degree=3, gamma='auto', kernel='rbf',
    max_iter=-1, probability=False, random_state=None, shrinking=True,
    tol=0.001, verbose=False)
>>> dec = clf.decision_function([[1]])
>>> dec.shape[1] # 4 classes: 4*3/2 = 6
6
>>> clf.decision_function_shape = "ovr"
>>> dec = clf.decision_function([[1]])
>>> dec.shape[1] # 4 classes
4

另一方面,LinearSVC实施“一对一”的多类策略,从而训练n_class模型。如果只有2类,只有一个模型被训练:

代码块
languagepy
>>> lin_clf = svm.LinearSVC()
>>> lin_clf.fit(X, Y) 
LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True,
     intercept_scaling=1, loss='squared_hinge', max_iter=1000,
     multi_class='ovr', penalty='l2', random_state=None, tol=0.0001,
     verbose=0)
>>> dec = lin_clf.decision_function([[1]])
>>> dec.shape[1]
4

有关决策函数的完整描述,请参阅数学公式

请注意,LinearSVC它还实现了一个替代的多类策略,即由Crammer和Singer制定的所谓的多类SVM,通过使用该选项multi_class='crammer_singer'。这种方法是一致的,这对于一对其余分类是不正确的。在实践中,一对其余分类通常是首选的,因为结果大部分是相似的,但运行时间明显较少。


对于“一对其余” LinearSVC,属性coef_和intercept_分别具有形状[n_class,n_features]和[n_class]。 系数的每一行对应于n_class中的一个,许多“一对其余”分类器,并且类似于截距,按照“一”类的顺序。


在“一对一”SVC的情况下,属性的布局有一点更多的参与。 在具有线性内核的情况下,coef_和intercept_的布局类似于上述描述的LinearSVC,除了coef_的形状是[n_class * (n_class - 1) / 2, n_features],对应于 许多二进制分类器。0到n级的顺序为“0 vs 1”,“0 vs 2”,...“0 vs n”,“1 vs 2”,“1 vs 3”,“1 vs n” 。。“n-1 vs n”。

 

double_coef_的形状是[n_class-1,n_SV],有点难以把握布局。 列对应于任何 n_class * (n_class - 1) / “一对一”分类器中涉及的支持向量。 每个支持向量在n_class - 1分类器中使用。 每行中的n_class - 1个条目对应于这些分类器的双重系数。

 

这可以通过一个例子更清楚:

考虑一个三级问题与具有0级三个支撑矢量 和第1类和具有两个支持向量2 分别。对于每个支持向量,有两个双重系数。让我们把支持向量的系数中类之间的分类一世ķ 。然后dual_coef_看起来像这样:

 

0级SV的系数
1类SV的系数
2类SV的系数

分数和概率

SVC方法decision_function为每个样本提供每个类别的分数(或二进制数据中每个样本的单个分数)。当构造函数选项probability设置为True,启用类成员概率估计(来自方法predict_probapredict_log_proba)。在二进制的情况下,使用Platt比例来校正概率:对SVM分数进行逻辑回归,通过对训练数据的附加交叉验证进行拟合。在多类案例中,根据Wu et al。(2004年)。

不用说,Platt扩展涉及的交叉验证是大型数据集的昂贵操作。此外,概率估计可能与分数不一致,在分数的“argmax”可能不是概率的argmax的意义上。(例如,在二进制分类中,样本可以被标记predict为属于具有根据的概率<1/2的类predict_proba。)Platt的方法也被称为具有理论问题。如果需要信心分数,但这些不一定是概率,那么建议设置probability=False 和使用decision_function而不是predict_proba

提示

参考文献:

不平衡问题

在需要更加重视某些类别或某些个人样本关键字class_weight并 sample_weight可以使用的问题中。

SVC(但不是NuSVCclass_weightfit方法中实现一个关键字 。它的形式的字典 ,其中值是浮点数> 0,则设置参数类的到。{class_label : value}Cclass_labelC * value

SVCNuSVCSVRNuSVR和 OneClassSVM也实施在方法个体样本的权重 fit,通过关键字sample_weight。类似于class_weight这些,将C第i个示例的参数设置为。C * sample_weight[i]

 

回归

支持向量分类的方法可以扩展到解决回归问题。这种方法称为支持向量回归。

由支持向量分类产生的模型(如上所述)仅取决于训练数据的一部分,因为用于构建模型的成本函数不在于超出边际的训练点。类似地,由支持向量回归产生的模型仅取决于训练数据的子集,因为构建模型的成本函数忽略了接近模型预测的任何训练数据。

有支持向量回归的三种不同的实现方式: SVRNuSVRLinearSVRLinearSVR 提供比SVR更快的实现,但只考虑线性内核,而NuSVR实现与SVRLinearSVR略有不同的方式。有关详细信息,请参阅 实施细节。

与分类类一样,拟合方法将作为参数向量X,y,只有在这种情况下,y预期具有浮点值而不是整数值:

代码块
languagepy
>>> from sklearn import svm
>>> X = [[0, 0], [2, 2]]
>>> y = [0.5, 2.5]
>>> clf = svm.SVR()
>>> clf.fit(X, y) 
SVR(C=1.0, cache_size=200, coef0=0.0, degree=3, epsilon=0.1, gamma='auto',
    kernel='rbf', max_iter=-1, shrinking=True, tol=0.001, verbose=False)
>>> clf.predict([[1, 1]])
array([ 1.5])

例子:

 

密度估计,新奇检测

一类SVM用于新颖性检测,即给定一组样本,它将检测该集合的软边界,以便将新点归类为属于该集合。调用实现这个的类OneClassSVM

在这种情况下,由于它是一种无监督的学习方法,拟合方法将仅作为输入数组X,因为没有类标签。

有关此用法的更多详细信息,请参阅新颖性和异常值检测

例子:

 

复杂性

支持向量机是强大的工具,但是它们的计算和存储需求随着训练向量的数量的增加而迅速增加。SVM的核心是二次规划问题(QP),将支持向量与剩余的训练数据进行分离。求解器使用这个QP LIBSVM为基础的执行之间的尺度以及 对如何有效地根据libsvm的缓存在实践中(数据集依赖)使用。如果数据非常稀疏,则应该用样本向量中的非零特征的平均数来代替。

还要注意,对于线性情况,liblinear实现使用的 算法比其基于libsvmLinearSVC效率要高得多,并且可以几乎线性地扩展到数百万个样本和/或特征。SVC

 

实用窍门

  • 避免数据复制:对SVCSVRNuSVC和 NuSVR,如果通过一定的方法将数据不是C有序连续的,而双精度,它会调用底层的C实现之前复制。您可以通过检查其flags属性来检查给定的numpy数组是否为C 连续的。

    对于LinearSVC(和LogisticRegression)作为numpy数组传递的任何输入将被复制并转换为liblinear内部稀疏数据表示(非零组件的双精度浮点数和int32索引)。如果你想要适合一个大规模的线性分类器,而不需要复制一个密集的数字C连续的双精度数组作为输入,我们建议使用SGDClassifier该类。目标函数可以配置为与LinearSVC 模型几乎相同。

  • 内核缓存大小:对SVCSVRnuSVC和 NuSVR,内核缓存的大小有较大的问题,在运行时间有很大的影响。如果您有足够的RAM可用,建议设置cache_size为比默认值200(MB)更高的值,例如500(MB)或1000(MB)。

  • 设置为CC1在默认情况下,这是一个合理的默认选择。如果你有很多嘈杂的观察结果,你应该减少它。它对应于更多的估计。

  • 支持向量机算法不是尺度不变量,因此强烈建议您扩展数据。例如,将输入向量X上的每个属性缩放到[0,1]或[-1,+ 1],或将其标准化为平均值0和方差1.注意,必须将相同的缩放应用于测试向量获得有意义的结果。有关缩放和归一化的更多详细信息,请参见 预处理数据

  • 参数nuNuSVCOneClassSVMNuSVR 近似训练误差和支持向量的分数。

  • SVC,如果用于分类的数据不平衡(例如,许多正数和少量负数),请设置class_weight='balanced'和/或尝试不同的惩罚参数C

  • 底层LinearSVC实现使用随机数生成器来在拟合模型时选择特征。因此,相同输入数据的结果略有不同,因此并不罕见。如果发生这种情况,请尝试使用较小的tol参数。

  • 使用提供的L1惩罚产生稀疏解,即只有特征权重的子集不同于零,并有助于决策函数。增加产量是一个更复杂的模型(选择更多的特征)。可以使用产生“零”模型(所有权重等于零)的值。LinearSVC(loss='l2', penalty='l1', dual=False)CCl1_min_c

 

内核函数

内核函数可以是任何如下:

  • 线性:
  • 多项式:。 ð由关键字degreeby 指定coef0
  • RBF: 由关键字指定gamma,必须大于0。
  • sigmoid(),其中指定coef0

初始化时,关键字内核指定不同的内核:

代码块
languagepy
>>> linear_svc = svm.SVC(kernel='linear')
>>> linear_svc.kernel
'linear'
>>> rbf_svc = svm.SVC(kernel='rbf')
>>> rbf_svc.kernel
'rbf' 

自定义内核

您可以通过将内核作为python函数或通过预计算Gram矩阵来定义自己的内核。

具有自定义内核的分类器的行为方式与其他任何分类器相同,不同之处在于:

  • 字段support_vectors_现在是空的,只有支持向量的索引被存储support_
  • fit() 存储方法中第一个参数的引用(而不是副本)以供将来参考。如果该数组在使用之间发生变化fit()predict()您将会有意想不到的结果。

使用Python函数作为内核

您还可以通过将kernel构造函数中的关键字传递一个函数来使用自己定义的内核。

您的内核必须以两个形状的矩阵作为参数 , 并返回一个形状的内核矩阵。(n_samples_1, n_features)(n_samples_2, n_features)(n_samples_1, n_samples_2)

以下代码定义了一个线性内核并创建了将使用该内核的分类器实例:

代码块
languagepy
>>> import numpy as np
>>> from sklearn import svm
>>> def my_kernel(X, Y):
...     return np.dot(X, Y.T)
...
>>> clf = svm.SVC(kernel=my_kernel)

例子:

使用格拉姆矩阵 

kernel='precomputed'在fit方法中设置并传递Gram矩阵而不是X。此时,必须提供所有训练向量和测试向量之间的内核值。

代码块
languagepy
>>> import numpy as np
>>> from sklearn import svm
>>> X = np.array([[0, 0], [1, 1]])
>>> y = [0, 1]
>>> clf = svm.SVC(kernel='precomputed')
>>> # linear kernel computation
>>> gram = np.dot(X, X.T)
>>> clf.fit(gram, y) 
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
    decision_function_shape=None, degree=3, gamma='auto',
    kernel='precomputed', max_iter=-1, probability=False,
    random_state=None, shrinking=True, tol=0.001, verbose=False)
>>> # predict on training examples
>>> clf.predict(gram)
array([0, 1])

RBF内核的参数

当与训练的SVM 径向基函数(RBF)内核,两个参数必须考虑:CgammaC所有SVM内核通用的参数都是根据决策表面的简单性,对训练样本进行错误分类。低水平C使得决策表面平滑,而高度C旨在正确地分类所有培训示例。 gamma定义单个训练样本的影响程度。更大的gamma是,其他更多的例子必须受到影响。

的正确选择Cgamma是对SVM的性能至关重要。其中一个建议使用sklearn.model_selection.GridSearchCV与 Cgamma相隔很远成倍选择良好的价值观。

例子:

 

数学公式

支持向量机在高或无限维空间中构建超平面或一组超平面,可用于分类,回归或其他任务。直观地,通过与任何类别的最接近的训练数据点(所谓的功能余量)具有最大距离的超平面实现良好的分离,因为通常越大的边界越小,分类器的泛化误差越低。

SVC 

给定的训练矢量,I = 1,...,N,在两班,和一个矢量,SVC解决了以下主要问题:

它的双重是

其中Ë是所有那些的载体,是上界, Q是一个ññ半正定矩阵, 其中 是内核。这里训练向量通过该函数隐含地映射成更高(可能是无限的)维空间

决策功能是:

 

注意

注意:虽然源自SVM模型LIBSVMliblinear使用C作为调整参数,其他大多数估计使用alpha。两者之间的关系是

这个参数可以通过成员访问dual_coef_ 保持所述产品support_vectors_其保持支撑载体和intercept_保持该独立术语

提示

参考文献:

NuSVC 

我们引入一个新的参数来控制支持向量和训练误差的数量。参数是训练误差分数和支持向量分数下限的上限。

可以显示-SVC制剂是-SVC的重新C配制,因此在数学上是等效的。

SVR 

给定训练向量i = 1,...,n,矢量 -SVR解决了以下原始问题:

它的双重是

其中Ë是所有那些的载体,是上界, Q是一个ññ半正定矩阵,  是内核。这里训练向量通过该函数隐含地映射成更高(可能是无限的)维空间

决策功能是:

这些参数可以通过成员访问dual_coef_ ,其保持的差support_vectors_其保持支撑载体和intercept_保持该独立术语

提示

参考文献:

实现细节

在内部,我们使用libsvmliblinear来处理所有的计算。这些库使用C和Cython包装。

提示

参考文献:

有关使用的算法的实现和细节的描述,请参考