豬八戒網(wǎng)站 怎么做兼職/品牌策劃公司介紹
文章目錄
機(jī)器學(xué)習(xí)專欄
介紹
特征縮放
示例代碼
硬間隔與軟間隔分類
主要代碼
代碼解釋
非線性SVM分類
結(jié)語
機(jī)器學(xué)習(xí)專欄
機(jī)器學(xué)習(xí)_Nowl的博客-CSDN博客
介紹
作用:判別種類
原理:找出一個(gè)決策邊界,判斷數(shù)據(jù)所處區(qū)域來識(shí)別種類
簡(jiǎn)單介紹一下SVM分類的思想,我們看下面這張圖,兩種分類都很不錯(cuò),但是我們可以注意到第二種的決策邊界與實(shí)例更遠(yuǎn)(它們之間的距離比較寬),而SVM分類就是一種尋找距每種實(shí)例最遠(yuǎn)的決策邊界的算法
特征縮放
SVM算法對(duì)特征縮放很敏感(不處理算法效果會(huì)受很大影響)
特征縮放是什么意思呢,例如有身高數(shù)據(jù)和體重?cái)?shù)據(jù),若身高是m為單位,體重是g為單位,那么體重就比身高的數(shù)值大很多,有些機(jī)器學(xué)習(xí)算法就可能更關(guān)注某一個(gè)值,這時(shí)我們用特征縮放就可以把數(shù)據(jù)統(tǒng)一到相同的尺度上
示例代碼
from sklearn.preprocessing import StandardScaler
import numpy as np# 創(chuàng)建一個(gè)示例數(shù)據(jù)集
data = np.array([[1.0, 2.0, 3.0],[4.0, 5.0, 6.0],[7.0, 8.0, 9.0]])# 創(chuàng)建StandardScaler對(duì)象
scaler = StandardScaler()# 對(duì)數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化
scaled_data = scaler.fit_transform(data)print("原始數(shù)據(jù):\n", data)
print("\n標(biāo)準(zhǔn)化后的數(shù)據(jù):\n", scaled_data)# 結(jié)果是
# [[-1.22474487 -1.22474487 -1.22474487]
# [ 0. 0. 0. ]
# [ 1.22474487 1.22474487 1.22474487]]
?StandardScaler是一種數(shù)據(jù)標(biāo)準(zhǔn)化的方法,它對(duì)數(shù)據(jù)進(jìn)行線性變換,使得數(shù)據(jù)的均值變?yōu)?,標(biāo)準(zhǔn)差變?yōu)?。?
解釋上面的數(shù)據(jù)
在每列上進(jìn)行標(biāo)準(zhǔn)化,即對(duì)每個(gè)特征進(jìn)行獨(dú)立的標(biāo)準(zhǔn)化。每個(gè)數(shù)值是通過減去該列的均值,然后除以該列的標(biāo)準(zhǔn)差得到的。
- 第一列:(1?4)/9=?1.22474487(1?4)/9?=?1.22474487,(4?4)/9=0(4?4)/9?=0,(7?4)/9=1.22474487(7?4)/9?=1.22474487。
- 第二列:(2?5)/9=?1.22474487(2?5)/9?=?1.22474487,(5?5)/9=0(5?5)/9?=0,(8?5)/9=1.22474487(8?5)/9?=1.22474487。
- 第三列:(3?6)/9=?1.22474487(3?6)/9?=?1.22474487,(6?6)/9=0(6?6)/9?=0,(9?6)/9=1.22474487(9?6)/9?=1.22474487。
這樣,標(biāo)準(zhǔn)化后的數(shù)據(jù)集就符合標(biāo)準(zhǔn)正態(tài)分布,每個(gè)特征的均值為0,標(biāo)準(zhǔn)差為1。
硬間隔與軟間隔分類
硬間隔分類就是完全將不同的個(gè)體區(qū)分在不同的區(qū)域(不能有一點(diǎn)誤差)
軟間隔分類就是允許一些偏差(圖中綠和紅色的點(diǎn)都有一些出現(xiàn)在了對(duì)方的分區(qū)里)
硬間隔分類往往會(huì)出現(xiàn)一些問題,例如有時(shí)候模型不可能完全分成兩類,同時(shí),硬間隔分類往往可能導(dǎo)致過擬合,而軟間隔分類的泛化能力就比硬間隔分類好很多
主要代碼
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVCmodel = Pipeline([("scaler", StandardScaler()),("linear_svc", LinearSVC(C=1, loss="hinge"))
])model.fit(x, y)
代碼解釋
在這里,Pipeline的構(gòu)造函數(shù)接受一個(gè)由元組組成的列表。每個(gè)元組的第一個(gè)元素是該步驟的名稱(字符串),第二個(gè)元素是該步驟的實(shí)例。在這個(gè)例子中,第一個(gè)步驟是數(shù)據(jù)標(biāo)準(zhǔn)化,使用StandardScaler,命名為"scaler";第二個(gè)步驟是線性支持向量機(jī),使用LinearSVC,命名為"linear_svc"。這兩個(gè)步驟會(huì)按照列表中的順序依次執(zhí)行。
參數(shù)C是正則程度,hinge是SVM分類算法的損失函數(shù),用來訓(xùn)練模型
非線性SVM分類
上述方法都是在數(shù)據(jù)集可線性分離時(shí)用到的,當(dāng)數(shù)據(jù)集呈非線性怎么辦,我們?cè)诨貧w任務(wù)中講過一個(gè)思想,用PolynomialFeatures來產(chǎn)生多項(xiàng)式,再對(duì)每個(gè)項(xiàng)進(jìn)行線性擬合,最后結(jié)合在一起得出決策邊界
具體代碼
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.preprocessing import PolynomialFeatures
from sklearn.svm import SVC
from sklearn.pipeline import make_pipeline
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score# 生成非線性數(shù)據(jù)集
X, y = datasets.make_circles(n_samples=100, factor=0.5, noise=0.1, random_state=42)# 劃分訓(xùn)練集和測(cè)試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 使用多項(xiàng)式特征和線性SVM
degree = 3 # 多項(xiàng)式的次數(shù)
svm_classifier = make_pipeline(StandardScaler(), PolynomialFeatures(degree), SVC(kernel='linear', C=1))
svm_classifier.fit(X_train, y_train)# 預(yù)測(cè)并計(jì)算準(zhǔn)確率
y_pred = svm_classifier.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)# 繪制決策邊界
def plot_decision_boundary(X, y, model, ax):h = .02x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))Z = model.predict(np.c_[xx.ravel(), yy.ravel()])Z = Z.reshape(xx.shape)ax.contourf(xx, yy, Z, alpha=0.8)ax.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', marker='o', s=80, linewidth=0.5)ax.set_xlim(xx.min(), xx.max())ax.set_ylim(yy.min(), yy.max())# 繪制結(jié)果
fig, ax = plt.subplots(figsize=(8, 6))
plot_decision_boundary(X_train, y_train, svm_classifier, ax)
ax.set_title('Polynomial SVM Decision Boundary')
plt.show()
運(yùn)行結(jié)果
結(jié)語
SVM分類是一種經(jīng)典的分類算法,也叫大間隔分類算法。它可以用來線性分類,也可以非線性分類(可以與PolynomialFeatures結(jié)合,當(dāng)然還有其他方法,我們之后再說)