深度学习之sklearn-user guide 1.4

Support vector machines (SVM),中文译名支持向量机,是监督学习的一种,可以用来做分类、回归以及异常检测。

支持向量机有如下优点:

  • 在高维空间中有效。
  • 假设样本的维度比样本数量还要多,它仍然是有效的。
  • 在决策函数汇总使用训练样本的一个子集,内存效率高
  • 不同的核函数都可作为决策函数。sklearn中提供了常见的核函数,但是也可以自定核函数。

在sklearn中支持向量机的输入支持或密集或稀疏的向量。假设你是用稀疏矩阵输入支持向量机中做预测,你需要先对稀疏矩阵做fit操作。如果要获得最佳的性能,可以在输入是稀疏矩阵时scipy.sparse.csr_matrix或者输入时密集矩阵时numpy.ndarray调节参数C.

分类 classification

在对一个数据集做多分类时,svc,NuSvc和LinearSVC都可以取得不错的性能。

其中svc和NuSVC是比较相近的方法,允许的参数上有细微差别,此外还有不同的数学方程式。LinearSVC是支持向量分类的另一种实现方法。

对于不同的分类器,svc,NuSVC和LinearSVC将两个array作为输入,其中array X的形状是[n_samples, n_features],代表的是训练样本;而array y的大小是[n_samples],反映的是分类标签(由于是监督学习,所以这里是人为标记分类好的)

在拟合后,模型可以用来预测新的值:

支持向量机的决策函数依赖于一些训练样本的子集,并将其称之为支持向量,也就是处于支持向量机最大分割超平面上的样本。

这些支持向量的性质可以在如下几个方法中找到:support_vectors_support_ and n_support:

多分类 Multi-class classification

在多分类中svc和NuSVC的实现方法是one-against-one(一对一)。也即假设n_class是类别个数,那么将训练n_class * (n_class - 1) / 2个分类器并用这些分类器进行二分类训练。为了和其他分类器提供一样的接口,参数decision_function_shape允许将‘一对一’分类的结果聚合到(n_samples, n_classes)大小的决策函数中。

另一方面,在多分类上LinearSVC实现的策略是'one-vs-the-rest'(一对其他),因此只需要训练n_class 个分类器。如果仅仅只有两个类别,那么则只需训练一个分类器或说模型。

要注意的是LinearSVC还是先了一种可选的多分类策略,由Crammer和Singer指定的所谓的多类支持向量机,它提供了一个可选参数multi_class='crammer_singer'。对于一对其他的方式,它是不支持的。在实际中,’一对其他‘更流行,因为所分类的结果通常是相近的,但这种方式的训练时间却会少许多。

在LinearSVC模型中使用‘一对其他’时属性coef_ 和intercept_ 分别代表[n_class, n_features][n_class],每一行的系数代表诸多'一对其他'分类器中的一个,而intercept_则代表某一类中的排列。

SVC 而言,在'一对一'形式下,不同属性的布局有些相关。假设核函数是线性的,coef_ 和intercept_与之前谈到过的LinearSVC有些相似,除了coef_ 的形状是[n_class * (n_class - 1) / 2, n_features] ,因为训练了多个二分类器。

dual_coef_较难掌握,其形状是[n_class-1, n_SV],列对应于n_class * (n_class - 1) / 2个‘一对一’分类器中的支持向量。n_class - 1 个分类器都用到了所有的支持向量。每行中的n_class - 1个条目对应于这些分类器的对偶系数。

得分与概率 Scores and probabilities

SVC模型中的decision_function会对每个样本每个分类的得分(如果是在二分类问题中,会对每个样本进行评分)。当构造函数选项概率设置为真时,将通过predict_probapredict_log_proba方法启用类成员概率估计。对于二分类问题,使用Platt缩放来校准概率:对SVM的分数进行logistic回归,并通过对训练数据的附加交叉验证进行拟合。

不用说,对于大数据集进行涉及Platt缩放的交叉验证操作的开销非常大。除此之外,概率估计可能与得分的估计不一致,因为得分的argmax值不一定与概率的argmax值相同。Platt方法同样存在理论上的问题。如果需要置信度,也不一定是概率。所以可以这样设置probability=False并使用decision_function而不是predict_proba。

不平衡问题 Unbalanced problems

在这种情况下,需要更多重要的信息或者是个别样本的关键字来确定类别。这时可以使用class_weight和sample_weight。

SVC在fit操作时实现了一个关键字class_weight。

这是一个形如{class_label : value}的字典,其中value是大于0的浮点数,乘上一个参数C使得class_label = C * value。

SVC、NuSVC 、SVR和OneClassSVM则在fit操作时通过关键字sample_weight实现了对单个样本的权值。与class_weight,也要设置一个参数C使得C * sample_weight[i]。

回归 Regression

将支持向量分类方法推广到回归问题的求解中。这种方法称为支持向量回归。

通过支持向量分类(如上所述)产生的模型仅依赖于训练数据的子集,因为用于建立模型的成本函数不关心超出边界的训练点。类似地,由支持向量回归产生的模型仅依赖于训练数据的子集,因为用于建立模型的成本函数忽略了接近模型预测的任何训练数据。

有三种不同的方式实现支持向量回归。SVR 、NuSVR、 LinearSVR。其中LinearSVR提供了比SVR快速的实现方式,但是它仅考虑了线性核函数。而NuSVR则实现了稍不同于SVR和LinearSVR的方程。

对于分类,fit方法的输入有x,y,仅在此时y才可以是浮点数。

密度估计和异常检查 Density estimation, novelty detection

利用单类SVM进行异常检测,即给定一组样本,检测该集合的软边界,从而将新点分类为属于该集合还是不属于该集合。这样的实现称为OneClassSVM。

此时,这是一种无监督学习,fit方法在此时仅仅接收一个参数x,因为此时没有类标签了。

复杂度 Complexity

支持向量机是强大的工具,但是随着训练向量数量的增加,其计算和存储需求迅速增加。SVM的核心是二次规划问题(QP),从训练数据的其余部分中分离支持向量。这个基于LIbSVM的实现的QP求解器的复杂度在 O(n_{features} \times n_{samples}^2) 和 O(n_{features} \times n_{samples}^3) 之间,取决于实际使用LIbVM缓存的效率(依赖于数据集),如果矩阵非常稀疏, n_{features}将会被在这个向量样本中非0特征的平均值取代。

要注意的是,在LinearSVM中利用liblinear实现的算法比在SVC中利用libsvm-based实现更加高效,并且几乎可以线性地扩展到数百万个样本和/或特征。

实用技巧 Tips on Practical Use

  • 避免数据复制 如果传递给某些方法的数据不是C顺序连续的,并且是双精度的,那么在调用底层C实现之前将复制它。通过检查其标志属性,可以检查给定的NUMPY数组是否为C邻接数组。对于LinearSVC(和LogisticRegression),作为numpy数组传递的任何输入将被复制并转换为libliline内部稀疏数据表示(双精度浮点数和非零分量的int32索引)。如果您想适应大规模的线性分类器,而不复制密集的块C连续的双精度数组作为输入,我们建议使用SGDClassifier类。目标函数可以被配置成与线性SVC模型几乎相同。
  • 内核缓存大小 对于 SVC, SVR, nuSVC和NuSVR, 内核缓存的大小对更大问题的运行时间有很大影响。如果有足够的RAM可用,建议将cache_size设置为比默认值200(MB)更高的值,例如500(MB)或1000(MB)
  • C值 默认值为1。如果你有很多嘈杂的观察,你应该减少它。它对应于更多的正则化估计。
  • 支持向量机算法不是尺度不变的,因此强烈建议对数据进行缩放。例如,缩放输入向量X上的每个属性为[0,1]或[-1,+1],或将其标准化为均值0和方差1。注意,必须对测试向量施加相同的缩放以获得有意义的结果。
  • NuSVC/OneClassSVM/NuSVR 中的参数nu近似训练误差和支持向量的分数。
  • 在SVC中,如果分类数据不平衡,设置 class_weight='balanced' 或尝试不同的惩罚参数C。
  • 底层线性SVC实现使用随机数生成器在拟合模型时选择特征。因此,对于相同的输入数据,结果略有不同,这并不少见。如果发生这种情况,尝试用较小的tol参数
  • 在如下情况LinearSVC(loss='l2', penalty='l1', dual=False)使用惩罚项L1,会产生稀疏解。只有一个子集的特征权重不同于零,并有助于决策函数。增加C产生一个更复杂的模型(选择更多的特征)。产生“空”模型(所有权重等于零)的C值可以使用l1_min_c参数。

核函数   Kernel functions

常见的核函数如下:

  1. linear: \langle x, x'\rangle
  2. polynomial: (\gamma \langle x, x'\rangle + r)^dd is specified by keyword degreer by coef0
  3. rbf: \exp(-\gamma \|x-x'\|^2)\gamma is specified by keyword gamma, must be greater than 0.
  4. sigmoid (\tanh(\gamma \langle x,x'\rangle + r)), where r is specified by coef0.

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值