1、支持向量机(SVM)
1.1、SVM概述
在机器学习中,支持向量机(Support Vector Machine,SVM)算法既可以用于回归问题(SVR),也可以用于分类问题(SVC)
支持向量机是一种经典的监督学习算法,通常用于分类问题。SVM在机器学习知识结构中的位置如下:
SVM的核心思想是将分类问题转化为寻找分类平面的问题,并通过最大化分类边界点(支持向量)到分类平面的距离(间隔)来实现分类
如图所示,左图展示了三种可能的线性分类器的决策边界,虚线所代表的模型表现非常糟糕,甚至都无法正确实现分类;其余两个模型在训练集上表现堪称完美,但是它们的决策边界与实例过于接近,导致在面对新样本时,表现可能不会太好
右图中的实线代表SVM分类器的决策边界,两虚线表示最大间隔超平面,虚线之间的距离(两个异类支持向量到超平面的距离之和)称为超平面最大间隔,简称间隔;SVM的决策边界不仅分离了两个类别,而且尽可能的远离了最近的训练实例,距离决策边界最近的实例称为支持向量
1.2、SVM原理
SVM的最优化问题就是要找到各类样本点到超平面的距离最远,也就是找到最大间隔超平面。任意超平面的方程为
ω
T
x
+
b
=
0
\omega^Tx+b=0
ωTx+b=0
其中 ω \omega ω为超平面的法向量,决定了超平面的方向; b b b为位移项,决定了超平面到原点间的距离
二维空间点
(
x
,
y
)
(x,y)
(x,y)到直线
A
x
+
B
y
+
C
=
0
Ax+By+C=0
Ax+By+C=0的距离公式为
d
=
∣
A
x
+
B
y
+
C
∣
A
2
+
B
2
d=\frac{|Ax+By+C|}{\sqrt{A^2+B^2}}
d=A2+B2∣Ax+By+C∣
扩展到N维空间中,点
(
x
1
,
x
2
,
.
.
.
x
n
)
(x_1,x_2,...x_n)
(x1,x2,...xn)到直线
ω
T
x
+
b
=
0
\omega^Tx+b=0
ωTx+b=0的距离为
d
=
∣
ω
T
x
+
b
∣
∣
∣
ω
∣
∣
d=\frac{|\omega^Tx+b|}{||\omega||}
d=∣∣ω∣∣∣ωTx+b∣
其中, ∣ ∣ ω ∣ ∣ ||\omega|| ∣∣ω∣∣= ω 1 2 + ω 2 2 + . . . + ω n 2 \sqrt{\omega_1^2+\omega_2^2+...+\omega_n^2} ω12+ω22+...+ωn2
SVM假设样本是线性可分的,则任意样本点到超平面的距离可写为
d
=
∣
ω
T
x
+
b
∣
∣
∣
ω
∣
∣
d=\frac{|\omega^Tx+b|}{||\omega||}
d=∣∣ω∣∣∣ωTx+b∣
为方便描述和计算,设
y
i
∈
−
1
,
1
y_i\in{-1,1}
yi∈−1,1,其中1表示正例,-1表示负例,则有
{
ω
T
x
i
+
b
≥
+
1
y
i
=
+
1
ω
T
x
i
+
b
≤
−
1
y
i
=
−
1
\begin{cases} \omega^Tx_i + b ≥ +1 \, \, & y_i=+1 \\ \omega^T x_i+b ≤ -1 \, \, & y_i=-1 \end{cases}
{ωTxi+b≥+1ωTxi+b≤−1yi=+1yi=−1
此时,两个异类支持向量到超平面的距离之和为
γ
i
=
y
i
(
ω
T
∣
∣
ω
∣
∣
⋅
x
i
+
b
∣
∣
ω
∣
∣
)
=
2
∣
∣
ω
∣
∣
\gamma_i=y_i\left(\frac{\omega^T}{||\omega||}\cdot x_i + \frac{b}{||\omega||} \right) = \frac{2}{||\omega||}
γi=yi(∣∣ω∣∣ωT⋅xi+∣∣ω∣∣b)=∣∣ω∣∣2
其中, γ \gamma γ称为间隔。最大间隔不仅与 ω \omega ω有关,偏置 b b b也会隐性影响超平面的位置,进而对间隔产生影响
现在,我们只需要使间隔
γ
\gamma
γ最大,即
arg
max
ω
,
b
2
∣
∣
ω
∣
∣
\arg \mathop{\max}\limits_{\omega,b} \frac{2}{||\omega||}
argω,bmax∣∣ω∣∣2
最大化间隔
γ
\gamma
γ,显然只需要最小化
∣
∣
ω
∣
∣
||\omega||
∣∣ω∣∣,于是,上式可重写为
arg
min
ω
,
b
1
2
∣
∣
ω
∣
∣
2
\arg \mathop{\min}\limits_{\omega,b} \frac{1}{2}||\omega||^2
argω,bmin21∣∣ω∣∣2
这里的平方和之前一样,一是为了方便计算,二是可以将目标函数转化为凸函数的凸优化问题。称该式为SVM的基本型
1.3、SVM的损失函数
1.3.1、软间隔与硬间隔
如果我们严格让所有实例都不在最大间隔之间,并且位于正确的一边,这就是硬间隔分类。但是硬间隔分类有两个问题:首先,它只在数据是线性可分时才有效;其次,它对异常值较敏感
要避免这些问题,可以使用更灵活的模型。目标是尽可能在保持最大间隔的同时允许间隔违例(在最大间隔之间,甚至位于错误的一边),在最大间隔与违例之间找到良好的平衡,这就是软间隔分类
软间隔的目标函数为
J
=
1
2
∣
∣
ω
∣
∣
2
+
C
∑
i
=
1
n
ε
i
J=\frac{1}{2}||\omega||^2 + C\sum_{i=1}^{n}\varepsilon_i
J=21∣∣ω∣∣2+Ci=1∑nεi
其中,超参数
C
C
C为惩罚系数,
ε
\varepsilon
ε为松弛因子。
C
C
C越小,惩罚越小(间隔越宽,违例越多)
1.3.2、核函数
对于非线性数据集,线性支持向量机无法处理。我们希望将非线性问题转化为线性可分问题来求解。这时,需要引入一个新的概念:核函数
核函数可以将样本从原始空间映射到一个高维空间,使得样本在新的空间中线性可分
更多关于核函数的介绍可参考这篇文章:https://blog.csdn.net/mengjizhiyou/article/details/103437423
核函数将原始空间中的向量作为输入向量,并返回转换后的特征空间中向量的内积。通过核方法可以学习非线性支持向量机,等价于在高维特征空间中学习线性支持向量机
所以在非线性SVM中,核函数的选择就是影响SVM最大的变量。常用核函数有:线性核、多项式核、高斯核、拉普拉斯核和Sigmoid核等
1.4、支持向量机分类的优缺点
优点:
- 可适用于处理高维空间数据,对于数据维度远高于样本数据量的情况也有效
- 在决策函数中使用少部分训练数据(支持向量)进行决策,内存占用小,效率高
- 通过支持向量选取最优决策边界,对噪声和异常值的敏感度较低,稳定性较好
- 更加通用,可处理非线性分类任务,提供了多种通用核函数,也支持自定义核函数
缺点:
- 解释性差:不像K-Means、决策树那样直观,不易于理解,可解释性差
- 对参数和核函数敏感:性能高度依赖于惩罚参数C和核函数的选择。如果参数选择不当,容易导致过拟合或欠拟合
- 非线性分类训练时间长:核函数涉及到二次规划问题,需要使用复杂的优化算法,当支持向量的数量较大时,计算复杂度较高
2、Scikit-Learn支持向量机分类
2.1、Scikit-Learn支持向量机分类API
Scikit-Learn支持向量机分类的API如下:
class sklearn.svm.SVC(*, C=1.0, kernel='rbf', degree=3, gamma='scale', coef0=0.0, shrinking=True, probability=False, tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=-1, decision_function_shape='ovr', break_ties=False, random_state=None)
官方对该API的描述为:
SVC的实现基于libsvm
。SVC的拟合时间与样本数量成二次方关系,适用于样本数量较小的情况。如果样本数量过大(超过1W),建议使用其他模型,例如LinearSVC
或SGDClassifier
。多类支持是根据One Vs One方案处理的
官方文档:https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html
中文官方文档:https://scikit-learn.org.cn/view/781.html
API参数及说明如下:
参数 | 说明 |
---|---|
C |
正则化系数,默认为1.0。正则化的强度与C 成反比。C 越小,惩罚越大,泛化能力越弱(过拟合);反之,泛化能力越强(欠拟合) |
kernel |
算法中使用的核函数,默认为rbf (径向基核函数/高斯核:样本到数据中心之间径向距离的单调函数)。其他参数有:linear :线性核函数(不适应线性不可分数据);ploy :多项式核函数,可以拟合复杂的超平面,但调参困难;sigmoid :Logistic函数(S型生长曲线);precomputed :Gram矩阵,表示已经提前计算好核矩阵,算法内部不再应用核函数 |
degree |
多项式核函数的次数,默认为3 |
gamma |
rbf 、poly 和sigmoid 的核系数, 默认为scale ,取值为1/(n_features*X.var()) ;其他参数还有auto ,取值为1/n_features
|
coef0 |
核函数中的常数项,仅在poly 和sigmoid 中有用,相当于对核函数映射的结果进行一个位移操作 |
shrinking |
是否使用收缩启发式,默认为True。当迭代次数过大时,启用可以缩短训练时间,但如果我们对停止迭代容忍度tol 较高时,不启用可能会更快一些 |
probability |
是否启用概率估计,默认为False。必须在调用fit 之前启用此参数,因为该方法内部使用5折交叉验证,因此会减慢该方法的速度 |
tol |
残差收敛条件,停止迭代容忍度,默认为1e-3
|
cache_size |
核缓存大小(单位:MB),默认为200。指模型在训练时,能占用的最大RAM空间 |
class_weight |
分类权重,为每个类别设置不同的惩罚参数C ,默认为None,不使用。balance 表示自动调整权重C 为n_samples/(n_classes*np.bincount(y)) ,y 为每个训练数据的标签值 |
verbose |
是否启用详细输出,默认为False |
max_iter |
求解器的最大迭代次数,默认为-1,不限制 |
decision_function_shape |
多分类策略,默认为ovr 。对于二分类,该参数将被忽略 |
break_ties |
是否打破平局(具有相同的分类概率),默认为False。如果为True,decision_function_shape 为ovr ,且分类数>2,则预测将根据decision_function 的置信度值打破平局,当两个类别具有相同的分类概率时,则根据类名排序,返回第一个类 |
random_state |
控制伪随机数的生成,保证多次训练时,数据洗牌是一致的,以便进行概率估计。当probability 为False时,该参数将被忽略 |
常用属性及说明如下:
属性 | 说明 |
---|---|
class_weight_ |
各类别的权重,一维数组类型 |
classes_ |
各类别的标签,一维数组类型 |
fit_status_ |
拟合状态,0拟合成功;1拟合失败,进行告警 |
intercept_ |
决策函数中的常量 |
n_features_in_ |
拟合过程中使用到的特征数量 |
feature_names_in_ |
拟合过程中使用到的特征的名称 |
n_iter_ |
迭代次数 |
support_ |
支持向量的索引 |
support_vectors_ |
所有支持向量,二维数组类型 |
shape_fit_ |
训练向量X的数组维度 |
常用方法及说明如下:
方法 | 说明 |
---|---|
decision_function(X) |
计算样本X的决策函数,X为二维数组类型,返回模型中每个类样本的决策函数 |
fit(X, y) |
训练数据,拟合模型 |
predict(X) |
对样本X进行分类(预测) |
predict_log_proba(X) |
计算样本X在每个类别上的对数概率,返回模型中每个类样本的对数概率 |
predict_proba(X) |
计算样本X在每个类别上的概率,返回模型中每个类样本的可能概率 |
score(X, y) |
返回给定测试数据和标签的平均准确度 |
2.2、支持向量机分类初体验(手写数字识别)
下面使用Scikit-Learn内置的手写数字数据集演示了支持向量机分类算法在图像识别上的应用
手写数字数据集由1797个8x8像素的数字图像组成。数据集的每个图像存储为8x8灰度值的二维数组;数据集的属性存储每个图像代表的数字,这包含在图像的标题中
数据集的前4张图像可视化如下:
import matplotlib.pyplot as plt
from sklearn import datasets
# 加载手写数字数据集
data = datasets.load_digits()
_, axes = plt.subplots(nrows=1, ncols=4, figsize=(10, 3))
for ax, image, label in zip(axes, data.images, data.target):
ax.set_axis_off()
image = image.reshape(8, 8)
ax.imshow(image, cmap=plt.cm.gray_r, interpolation="nearest")
ax.set_title(f"Label: {label}")
plt.show()
# 手写数字图像存储为一个8x8的二维数组
print(data.images[0])
'''
[[ 0. 0. 5. 13. 9. 1. 0. 0.]
[ 0. 0. 13. 15. 10. 15. 5. 0.]
[ 0. 3. 15. 2. 0. 11. 8. 0.]
[ 0. 4. 12. 0. 0. 8. 8. 0.]
[ 0. 5. 8. 0. 0. 9. 8. 0.]
[ 0. 4. 11. 0. 1. 12. 7. 0.]
[ 0. 2. 14. 5. 10. 12. 0. 0.]
[ 0. 0. 6. 13. 10. 0. 0. 0.]]
'''
为了对这些数据应用分类器,我们需要将图像展平,将每个图像的灰度值从8x8的二维数组转换为64x1的一维数组
然后,我们将数据划分成训练和测试子集,并在训练样本上拟合支持向量分类器。随后再使用拟合的分类器来预测测试集中样本的数字值
from sklearn.model_selection import train_test_split
n_samples = len(data.images)
X = data.images.reshape((n_samples, -1))
y = data.target
# 划分训练集(80%)和测试集(20%)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
from sklearn.svm import SVC
# SVM分类器
clf = SVC()
# 训练模型
clf.fit(X_train, y_train)
# 在测试集上预测
y_pred = clf.predict(X_test)
# 平均准确度评分
print(clf.score(X_test, y_test)) # 0.9916666666666667
由模型评分结果可知,数字图像的识别准确率在测试集中表现的很好
2.3、支持向量机分类案例
预留,未完待续…文章来源:https://www.toymoban.com/news/detail-856480.html
参考文章:
https://blog.csdn.net/qs17809259715/article/details/97761963
https://blog.csdn.net/Claire_chen_jia/article/details/110916001
https://blog.csdn.net/qq_53123067/article/details/136060974
https://zhuanlan.zhihu.com/p/77750026
https://www.zhihu.com/tardis/zm/art/31886934?source_id=1005文章来源地址https://www.toymoban.com/news/detail-856480.html
到了这里,关于Scikit-Learn支持向量机分类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!