摘要:什么是支持向量機支持向量機是一種有監督的機器學習算法,可用于分類任務或回歸任務。支持向量機是一個最好地隔離兩個類超平面或者說分類線的前沿算法。接下來,我們將討論支持向量機如何工作。
介紹
掌握機器學習算法并不是一個不可能完成的事情。大多數的初學者都是從學習回歸開始的。是因為回歸易于學習和使用,但這能夠解決我們全部的問題嗎?當然不行!因為,你要學習的機器學習算法不僅僅只有回歸!
把機器學習算法想象成一個裝有斧頭,劍,刀,弓箭,匕首等等武器的軍械庫。你有各種各樣的工具,但你應該學會在正確的時間和場合使用它們。作為一個類比,我們可以將“回歸”想象成一把能夠有效切割數據的劍,但它無法處理高度復雜的數據。相反,“支持向量機”就像一把鋒利的刀—它適用于較小的數據集,但它可以再這些小的數據集上面構建更加強大的模型。
現在,我希望你現在已經掌握了隨機森林,樸素貝葉斯算法和模型融合的算法基礎。如果沒有,我希望你先抽出一部分時間來了解一下他們,因為在本文中,我將指導你了解認識機器學習算法中關鍵的高級算法,也就是支持向量機的基礎知識。
如果你是初學者,并且希望開始你的數據科學之旅,那么我希望你先去了解一些基礎的機器學習算法, 支持向量機相對來說對于數據科學的初學者來講的確有一點難了。
0.什么是分類分析讓我們用一個例子來理解這個概念。假如我們的人口是按照50%-50%分布的男性和女性。那么使用這個群體的樣本,就需要創建一些規則,這些規則將指導我們將其他人的性別進行分類。如果使用這種算法,我們打算建立一個機器人,可以識別一個人是男性還是女性。這是分類分析的樣本問題。我們將嘗試使用一些規則來劃分性別之間的不同。為簡單起見,我們假設使用的兩個區別因素是:個體的身高和頭發長度。以下是樣本的散點圖。
圖中的藍色圓圈表示女性,綠色方塊表示男性。圖中的一些預期見解是:
我們人口中的男性的平均身高較高。
我們人口中的女性的頭發較長。
如果我們看到一個身高180厘米,頭發長度為4厘米的人,我們最好的分類是將這個人歸類為男性。這就是我們進行分類分析的方法。
1.什么是支持向量機“支持向量機”(SVM)是一種有監督的機器學習算法,可用于分類任務或回歸任務。但是,它主要適用于分類問題。在這個算法中,我們將每個數據項繪制為n維空間中的一個點(其中n是你擁有的是特征的數量),每個特征的值是特定坐標的值。然后,我們通過找到很好地區分這兩個類的超平面來執行分類的任務(請看下面的演示圖片)。
支持向量只是個體觀測的坐標。支持向量機是一個最好地隔離兩個類(超平面或者說分類線)的前沿算法。
在我第一次聽到“支持向量機”這個名字,我覺得這個名字聽起來好復雜,如果連名字都這么復雜的話,那么這個名字的概念將超出我的理解。幸運的是,在我看了一些大學的講座視頻,才意識到這個算法其實也沒有那么復雜。接下來,我們將討論支持向量機如何工作。我們將詳細探討該技術,并分析這些技術為什么比其他技術更強。
2.它是如何工作的?上面,我們已經習慣了用超平面來隔離兩種類別的過程,但是現在最迫切的問題是“我們如何識別正確的超平面?”。關于這個問題不用急躁,因為它并不像你想象的那么難!
讓我們一個個的來理解如何識別正確的超平面:
選擇正確的超平面(場景1):這里,我們有三個超平面(A、B、C)。現在,讓我們用正確的超平面對星形和圓形進行分類。
你需要記住一個經驗的法則來識別正確的超平面:“選擇更好的可以隔離兩個類別的超平面”。在這種情況下,超平面“B”就非常完美的完成了這項工作。
選擇正確的超平面(場景2):
在這里,我們有三個超平面(A,B,C),并且所有這些超平面都很好地隔離了類。現在,我們如何選擇正確的超平面?
在這里,在這里,將最近的數據點(任一類)和超平面之間的距離最大化將有
助于我們選擇正確的超平面。該距離稱為邊距。讓我們看一下下面的圖片:
上面,你可以看到超平面C的邊距與A和B相比都很高。因此,我們將正確的超平面選擇為C。選擇邊距較高的超平面的另一個決定性因素是穩健性。如果我們選擇一個低邊距的超平面,那么很有可能進行錯誤分類。
選擇正確的超平面(場景3):提示: 使用我們前面討論的規則來選擇正確的超平面
你們中的一些人可能選擇了超平面B,因為它與A相比具有更高的邊距。但是SVM選擇超平面是需要在最大化邊距之前準確地對類別進行分類。這里,超平面B有一個分類的錯誤,而且A進行了正確的分類。因此,正確的超平面應該是A.
我們可以對這個兩個類進行分類嗎?(場景4):下面這張圖片中,我們無法使用直線來分隔這兩個類,因為其中一個星星位于圓形類別的區域中作為一個異常值。
正如我剛剛已經提到的,另一端的那一顆星星就像是一個異常值。SVM具有忽略異常值并找到具有最大邊距的超平面的功能。因此,我們可以說,SVM對異常值有很強的穩健性
找到一個超平面用來隔離兩個類別(場景5):
在下面的場景中,我們不能在兩個類之間有線性的超平面,那么SVM如何對這兩個類進行分類?到目前為止,我們只研究過線性超平面。
SVM可以解決這個問題。并且是輕松就可以做到!它通過引入額外的特征來解決這個問題。在這里,我們將添加一個新特征
現在,讓我們繪制軸x和z上的數據點:
在上圖中,要考慮的問題是:
z的所有值都是正的,因為z是x和y的平方和
在原圖中,紅色圓圈出現在靠近x和y軸原點的位置,導致z值比較低。星形相對遠離原點,導致z值較高。
在SVM中,很容易就可以在這兩個類之間建立線性超平面。但是,另一個需要解決的問題是,我們是否需要手動添加一個特征以獲得超平面。不,并不需要這么做,SVM有一種稱為核技巧的技術。這些函數把低維度的輸入空間轉換為更高維度的空間,也就是它將不可分離的問題轉換為可分離的問題,這些函數稱為內核函數。它主要用于非線性的分離問題。簡而言之,它執行一些非常復雜的數據轉換,然后根據你定義的標簽或輸出找出分離數據的過程。
當SVM找到一條合適的超平面之后,我們在原始輸入空間中查看超平面時,它看起來像一個圓圈:
現在,讓我們看看在數據科學中應用SVM算法的方法。
3.如何在Python中實現SVM?在Python中,scikit-learn是一個廣泛使用的用于實現機器學習算法的庫,SVM也可在scikit-learn庫中使用并且遵循相同的結構(導入庫,創建對象,擬合模型和預測)。我們來看下面的代碼:
導入庫from sklearn import svm
假設您有用于訓練數據集的X(特征數據)和Y(目標),以及測試數據的x_test(特征數據) 創建SVM分類對象model = svm.svc(kernel="linear", c=1, gamma=1)?
與之相關的選項有很多,比如更改kernel值(內核)、gamma值和C值。下一節將對此進行更多討論。使用訓練集訓練模型,并檢查成績model.fit(X, y)
model.score(X, y)
predicted= model.predict(x_test)
4.如何調整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:我們之間已經簡單的討論過了。在算法參數中,我們可以為kernel值提供各種內核選項,如“linear”,“rbf”,“poly”等(默認值為“rbf”)。其中“rbf”和“poly”對于找到非線性超平面是很有用的。讓我們看一下這個例子,我們使用線性內核函數對iris數據集中的兩個特性進行分類。
示例:使用linear的內核
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets
iris = datasets.load_iris()
X = iris.data[:, :2] #我們可以只考慮前兩個特征
y = iris.target
我們創建了一個SVM實例并對數據進行擬合。不進行縮放 是因為我們想要畫出支持向量C = 1.0 #SVM正則化參數
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"和"sigmoid"的內核系數。伽馬值越高,則會根據訓練數據集進行精確擬合,也就是泛化誤差從而導致過擬合問題。
示例:如果我們使用不同的伽瑪值,如0,10或100,讓我們來查看一下不同的區別。
svc = svm.SVC(kernel ="rbf",C = 1,gamma = 0).fit(X,y)
C:誤差項的懲罰參數C. 它還控制了平滑決策邊界與正確分類訓練點之間的權衡。
我們應該始終關注交叉驗證的分數,以便更有效地組合這些參數并避免過度擬合。
5.SVM的優缺點優點:
它工作的效果很明顯,有很好的分類作用
它在高維空間中同樣是有效的。
它在尺寸數量大于樣本數量的情況下,也是有效的。
它在決策函數(稱為支持向量)中使用訓練點的子集,因此它的內存也是有效的
缺點:
當我們擁有大量的數據集時,它表現并不好,因為它所需要的訓練時間更長
當數據集具有很多噪聲,也就是目標類重疊時,它的表現性能也不是很好
SVM不直接提供概率估計,這些是使用昂貴的五重交叉驗證來計算的。它是Python scikit-learn庫的相關SVC方法。
實踐問題找到一個正確的超平面用來將下面圖片中的兩個類別進行分類
結語在本文中,我們詳細介紹了機器學習算法中的高階算法,支持向量機(SVM)。我們討論了它的工作原理,python中的實現過程,通過調整模型的參數來提高模型效率的技巧,討論了SVM的優缺點,以及最后留下的一個要你們自己解決的問題。我建議你使用SVM并通過調整參數來分析此模型的能力。
支持向量機是一種非常強大的分類算法。當與隨機森林和其他機器學習工具結合使用時,它們為集合模型提供了非常不同的維度。因此,在需要非常高的預測能力的情況下,他們就顯得非常重要。由于公式的復雜性,這些算法可能稍微有些難以可視化。
Understanding Support Vector Machine algorithm from examples (along with code)
更多精彩內容,可移步:https://www.cda.cn/?seo-segme...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/44138.html
摘要:貢獻者飛龍版本最近總是有人問我,把這些資料看完一遍要用多長時間,如果你一本書一本書看的話,的確要用很長時間。為了方便大家,我就把每本書的章節拆開,再按照知識點合并,手動整理了這個知識樹。 Special Sponsors showImg(https://segmentfault.com/img/remote/1460000018907426?w=1760&h=200); 貢獻者:飛龍版...
閱讀 1162·2021-11-24 09:38
閱讀 3610·2021-11-22 15:32
閱讀 3461·2019-08-30 15:54
閱讀 2574·2019-08-30 15:53
閱讀 1499·2019-08-30 15:52
閱讀 2539·2019-08-30 13:15
閱讀 1842·2019-08-29 12:21
閱讀 1404·2019-08-26 18:36