SVM全稱是Support Vector Machine,即支持向量機,是一種監督式學習算法。它主要應用於分類問題,通過改進代碼也可以用作回歸。所謂支持向量就是距離分隔面最近的向量。支持向量機就是要確保這些支持向量距離超平面盡可能的遠以保證模型具有相當的泛化能力。
當訓練數據線性可分時,通過硬間隔最大化,學習一個線性分類器,即線性可分支持向量機;當訓練數據近似線性可分時,通過軟間隔最大化,也學習一個線性分類器,即線性支持向量機;當訓練數據線性不可分時,通過使用核技巧,將低維度的非線性問題轉化為高維度下的線性問題,學習得到非線性支持向量機。
所謂核技巧就是將低維數據映射到高維空間的辦法。如果原始數據是有限維的,那么一定存在一個高維特征空間使樣本可分。
支持向量機的一些證明推導公式不在這里說明。我簡單說明一下支持向量機在Python中的實現。
在Python中sklearn算法包已經實現了所有基本機器學習的算法。直接from sklearn import svm就可以調用該算法。
以Iris數據集為例,從UCI數據庫(archive.ics.uci.edu)中下載的data文件比較工整,無需做進一步處理可以直接使用。
從網上其他地方下載下來的csv格式數據集可能比較混亂,如下圖:
這種有樣本序號有列名的數據集需要預處理一下才方便做實驗。處理時需要導入pandas,將csv格式轉換成便於處理的DataFrame格式。
其中names是設置列名稱。
然后是使用drop方法消除原數據集中的第一行(列名稱)以及第一列(樣本序號)。
其中('a',axis=1)代表消除的是列名稱為a的一整列。(0 ,axis=0)代表消除第0行。
最后使用to_csv方法輸出文件即可處理完畢。
其中'newiris.csv'是指生成文件名,sep指的是分割符號(空格為\t),index為行索引(即序列號),header為列名稱。
處理結果如下:
接下來開始SVM實驗。首先讀取我們剛才處理好的數據集。具體方法是使用numpy中的loadtxt方法此方法可以讀取txt、csv、data格式的數據。
第一個位置path指的文件路徑,dtype指的是讀出來的數據類型,delimiter指的是分隔符,converters指的是將數據列與轉換函數進行映射的字典。
我們數據的第五列顯然不是float類型,因此要寫一個函數進行轉換。
讀取后的結果如下:
接下來需要將讀取到的數據集特征指標與結果分開,並划分為訓練集與測試集,此處為了方便作圖只取了前兩列特征值做實驗:
其中size指的是樣本數量,若此數小於1表示樣本比例,大於1的整數表示樣本數量。random_state指的是隨機數的種子。
准備好后就可以開始訓練SVM了。
kernel指的是核函數rbf是高斯核。高斯核的gamma值越小,分類界面越連續;gamma值越大,分類界面越“散”,分類效果越好,但有可能會過擬合。linear為線性核。線性核C越大分類效果越好,但有可能會過擬合。
decision_function_shape有兩個取值,一個是ovr,即一個類別與其他類別進行划分;另一個是ovo,即將類別兩兩之間進行划分,用二分類的方法模擬多分類的結果。
最后用測試集去查看分類准確度,此處可以直接調用score方法查看准確度,也可以調用sklearn中metrics的accuracy_scor方法查看。兩者沒有區別。
結果為0.7333333。結果不盡如人意但可以慢慢改參數改進。
最后繪制圖片:
可以看到綠點幾乎可以被很好的區分,但是藍點和紅點存在不易區分的地方。這時候調整核技巧或者將更多的特征屬性加入學習可能會有更好的效果。