支持向量機(jī)(SVM)什么是支持向量機(jī)呢?支持向量機(jī)是監(jiān)督機(jī)器學(xué)習(xí)模型,可對(duì)數(shù)據(jù)進(jìn)行分類分析。實(shí)際上,支持向量機(jī)算法是尋找能將實(shí)例進(jìn)行分離的最佳超平面的過(guò)程。 如果數(shù)據(jù)像上面那樣是線性可分離的,那么我們用一個(gè)線性分類器就能將兩個(gè)類分開(kāi)。如果我們的數(shù)據(jù)是非線性可分的,我們應(yīng)該怎么做呢?就像這樣: 正如我們所看到的,即使來(lái)自不同類的數(shù)據(jù)點(diǎn)是可分離的,我們也不能簡(jiǎn)單地畫(huà)一條直線來(lái)進(jìn)行分類。 那么我們?nèi)绾问褂弥С窒蛄繖C(jī)來(lái)擬合非線性機(jī)器學(xué)習(xí)數(shù)據(jù)集呢? 使用SVM進(jìn)行實(shí)驗(yàn)創(chuàng)建機(jī)器學(xué)習(xí)數(shù)據(jù)集 首先創(chuàng)建非線性機(jī)器學(xué)習(xí)數(shù)據(jù)集。Python代碼如下: # Import packages to visualize the classiferfrom matplotlib.colors import ListedColormapimport matplotlib.pyplot as pltimport warnings# Import packages to do the classifyingimport numpy as npfrom sklearn.svm import SVC# Create Datasetnp.random.seed(0)X_xor = np.random.randn(200, 2)y_xor = np.logical_xor(X_xor[:, 0] > 0, X_xor[:, 1] > 0)y_xor = np.where(y_xor, 1, -1)fig = plt.figure(figsize=(10,10))plt.scatter(X_xor[y_xor == 1, 0], X_xor[y_xor == 1, 1], c='b', marker='x', label='1')plt.scatter(X_xor[y_xor == -1, 0], X_xor[y_xor == -1, 1], c='r', marker='s', label='-1')plt.xlim([-3, 3])plt.ylim([-3, 3])plt.legend(loc='best')plt.tight_layout()plt.show() 嘗試使用線性支持向量機(jī) 我們首先嘗試使用線性支持向量機(jī),Python實(shí)現(xiàn)如下:
C是與錯(cuò)誤分類相關(guān)的成本。C值越高,算法對(duì)數(shù)據(jù)集的正確分離就越嚴(yán)格。對(duì)于線性分類器,我們使用kernel='linear'。 如我們所見(jiàn),即使我們將成本設(shè)置得很高,但這條線也無(wú)法很好地分離紅點(diǎn)和藍(lán)點(diǎn)。 徑向基函數(shù)核 到目前為止,我們使用的線性分類器為: 正如我們所看到的,g(x)是一個(gè)線性函數(shù)。當(dāng)g(x) >為0時(shí),預(yù)測(cè)值為1。當(dāng)g(x) <0時(shí),預(yù)測(cè)值為-1。但是由于我們不能使用線性函數(shù)處理像上面這樣的非線性數(shù)據(jù),我們需要將線性函數(shù)轉(zhuǎn)換成另一個(gè)函數(shù)。 這個(gè)分類器似乎是我們非線性數(shù)據(jù)的理想選擇。讓我們來(lái)看看Python的代碼: # Create a SVC classifier using an RBF kernelsvm = SVC(kernel='rbf', random_state=0, gamma=1/100, C=1)# Train the classifiersvm.fit(X_xor, y_xor)# Visualize the decision boundariesfig = plt.figure(figsize=(10,10))plot_decision_regions(X_xor, y_xor, clf=svm)plt.legend(loc='upper left')plt.tight_layout()plt.show() gamma是1 / sigma。請(qǐng)記住,sigma是調(diào)節(jié)函數(shù)。因此,gamma值越小,sigma值就越大,分類器對(duì)各個(gè)點(diǎn)之間的距離就越不敏感。 讓我們把伽瑪放大看看會(huì)發(fā)生什么
好像將伽瑪值提高100倍可以提高分類器對(duì)訓(xùn)練集的準(zhǔn)確性。把伽馬值再乘以10會(huì)怎么樣呢? # Create a SVC classifier using an RBF kernelsvm = SVC(kernel='rbf', random_state=0, gamma=10, C=1)# Train the classifiersvm.fit(X_xor, y_xor)# Visualize the decision boundariesfig = plt.figure(figsize=(10,10))plot_decision_regions(X_xor, y_xor, clf=svm)plt.legend(loc='upper left')plt.tight_layout()plt.show() 這是否意味著如果我們將伽瑪提高到10000,它將更加準(zhǔn)確呢?事實(shí)上,如果伽瑪值太大,則分類器最終會(huì)對(duì)差異不敏感。 讓我們?cè)黾覥。C是與整個(gè)機(jī)器學(xué)習(xí)數(shù)據(jù)集的錯(cuò)誤分類相關(guān)的成本。換句話說(shuō),增加C將增加對(duì)整個(gè)數(shù)據(jù)集的敏感性,而不僅僅是單個(gè)數(shù)據(jù)點(diǎn)。
我們已經(jīng)找到了參數(shù),因此我們的SVM分類器可以成功地將兩組點(diǎn)分開(kāi)。 最后我希望本文能讓您對(duì)SVM分類器是什么以及如何使用它來(lái)學(xué)習(xí)非線機(jī)器學(xué)習(xí)性數(shù)據(jù)集有一個(gè)直觀的認(rèn)識(shí)。如果數(shù)據(jù)是高維的,您則無(wú)法通過(guò)可視化來(lái)判斷分類器的性能。好的做法是根據(jù)訓(xùn)練集進(jìn)行訓(xùn)練,并在測(cè)試集上使用混淆矩陣或f1-分?jǐn)?shù)等指標(biāo)。 |
|
來(lái)自: taotao_2016 > 《AI》