Scikit-learn筆記8 線性支持向量機
支持向量機(SVMSupport vector machine)起源於上世紀90年代,作為曾今風靡一時的「大殺器」在Scikit-learn中有著多種實現,如下:
SVC是對支持向量分類的實現,而SVR則是支持向量回歸。本文介紹最基本的線性支持支持向量分類器LinearSVC。線性支持向量機的模型如下圖所示。
圖中有3條相互平行的直線,兩條虛線將空心和實心兩類樣本點隔開,兩條虛線之間的區域稱為隔離地帶,支持向量機要使兩條虛線間的距離達到最大(原始問題)從而求出一個分離(超)平面(圖中實線)作為分類決策邊界。
剛好經過虛線的樣本點稱為支持向量,支持向量機就是要從樣本中找出支持向量從而確定隔離地帶。上圖中隔離地帶將兩類樣本點完全分開的情況叫線性可分,如果有些點跑到隔離地帶中去了,則為線性不可分。
進入python導入包如下:
線性支持向量機各超參數的解釋如下
C:鬆弛因子,解決線性不可分問題。C越大越容易過擬合訓練樣本。
class_weight:標籤類別的權重,如為『balanced』,則類別權重與類別出現的次數成反比。對改善類別不平衡有幫助;也可以傳入一個字典自定義類別權重。
dual:是否對偶化,默認為True。將上述原始問題調整為對偶問題,用凸優化的方法求解模型。當樣本數>特徵數,傾向於用False。
fit_intercept:是否擬合截距項,如果沒做中心化處理,一般需要擬合。
intercept_scaling:0-1的浮點數。當擬合截距項時,相當於人造了一個特徵,該特徵恆為1,權重為b。計算正則化項時,該人造特徵也被考慮了。為了降低人造特徵的影響,調整為intercept_scaling*b。
loss:默認為合頁損失的平方,還可以取合頁損失hinge。
multi_class:多分類策略,默認為One vs Rest。
penalty:正則化項,默認為L2,也可以是L1,但L1的損失函數不能是hinge。
random_state:隨機種子,和前面保持一致,取10。
tol:迭代停止條件,兩次迭代精度之差小於tol則停止。
verbose:列印輸出信息。
下面還是用泰坦尼克數據集演示線性支持向量機的效果。如下:
鬆弛因子C是線性支持向量機最重要的一個參數。如上,當C=0.5時交叉驗證的表現最好,f1=0.73。當C繼續增大時效果明顯下降。此處由於訓練集的類別是不平衡的,把class_weight設為balanced會有所改善。
上面的參數解釋提到,當樣本數大於特徵數時,建議dual=False。可以看到如下演示結果,f1=0.72,略低於默認True時的0.73,沒有什麼效果。
再來看損失函數,將默認的hinge平方改成hinge,f1下降嚴重,只有0.67。因此損失函數默認不變。
正則化項將L2調整為L1,並未改善效果。我們用最終的c=0.5的模型來擬合訓練集,得到的分數為0.81。由於Kaggle測試集沒有標籤,無法查看測試得分。
訓練好了模型,可以拿到線性SVM的分類超平面的係數和截距,如下:
最後仍然使用上節同樣的樣本作出預測,結果此人獲救。如下:
ok,下文接著介紹非線性支持向量機。
歷史文章回顧


TAG:挖挖機ML |