西瓜书-4sklearn包中svm算法的使用

计划

学习时长:7/13——7/14
任务标题:了解sklearn包中svm算法的使用
任务简介:阅读sklearn-user guide 1.4.1
任务详解:
了解sklearn包中的SVM算法是如何使用的,请大家认真看完1.4.1的内容,重点关注两部分内容:第一,怎么使用【SVC】这个api,第二,这个api中的参数是什么意思。其中在最末端有一个案例的链接,大家可选择看,不作为任务要求。同学们,对这部分学习的深入程度,依据个人代码能力而定。
资料链接:https://scikit-learn.org/dev/modules/svm.html
内容:参照链接给的代码或者下图代码,实际动手敲一遍,使用sklearn的SVM接口实现鸢尾花分类,将运行结果截图。
https://scikit-learn.org/dev/auto_examples/svm/plot_iris_svc.html#sphx-glr-auto-examples-svm-plot-iris-svc-py

学习

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

支持向量机的优点是:

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

支持向量机的缺点包括:

  • 如果要素的数量远远大于样本数量,请避免在选择内核函数时过度拟合,并且正则化项是至关重要的。
  • SVM不直接提供概率估计,这些是使用昂贵的五重交叉验证计算的。

scikit-learn中的支持向量机支持密集(numpy.ndarray可转换为by by numpy.asarray)和稀疏(任意scipy.sparse)样本向量作为输入。但是,要使用SVM对稀疏数据进行预测,它必须适合此类数据。为获得最佳性能,请使用C-ordered numpy.ndarray(密集)或 scipy.sparse.csr_matrix(稀疏)dtype=float64。

分类

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

回归

支持向量分类的方法可以扩展到解决回归问题。此方法称为支持向量回归。
由支持向量分类(如上所述)产生的模型仅取决于训练数据的子集,因为用于构建模型的成本函数不关心超出边界的训练点。类似地,由支持向量回归产生的模型仅取决于训练数据的子集,因为用于构建模型的成本函数忽略了接近模型预测的任何训练数据。
有支持向量回归的三种不同的实现方式: SVR,NuSVR和LinearSVR。LinearSVR 提供了比实际更快的实现,SVR但只考虑了线性内核,同时NuSVR实现了与SVR和稍微不同的公式LinearSVR。

实际使用技巧

  • 避免数据复制:对SVC,SVR,NuSVC和 NuSVR,如果通过一定的方法将数据不是C有序连续的,而双精度,它会调用底层的C实现之前复制。您可以通过检查其flags属性来检查给定的numpy数组是否为C-contiguous 。
    对于LinearSVC(和LogisticRegression)任何作为numpy数组传递的输入将被复制并转换为liblinear内部稀疏数据表示(双精度浮点数和非零组件的int32索引)。如果你想要一个大规模的线性分类器,而不是复制一个密集的n-cy连续双精度数组作为输入,我们建议使用SGDClassifier该类。目标函数可以配置为与LinearSVC 模型几乎相同。
  • 内核缓存大小:对SVC,SVR,NuSVC和 NuSVR,内核缓存的大小有较大的问题,在运行时间有很大的影响。如果有足够的RAM可用,建议设置cache_size为高于默认值200(MB)的值,例如500(MB)或1000(MB)。
  • 设置为C:C是1在默认情况下,这是一个合理的默认选择。如果你有很多嘈杂的观察,你应该减少它。它对应于更多地规范估计。
    LinearSVC并且当它变大时LinearSVR不太敏感C,并且在一定阈值之后预测结果停止改善。同时,较大的C值将需要更多的时间来训练,有时长达10倍​​,如Fan等人所示。(2008年)
  • 支持向量机算法不是规模不变的,因此强烈建议您扩展数据。例如,将输入向量X上的每个属性缩放为[0,1]或[-1,+ 1],或将其标准化为均值0和方差1.请注意,必须将相同的缩放应用于测试向量获得有意义的结果 有关缩放和规范化的更多详细信息,请参阅 预处理数据一节。
  • 参数nu在NuSVC/ OneClassSVM/ NuSVR 近似于训练误差和支持向量的分数。
  • 在SVC,如果用于分类的数据是不平衡的(例如,许多正数且很少负数),则设置class_weight='balanced’和/或尝试不同的惩罚参数C。
  • 底层实现随机性:的底层实现SVC和NuSVC使用一个随机数发生器仅洗牌为概率估计的数据(当 probability被设置为True)。可以使用random_state参数控制该随机性。如果probability设置为False 这些估算器不是随机的并且random_state对结果没有影响。底层OneClassSVM实现类似于SVC和NuSVC。由于没有提供概率估计OneClassSVM,因此它不是随机的。
    底层LinearSVC实现使用随机数生成器在使用双坐标下降(即,dual设置为True)时拟合模型时选择要素。因此,对于相同的输入数据具有略微不同的结果并不罕见。如果发生这种情况,请尝试使用较小的tol参数。这种随机性也可以用random_state参数控制。何时dual设置为False底层实现LinearSVC不是随机的,random_state对结果没有影响。
  • 使用由提供的L1惩罚产生稀疏解,即,仅特征权重的子集不为零并且对决策函数有贡献。增加产量是一个更复杂的模型(选择更多功能)。在其产生一个“空”模型(所有重量等于零)值可以使用下式计算。LinearSVC(loss=‘l2’, penalty=‘l1’, dual=False)CCl1_min_c

内核函数

在这里插入图片描述

实验

print(__doc__)
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets


def make_meshgrid(x, y, h=.02):
    x_min, x_max = x.min() - 1, x.max() + 1
    y_min, y_max = y.min() - 1, y.max() + 1
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
                         np.arange(y_min, y_max, h))
    return xx, yy


def plot_contours(ax, clf, xx, yy, **param):
    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    out = ax.contourf(xx, yy, Z, **param)
    return out


iris = datasets.load_iris()
x = iris.data[:, :2]
y = iris.target
c = 1.0

models = (svm.SVC(kernel='linear', C=c),
          svm.LinearSVC(C=c, max_iter=10000),
          svm.SVC(kernel='rbf', gamma=0.7, C=c),
          svm.SVC(kernel='poly', degree=3, gamma='auto', C=c)
          )
models = (clf.fit(x, y) for clf in models)

titles = ('SVC with linear kernel',
          'LinearSVC (linear kernel)',
          'SVC with RBF kernel',
          'SVC with polynomial (degree 3) kernel'
          )

fig, sub = plt.subplots(2, 2)
plt.subplots_adjust(wspace=0.4, hspace=0.4)

x0, x1 = x[:, 0], x[:, 1]
xx, yy = make_meshgrid(x0, x1)

for clf, title, ax in zip(models, titles, sub.flatten()):
    plot_contours(ax, clf, xx, yy,
                  cmap=plt.cm.coolwarm, alpha=0.8)
    ax.scatter(x0, x1, c=y, cmap=plt.cm.coolwarm, s=20, edgecolors='k')
    ax.set_xlim(xx.min(), xx.max())
    ax.set_ylim(yy.min(), yy.max())
    ax.set_xlabel('Sepal length')
    ax.set_ylabel('Sepal width')
    ax.set_xticks(())
    ax.set_yticks(())
    ax.set_title(title)

plt.show()

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值