1、支持向量機(jī)(SVM)
1.1、SVM概述
在機(jī)器學(xué)習(xí)中,支持向量機(jī)(Support Vector Machine,SVM)算法既可以用于回歸問題(SVR),也可以用于分類問題(SVC)
支持向量機(jī)是一種經(jīng)典的監(jiān)督學(xué)習(xí)算法,通常用于分類問題。SVM在機(jī)器學(xué)習(xí)知識(shí)結(jié)構(gòu)中的位置如下:
SVM的核心思想是將分類問題轉(zhuǎn)化為尋找分類平面的問題,并通過最大化分類邊界點(diǎn)(支持向量)到分類平面的距離(間隔)來實(shí)現(xiàn)分類
如圖所示,左圖展示了三種可能的線性分類器的決策邊界,虛線所代表的模型表現(xiàn)非常糟糕,甚至都無法正確實(shí)現(xiàn)分類;其余兩個(gè)模型在訓(xùn)練集上表現(xiàn)堪稱完美,但是它們的決策邊界與實(shí)例過于接近,導(dǎo)致在面對(duì)新樣本時(shí),表現(xiàn)可能不會(huì)太好
右圖中的實(shí)線代表SVM分類器的決策邊界,兩虛線表示最大間隔超平面,虛線之間的距離(兩個(gè)異類支持向量到超平面的距離之和)稱為超平面最大間隔,簡稱間隔;SVM的決策邊界不僅分離了兩個(gè)類別,而且盡可能的遠(yuǎn)離了最近的訓(xùn)練實(shí)例,距離決策邊界最近的實(shí)例稱為支持向量
1.2、SVM原理
SVM的最優(yōu)化問題就是要找到各類樣本點(diǎn)到超平面的距離最遠(yuǎn),也就是找到最大間隔超平面。任意超平面的方程為
ω
T
x
+
b
=
0
\omega^Tx+b=0
ωTx+b=0
其中 ω \omega ω為超平面的法向量,決定了超平面的方向; b b b為位移項(xiàng),決定了超平面到原點(diǎn)間的距離
二維空間點(diǎn)
(
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∣?
擴(kuò)展到N維空間中,點(diǎ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假設(shè)樣本是線性可分的,則任意樣本點(diǎn)到超平面的距離可寫為
d
=
∣
ω
T
x
+
b
∣
∣
∣
ω
∣
∣
d=\frac{|\omega^Tx+b|}{||\omega||}
d=∣∣ω∣∣∣ωTx+b∣?
為方便描述和計(jì)算,設(shè)
y
i
∈
?
1
,
1
y_i\in{-1,1}
yi?∈?1,1,其中1表示正例,-1表示負(fù)例,則有
{
ω
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≤?1?yi?=+1yi?=?1?
此時(shí),兩個(gè)異類支持向量到超平面的距離之和為
γ
i
=
y
i
(
ω
T
∣
∣
ω
∣
∣
?
x
i
+
b
∣
∣
ω
∣
∣
)
=
2
∣
∣
ω
∣
∣
\gamma_i=y_i\left(\frac{\omega^T}{||\omega||}\cdot x_i + \frac{||\omega||} \right) = \frac{2}{||\omega||}
γi?=yi?(∣∣ω∣∣ωT??xi?+∣∣ω∣∣b?)=∣∣ω∣∣2?
其中, γ \gamma γ稱為間隔。最大間隔不僅與 ω \omega ω有關(guān),偏置 b b b也會(huì)隱性影響超平面的位置,進(jìn)而對(duì)間隔產(chǎn)生影響
現(xiàn)在,我們只需要使間隔
γ
\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ω,bmin?21?∣∣ω∣∣2
這里的平方和之前一樣,一是為了方便計(jì)算,二是可以將目標(biāo)函數(shù)轉(zhuǎn)化為凸函數(shù)的凸優(yōu)化問題。稱該式為SVM的基本型
1.3、SVM的損失函數(shù)
1.3.1、軟間隔與硬間隔
如果我們嚴(yán)格讓所有實(shí)例都不在最大間隔之間,并且位于正確的一邊,這就是硬間隔分類。但是硬間隔分類有兩個(gè)問題:首先,它只在數(shù)據(jù)是線性可分時(shí)才有效;其次,它對(duì)異常值較敏感
要避免這些問題,可以使用更靈活的模型。目標(biāo)是盡可能在保持最大間隔的同時(shí)允許間隔違例(在最大間隔之間,甚至位于錯(cuò)誤的一邊),在最大間隔與違例之間找到良好的平衡,這就是軟間隔分類
軟間隔的目標(biāo)函數(shù)為
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?
其中,超參數(shù)
C
C
C為懲罰系數(shù),
ε
\varepsilon
ε為松弛因子。
C
C
C越小,懲罰越?。ㄩg隔越寬,違例越多)
1.3.2、核函數(shù)
對(duì)于非線性數(shù)據(jù)集,線性支持向量機(jī)無法處理。我們希望將非線性問題轉(zhuǎn)化為線性可分問題來求解。這時(shí),需要引入一個(gè)新的概念:核函數(shù)
核函數(shù)可以將樣本從原始空間映射到一個(gè)高維空間,使得樣本在新的空間中線性可分
更多關(guān)于核函數(shù)的介紹可參考這篇文章:https://blog.csdn.net/mengjizhiyou/article/details/103437423
核函數(shù)將原始空間中的向量作為輸入向量,并返回轉(zhuǎn)換后的特征空間中向量的內(nèi)積。通過核方法可以學(xué)習(xí)非線性支持向量機(jī),等價(jià)于在高維特征空間中學(xué)習(xí)線性支持向量機(jī)
所以在非線性SVM中,核函數(shù)的選擇就是影響SVM最大的變量。常用核函數(shù)有:線性核、多項(xiàng)式核、高斯核、拉普拉斯核和Sigmoid核等
1.4、支持向量機(jī)分類的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
- 可適用于處理高維空間數(shù)據(jù),對(duì)于數(shù)據(jù)維度遠(yuǎn)高于樣本數(shù)據(jù)量的情況也有效
- 在決策函數(shù)中使用少部分訓(xùn)練數(shù)據(jù)(支持向量)進(jìn)行決策,內(nèi)存占用小,效率高
- 通過支持向量選取最優(yōu)決策邊界,對(duì)噪聲和異常值的敏感度較低,穩(wěn)定性較好
- 更加通用,可處理非線性分類任務(wù),提供了多種通用核函數(shù),也支持自定義核函數(shù)
缺點(diǎn):
- 解釋性差:不像K-Means、決策樹那樣直觀,不易于理解,可解釋性差
- 對(duì)參數(shù)和核函數(shù)敏感:性能高度依賴于懲罰參數(shù)C和核函數(shù)的選擇。如果參數(shù)選擇不當(dāng),容易導(dǎo)致過擬合或欠擬合
- 非線性分類訓(xùn)練時(shí)間長:核函數(shù)涉及到二次規(guī)劃問題,需要使用復(fù)雜的優(yōu)化算法,當(dāng)支持向量的數(shù)量較大時(shí),計(jì)算復(fù)雜度較高
2、Scikit-Learn支持向量機(jī)分類
2.1、Scikit-Learn支持向量機(jī)分類API
Scikit-Learn支持向量機(jī)分類的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)
官方對(duì)該API的描述為:
SVC的實(shí)現(xiàn)基于libsvm
。SVC的擬合時(shí)間與樣本數(shù)量成二次方關(guān)系,適用于樣本數(shù)量較小的情況。如果樣本數(shù)量過大(超過1W),建議使用其他模型,例如LinearSVC
或SGDClassifier
。多類支持是根據(jù)One Vs One方案處理的
官方文檔:https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html
中文官方文檔:https://scikit-learn.org.cn/view/781.html
API參數(shù)及說明如下:
參數(shù) | 說明 |
---|---|
C |
正則化系數(shù),默認(rèn)為1.0。正則化的強(qiáng)度與C 成反比。C 越小,懲罰越大,泛化能力越弱(過擬合);反之,泛化能力越強(qiáng)(欠擬合) |
kernel |
算法中使用的核函數(shù),默認(rèn)為rbf (徑向基核函數(shù)/高斯核:樣本到數(shù)據(jù)中心之間徑向距離的單調(diào)函數(shù))。其他參數(shù)有:linear :線性核函數(shù)(不適應(yīng)線性不可分?jǐn)?shù)據(jù));ploy :多項(xiàng)式核函數(shù),可以擬合復(fù)雜的超平面,但調(diào)參困難;sigmoid :Logistic函數(shù)(S型生長曲線);precomputed :Gram矩陣,表示已經(jīng)提前計(jì)算好核矩陣,算法內(nèi)部不再應(yīng)用核函數(shù) |
degree |
多項(xiàng)式核函數(shù)的次數(shù),默認(rèn)為3 |
gamma |
rbf 、poly 和sigmoid 的核系數(shù), 默認(rèn)為scale ,取值為1/(n_features*X.var()) ;其他參數(shù)還有auto ,取值為1/n_features
|
coef0 |
核函數(shù)中的常數(shù)項(xiàng),僅在poly 和sigmoid 中有用,相當(dāng)于對(duì)核函數(shù)映射的結(jié)果進(jìn)行一個(gè)位移操作 |
shrinking |
是否使用收縮啟發(fā)式,默認(rèn)為True。當(dāng)?shù)螖?shù)過大時(shí),啟用可以縮短訓(xùn)練時(shí)間,但如果我們對(duì)停止迭代容忍度tol 較高時(shí),不啟用可能會(huì)更快一些 |
probability |
是否啟用概率估計(jì),默認(rèn)為False。必須在調(diào)用fit 之前啟用此參數(shù),因?yàn)樵摲椒▋?nèi)部使用5折交叉驗(yàn)證,因此會(huì)減慢該方法的速度 |
tol |
殘差收斂條件,停止迭代容忍度,默認(rèn)為1e-3
|
cache_size |
核緩存大?。▎挝唬篗B),默認(rèn)為200。指模型在訓(xùn)練時(shí),能占用的最大RAM空間 |
class_weight |
分類權(quán)重,為每個(gè)類別設(shè)置不同的懲罰參數(shù)C ,默認(rèn)為None,不使用。balance 表示自動(dòng)調(diào)整權(quán)重C 為n_samples/(n_classes*np.bincount(y)) ,y 為每個(gè)訓(xùn)練數(shù)據(jù)的標(biāo)簽值 |
verbose |
是否啟用詳細(xì)輸出,默認(rèn)為False |
max_iter |
求解器的最大迭代次數(shù),默認(rèn)為-1,不限制 |
decision_function_shape |
多分類策略,默認(rèn)為ovr 。對(duì)于二分類,該參數(shù)將被忽略 |
break_ties |
是否打破平局(具有相同的分類概率),默認(rèn)為False。如果為True,decision_function_shape 為ovr ,且分類數(shù)>2,則預(yù)測(cè)將根據(jù)decision_function 的置信度值打破平局,當(dāng)兩個(gè)類別具有相同的分類概率時(shí),則根據(jù)類名排序,返回第一個(gè)類 |
random_state |
控制偽隨機(jī)數(shù)的生成,保證多次訓(xùn)練時(shí),數(shù)據(jù)洗牌是一致的,以便進(jìn)行概率估計(jì)。當(dāng)probability 為False時(shí),該參數(shù)將被忽略 |
常用屬性及說明如下:
屬性 | 說明 |
---|---|
class_weight_ |
各類別的權(quán)重,一維數(shù)組類型 |
classes_ |
各類別的標(biāo)簽,一維數(shù)組類型 |
fit_status_ |
擬合狀態(tài),0擬合成功;1擬合失敗,進(jìn)行告警 |
intercept_ |
決策函數(shù)中的常量 |
n_features_in_ |
擬合過程中使用到的特征數(shù)量 |
feature_names_in_ |
擬合過程中使用到的特征的名稱 |
n_iter_ |
迭代次數(shù) |
support_ |
支持向量的索引 |
support_vectors_ |
所有支持向量,二維數(shù)組類型 |
shape_fit_ |
訓(xùn)練向量X的數(shù)組維度 |
常用方法及說明如下:
方法 | 說明 |
---|---|
decision_function(X) |
計(jì)算樣本X的決策函數(shù),X為二維數(shù)組類型,返回模型中每個(gè)類樣本的決策函數(shù) |
fit(X, y) |
訓(xùn)練數(shù)據(jù),擬合模型 |
predict(X) |
對(duì)樣本X進(jìn)行分類(預(yù)測(cè)) |
predict_log_proba(X) |
計(jì)算樣本X在每個(gè)類別上的對(duì)數(shù)概率,返回模型中每個(gè)類樣本的對(duì)數(shù)概率 |
predict_proba(X) |
計(jì)算樣本X在每個(gè)類別上的概率,返回模型中每個(gè)類樣本的可能概率 |
score(X, y) |
返回給定測(cè)試數(shù)據(jù)和標(biāo)簽的平均準(zhǔn)確度 |
2.2、支持向量機(jī)分類初體驗(yàn)(手寫數(shù)字識(shí)別)
下面使用Scikit-Learn內(nèi)置的手寫數(shù)字?jǐn)?shù)據(jù)集演示了支持向量機(jī)分類算法在圖像識(shí)別上的應(yīng)用
手寫數(shù)字?jǐn)?shù)據(jù)集由1797個(gè)8x8像素的數(shù)字圖像組成。數(shù)據(jù)集的每個(gè)圖像存儲(chǔ)為8x8灰度值的二維數(shù)組;數(shù)據(jù)集的屬性存儲(chǔ)每個(gè)圖像代表的數(shù)字,這包含在圖像的標(biāo)題中
數(shù)據(jù)集的前4張圖像可視化如下:
import matplotlib.pyplot as plt
from sklearn import datasets
# 加載手寫數(shù)字?jǐn)?shù)據(jù)集
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()
# 手寫數(shù)字圖像存儲(chǔ)為一個(gè)8x8的二維數(shù)組
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.]]
'''
為了對(duì)這些數(shù)據(jù)應(yīng)用分類器,我們需要將圖像展平,將每個(gè)圖像的灰度值從8x8的二維數(shù)組轉(zhuǎn)換為64x1的一維數(shù)組
然后,我們將數(shù)據(jù)劃分成訓(xùn)練和測(cè)試子集,并在訓(xùn)練樣本上擬合支持向量分類器。隨后再使用擬合的分類器來預(yù)測(cè)測(cè)試集中樣本的數(shù)字值
from sklearn.model_selection import train_test_split
n_samples = len(data.images)
X = data.images.reshape((n_samples, -1))
y = data.target
# 劃分訓(xùn)練集(80%)和測(cè)試集(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()
# 訓(xùn)練模型
clf.fit(X_train, y_train)
# 在測(cè)試集上預(yù)測(cè)
y_pred = clf.predict(X_test)
# 平均準(zhǔn)確度評(píng)分
print(clf.score(X_test, y_test)) # 0.9916666666666667
由模型評(píng)分結(jié)果可知,數(shù)字圖像的識(shí)別準(zhǔn)確率在測(cè)試集中表現(xiàn)的很好
2.3、支持向量機(jī)分類案例
預(yù)留,未完待續(xù)…文章來源:http://www.zghlxwxcb.cn/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文章來源地址http://www.zghlxwxcb.cn/news/detail-856480.html
到了這里,關(guān)于Scikit-Learn支持向量機(jī)分類的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!