说明:本文依据《Sklearn 与 TensorFlow 机器学习实用指南》完成,所有版权和解释权均归作者和翻译成员所有,我只是搬运和做注解。
第五章是对支持向量机SVM的系统介绍,阐述支持向量机的核心概念,怎么使用这个强大的模型,以及它是如何工作的。
这应该是第三次做这方面的内容了,贴出另一个比较全面的SVM进阶博客。
https://blog.csdn.net/v_JULY_v/article/details/7624837
支持向量机(SVM)是个非常强大并且有多种功能的机器学习模型,能够做线性或者非线性的分类,回归,甚至异常值检测。机器学习领域中最为流行的模型之一,是任何学习机器学习的人必备的工具。SVM特别适合应用于复杂但中小规模数据集的分类问题。
本章使用数据为Sklearn中iris数据
源代码已经同步在github中https://github.com/jwc19890114/-02-learning-file-100days
1. 线性支持向量机分类
这里讲了软硬两种分类方式,一般会推荐使用软性间隔分类。
注意
在生成SVM模型的SVC函数中有两个关键参数,kernel和C
1.σ越大,f越平滑,非线性效能越小,对噪声越不敏感
- large σ: High Bias
- small σ: High Variance
2.C类似于正则化中1/λ的作用。C越大,拟合非线性的能力越强。较小的C会导致更宽的margin,但会有更多的间隔违规。如果SVM模型过拟合,可以尝试通过减小超参数C去调整。
- large C: High Variance
- small C: High Bias
若使用核函数,一定要对Feature做Feature Scaling(Normalization)。
若训练集m太小,但Feature数量n很大,则训练数据不足以拟合复杂的非线性模型,这种情况下只能用linear-kernel(就是fi=xifi=xi)不能用高斯核。
教程给出两张图,左图中绿色虚线作为决策边界分类效果不好,红色和紫色线虽然已有数据分类上表现较好,但是因为太靠近样本,这样在引入新的数据时会出现误判。右图中实线为SVM分类器的判定边界,不仅分开了两种类别,而且还尽可能地远离了最靠近的训练数据点。
以下的代码为生成对比图的,原教程中没有出现,看看就好
import numpy as npimport osimport matplotlib.pyplot as pltnp.random.seed(42)%matplotlib inlineplt.rcParams['axes.labelsize']=14plt.rcParams['xtick.labelsize']=12plt.rcParams['ytick.labelsize']=12# 在第三章中已经介绍了iris的数据结构,这里做多个特征分类,所以就获取了data字段的2,3列,就是长度和宽度数据from sklearn.svm import SVCfrom sklearn import datasetsiris = datasets.load_iris()X = iris["data"][:, (2, 3)] # petal length, petal widthy = iris["target"]setosa_or_versicolor = (y == 0) | (y == 1)X = X[setosa_or_versicolor]y = y[setosa_or_versicolor]# 训练一个SVM模型svm_clf = SVC(kernel="linear