核支持向量机

核支持向量机(SVM)是可以推广到更复杂模型的扩展,这些模型无法被输入空间的超平面定义。

  • SVM可以同时用于分类和回归

1、线性模型与非线性特征

线性模型在低维空间中可能非常受限,因为线和平面的灵活性有限。有一种方法可以让线性模型变得更加灵活,就是添加更多的特征(添加输入特征的交互项或多项式)。

👍ps:线性模型和非线性模型区别

  • 1、线性模型可以是用曲线拟合样本,但是分类的决策边界一定是直线的,例如逻辑回归模型。
  • 2、区分是否为线性模型,主要是看一个乘法式子中自变量x前的系数w,如果w只影响一个x,那么此模型为线性模型。或者判断决策边界是否是线性的。

2、核技巧

1)优势:

  • 向数据表示中添加非线性特征,可以让线性模型变得强大。但是我们通常来说不知道该添加哪些特征,而核技巧可以帮助解决这一问题。

2)原理:

  • 直接计算扩展特征表示中数据点之间的距离(内积),而不用实际对扩展进行计算。

3)方法:

  • 一是多项式核,计算原始特征所有可能的多项式;
  • 二是径向基函数核(RBF核),也叫高斯核,
    • 考虑所有阶数的所有可能的多项式,但阶数越高,特征的重要性越小。

3、理解SVM

1)定义:

  • 在训练过程中,SVM学习每个训练数据点对于两个类别之间的决策边界的重要性
    • 而通常只有一部分训练数据点对于定义决策边界很重要:位于决策边界上的那些点。
      • 这些点叫做支持向量

2)间距

  • 想要对新的样本点进行预测,需要测量它与每个支持向量的距离。

  • 分类决策是基于它与支持向量之间的距离以及训练过程中学到的支持向量重要性来做出的。

  • 高斯核间距

    • k(x1, x2) = exp(-γ ||x1 - x2||²)

      • ||x1 - x2||表示欧式距离,γ是控制高斯核宽度的参数。

4、SVM调参

  svm =SVM(kernel = ‘rbf’, C=10, gamma=0.1)

1)kernel

  • 选择核函数类型
    • “rbf”:径向基函数,
    • “linear”:线性,
    • “poly”:多项式,
    • “sigmoid”:神经元的非线性作用函数核函数,
    • “precomputed”:用户自定义核函数)。

2)gamma

  • 公式中的γ,用于控制高斯核的宽度,它决定了"点与点"之间靠近的距离,
    • gamma越大,高斯核宽度(半径)越小,点与点距离越大,模型复杂度越高。
    • 默认为1/n_features(特征总数的倒数)

3)c

  • 正则化参数,与线性模型中用到的类似。
    • c越小,模型越简单
    • 默认为1

5、为SVM预处理数据

数据集的特征具有完全不同的数量级,对核SVM有极大影响,需要对每个特征进行缩放,使其大致都处于同一范围(通常0到1之间)

  from sklearn.datasets import load_breast_cancer
  from sklearn.model_selection import train_test_split
  from sklearn.svm import SVC

  cancer = load_breast_cancer()#提取数据
  X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, 

  	stratify=cancer.target, random_state=0)#数据分类

  #计算训练集中每个特征的最小值
  min_on_training = X_train.min(axis=0)

  #计算训练集中每个特征的范围(最大值-最小值)
  range_on_training = (X_train - min_on_training).max(axis=0)

  #对每个数据点减去其特征的最小值,然后除以其特征的范围,使得每个特征的数据都在[0, 1]上
  X_train_scaled = (X_train - min_on_training) / range_on_training

  #利用训练集得出的最小值与范围对测试集做相同的变换
  X_test_scaled = (X_test - min_on_training) / range_on_training
  svc = SVC().fit(X_train_scaled, y_train)
  print("Accuracy on training set: {:.3f}".format(svc.score(X_train_scaled, y_train)))
  print("Accuracy on test set: {:.3f}\n".format(svc.score(X_test_scaled, y_test)))

输出

  Accuracy on training set: 0.991
  Accuracy on test set: 0.944

6、优点缺点

1)优点:核SVM在各种数据集上表现都很好

2)缺点:

  • 难以理解预测缘由和进行解释
  • 预处理数据和调参需要非常小心
posted @ 2022-04-22 16:24  朝南烟  阅读(188)  评论(0编辑  收藏  举报
body { color: #000; background-color: #e6e6e6; font-family: "Helvetica Neue",Helvetica,Verdana,Arial,sans-serif; font-size: 12px; min-height: 101%; background: url(https://images.cnblogs.com/cnblogs_com/caolanying/1841633/o_2009041…ly1geq8oc9owbj21hc0u0th5.jpg) fixed; } #home { margin: 0 auto; opacity: 0.8; width: 65%; min-width: 1080px; background-color: #fff; padding: 30px; margin-top: 50px; margin-bottom: 50px; box-shadow: 0 2px 6px rgba(100, 100, 100, 0.3); }