機器學習新手必看:一文搞定SVM算法

掌握機器學習算法根本不難。大多數初學者從迴歸開始學習,雖然學習和使用它很簡單,可是這能解決咱們的目的嗎?固然不能!由於你能夠作的不只僅是迴歸問題!算法

咱們能夠將機器學習算法看做是裝滿斧頭、劍、刀片、弓、匕首等的軍械庫。你有各類工具,但你應該學會在正確的時間綜合使用它們。bash

做爲一個類比,咱們將「迴歸」看做一把可以有效切割數據的劍,但它沒法處理高度複雜的數據。相反,支持向量機(SVM)算法就像一把鋒利的刀 ——它能夠在較小的數據集上工做,而在這些小數據集上面,在搭建模型時,它的性能卻強大的多。dom

本文咱們一塊兒學習 SVM 機器學習算法從初級到高級的相關知識。示例+代碼,一文搞定支持向量機算法。機器學習

目錄

  • 什麼是 SVM 算法?函數

  • SVM 算法是如何工做的 ?工具

  • 如何在 Python 和 R 語言中實現 SVM?post

  • 如何調整 SVM 的參數?性能

  • SVM 的優勢和缺點學習

什麼是 SVM 算法?

支持向量機(SVM) 是一個監督學習算法,既能夠用於分類問題也能夠用於迴歸問題。可是,SVM算法仍是主要用在分類問題中。在 SVM 算法中,咱們將數據繪製在 n 維空間中(n 表明數據的特徵數),每一個特徵數的值是特定座標的值。而後咱們經過查找能夠將數據分紅兩類的超平面(請參照下圖)。優化

支持向量指的是觀察的樣本在 n 維空間中的座標,SVM 是將樣本分紅兩類的最佳超平面。

SVM 是如何工做的?

上面的簡介告訴咱們 SVM 是經過超平面將兩類樣本分開。如今咱們的主要問題是:「如何將兩類樣本分開」。別擔憂,這個問題並不像你想象的那麼難!

首先咱們來看:

找出正確的超平面(場景-1):在這裏,咱們有三個超平面(A,B 和 C)。 如今,找出正確的超平面並用星和圓區分。

對於識別正確的超平面,你須要記住一條經驗法則:「選擇更好地隔離兩個類的超平面」。在咱們這裏的例子中,超平面「B」很是出色地完成了這項工做。

找出正確的超平面(場景-2):在這裏,咱們有三個超平面(A,B 和 C),而且全部的類都被進行了很好的隔離。如今,咱們如何肯定正確的超平面?

在這裏,最大化最近數據點(任一類)和超平面之間的距離將有助於咱們決定正確的超平面。這個距離被稱爲邊距。請看下圖:

在上面,你能夠看到,與 A 和 B 相比,超平面 C 的邊距很大。所以,咱們將這個正確的超平面命名爲 C.另外一個選擇邊距更大超平面的緣由是魯棒性更強。若是咱們選擇一個具備較低邊距的超平面,那麼頗有可能會錯誤分類。

找出正確的超平面(場景-3):提示:使用上一節討論的規則來找出正確的超平面。

可能有些朋友會選擇超平面 B,由於它比 A 具備更高的邊距。可是,這裏有一個問題,SVM 算法在選擇超平面方面,會優先考慮正確分類而非更大的邊距。這裏,超平面 B 有分類錯誤,而 A 已經正確分類。所以,A 纔是正確的超平面。

咱們能區分兩個類別嗎?(情景-4):下圖中,我沒法用一條直線將這兩個類別分開,由於其中一個星星位於圈圈的領域以內,也就是離散值。

我以前提過,若是一個星跑到了另外一邊,那麼它就是星類別的離散值。SVM 的一個特徵就是會忽略離散值並找到具備最大邊距的超平面。所以,咱們能夠說,SVM 對於離散值具備魯棒性。

找到超平面以分離不一樣類(場景-5):在下面的場景中,咱們無法讓線性超平面區分這兩個類,那麼 SVM 如何對這兩個類進行分類?到如今爲止,咱們只看到了線性超平面。

SVM 能夠很方便的解決這個問題!它能夠經過引入附加特徵解決。在這裏,咱們增長一個新的 z=x^2+y^2 特徵。如今,咱們繪製軸 x 和 z 上的數據點:

在上面的情節中,要考慮的要點是:

  • z 的全部值老是正值,由於它是是 x 和 y 的平方和。

  • 在原始圖中,紅色點離 x 和 y 軸更近,z 值相對較小,星相對較遠會有較大的 z 值。

在 SVM 中,這兩個類之間很容易有一個線性超平面。可是,另外一個亟待解決的問題是,咱們是否須要手動添加此功能才能擁有超平面?不須要,SVM 有一個叫核函數的功能。核函數具備將低維數據轉化成高維數據的做用。它將不可分離的問題轉換成可分離的問題,這些函數被稱爲內核。它主要用於非線性分離問題。簡而言之,它執行一些很是複雜的數據轉換,而後根據您定義的標籤或輸出找出分離數據的過程。

當咱們在原始輸入空間中查看超平面時,它看起來像一個圓圈:

如今,咱們來看看在數據科學挑戰中應用 SVM 算法的方法。

如何在 Python 和 R 語言中實現 SVM?

在 Python 中,scikit-learn 是一個在機器學習算法中被普遍使用的庫,SVM 也能夠在 scikit-learn 庫中使用,並遵循相同的結構(導入庫,對象建立,擬合模型和預測)。讓咱們來看下面的代碼:

#Import Library
from sklearn import svm
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
# Create SVM classification object 
model = svm.svc(kernel='linear', c=1, gamma=1) 
# there is various option associated with it, like changing kernel, gamma and C value. Will discuss more # about it in next section.Train the model using the training sets and check score
model.fit(X, y)
model.score(X, y)
#Predict Output
predicted= model.predict(x_test)
複製代碼

使用 R 語言中的 e1071 軟件包能夠輕鬆建立 SVM。它具備輔助函數以及 Naive Bayes 分類器的代碼。在 R 和 Python 中建立 SVM 遵循相似的方法,如今讓咱們來看看下面的代碼

#Import Library
require(e1071) #Contains the SVM 
Train <- read.csv(file.choose())
Test <- read.csv(file.choose())
# there are various options associated with SVM training; like changing kernel, gamma and C value.

# create model
model <- svm(Target~Predictor1+Predictor2+Predictor3,data=Train,kernel='linear',gamma=0.2,cost=100)

#Predict Output
preds <- predict(model,Test)
table(preds)
複製代碼

如何調整 SVM 的參數?

爲機器學習算法調整參數值有效地提升了模型性能。咱們來看看 SVM 可用的參數列表。

sklearn.svm.SVC(C=1.0, kernel='rbf', degree=3, gamma=0.0, coef0=0.0, shrinking=True, probability=False,tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=-1, random_state=None)
複製代碼

咱們來討論其中最重要的三個參數爲: 「kernel」, 「gamma」 和「C」。

Kernel(核函數):咱們已經在上面介紹過了。這裏,咱們有很多適用的選擇,如「linear」,「rbf」,「poly」等等(默認值是「rbf」)。這裏「rbf」和「poly」對於非線性超平面頗有用。咱們來看看這個例子,咱們已經使用線性核函數對雙特徵鳶尾花數據集的兩個特徵進行了分類。

示例:使用線性核函數

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets
複製代碼
# import some data to play with
iris = datasets.load_iris()
X = iris.data[:, :2] # we only take the first two features. We could
 # avoid this ugly slicing by using a two-dim dataset
y = iris.target
複製代碼
# we create an instance of SVM and fit out data. We do not scale our
# data since we want to plot the support vectors
C = 1.0 # SVM regularization parameter
svc = svm.SVC(kernel='linear', C=1,gamma=0).fit(X, y)
複製代碼
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
h = (x_max / x_min)/100
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
 np.arange(y_min, y_max, h))

複製代碼
plt.subplot(1, 1, 1)
Z = svc.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, cmap=plt.cm.Paired, alpha=0.8)
複製代碼
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.xlim(xx.min(), xx.max())
plt.title('SVC with linear kernel')
plt.show()
複製代碼

示例:使用rbf核函數

將核函數類型更改成 rbf,並查看影響。

svc = svm.SVC(kernel='rbf', C=1,gamma=0).fit(X, y)
複製代碼

若是你有大量特徵(> 1000),我建議選擇線性核函數,由於它更有可能在高維空間中線性分離。此外,也可使用 rbf,但不要忘記交叉驗證其參數以免過分擬合。

gamma:rbf 函數、Poly 函數和 S 型函數的係數。gamma 值越大,SVM 就會傾向於越準確的劃分每個訓練集裏的數據,這會致使泛化偏差較大和過擬合問題。

例如:讓咱們區分一下,若是咱們有不一樣的 gamma 值,如 0,10 或 100:

svc = svm.SVC(kernel='rbf', C=1,gamma=0).fit(X, y)
複製代碼

C: 錯誤項的懲罰參數 C。它還控制平滑決策邊界和正確分類訓練點之間的權衡。

咱們應該始終考慮交叉驗證分數,以有效組合這些參數並避免過分擬合。

在 R 語言中,SVM 的參數能夠像在 Python 中同樣進行調整。下面提到的是 e1071 軟件包中的相應參數:

  • 內核參數能夠調整爲「線性」,「聚合」,「rbf」等。

  • Gamma 值能夠經過設置「Gamma」參數進行調整。

  • Python 中的 C 值由 R 中的「Cost」參數進行調整。

SVM 的優勢和缺點

優勢:

  • 對於邊界清晰的分類問題效果好;

  • 對高維分類問題效果好;

  • 當維度高於樣本數的時候,SVM 較爲有效;

  • 由於最終只使用訓練集中的支持向量,因此節約內存

缺點:

  • 當數據量較大時,訓練時間會較長;

  • 當數據集的噪音過多時,表現很差;

  • SVM 不直接提供結果的機率估計,它在計算時直接使用 5 倍交叉驗證。

實踐練習

找到有效的附加特徵,以便獲得用於分離類的超平面,以下圖所示:

在下面的註釋部分回答變量名稱。

結尾筆記

在本文中,咱們詳細介紹了機器學習算法 SVM,包括了它的工做概念,Python 中的實現過程,經過調整參數來優化模型的技巧,優勢和缺點,以及最後的練習題。建議你親自使用 SVM 並經過調整參數來分析該模型的功能。

集智主站出品的 Scikit-learn 教程也曾講過如何用 SVM 算法解決問題:點擊查看


新手福利

假如你是機器學習小白,但又但願能以最高效的方式學習人工智能知識,咱們這裏正好有個免費學習AI的機會,讓你從零到精通變身AI工程師,不瞭解一下?

機會傳送門:戳這裏!!

這多是正點遇上AI這班車的最好機會,不要錯過哦。

相關文章
相關標籤/搜索