支援向量機(Support Vector Machine,縮寫為SVM)屬於監督式學習,應用於分類問題,使用高維度空間預測資料所在類別。原本訓練資料(已知分成兩個類別)為非線性可分割,將訓練資料的低維度空間映射到高維度空間,在此空間找到一個決策邊界(Decision Boundary)分割訓練資料,讓兩個類別資料距離決策邊界的距離(Margin)越大越好。支援向量機原先應用於二分類問題,在二分類的運算基礎上,可以將支援向量機擴充到多分類問題。
7-1 支援向量機演算法的運作過程
支援向量機演算法的運作過程
Step1)將所有訓練資料(已知分類)映射到高維度空間。
Step2)找出能區分訓練資料類別的決策邊界。
Step3)測試資料(未知分類)映射到此高維度空間,根據決策邊界獲得測試資料所屬類別。
假設有四個訓練資料(已知分類)分別為點(-2,2),(2,-2)是同一組(代號為○),點(2,2),(-2,-2)為同一組(代號為X),如下圖,在二維空間是不可分割,但想辦法把這四個點映射到三維空間。
假設點(-2,2)映射到點(-2,2,3),點(2,-2)映射到點(2,-2,3),點(-2,-2)映射到點(-2,-2,-6)到,點(2,2)映射到點(2,2,-6),就可以找到一個平面X+Y-Z=0,讓點(-2,2)、點(2,-2)是同一組,點(2,2)、點(-2,-2)為同一組,變成可分割問題,如下圖。
7-2 使用sklearn實作支援向量機
使用sklearn實作支援向量機,將每筆已知類別的訓練資料輸入支援向量機模型,就可以映射到高維度空間,找出決策邊界(Decision Boundary)依照類別分割訓練資料,接著使用測試資料評估此模型。使用sklearn實作支援向量機的步驟如下。
(1)輸入資料
train_X , test_X , train_y , test_y = train_test_split(X, y,test_size=0.2,random_state=42)
(2)建立與訓練模型
model= svm.SVC(kernel='rbf')
model.fit(train_X, train_y)
(3)使用模型進行預測
pred_y = model.predict(test_X)
(4)使用正確率與混淆矩陣比較目標值與預測值的差異
print(model.score(test_X, test_y))
print(confusion_matrix(test_y, pred_y, labels=[2,4]))
7-3 支援向量機模型實作範例
7-3-1 使用支援向量機判斷心臟病
使用經由支援向量機模型判斷是否容易有心臟病,本範例測資來自於Kaggle網站,可以從以下網址下載heart.csv。
https://www.kaggle.com/rashikrahmanpritom/heart-attack-analysis-prediction-dataset
Step1)匯入資料
下載heart.csv到本機資料夾,再匯入到DataFrame。
程式說明
第1到6行:匯入函式庫。
第7行:請從Kaggle網站下載heart.csv,讀取heart.csv轉換成DataFrame儲存到變數df。
第8行:函式head顯示變數df的前五筆資料。
Step2)檢查資料
檢查資料是否有空值、資料維度大小、欄位名稱、第一筆資料內容與目標值。
程式說明
第1行:使用函式isnull檢查資料是否有空值,如果欄位有空值就會回傳True,轉換成數值1,加總結果就會是空值個數。
第2到3行:使用shape顯示資料的筆數,函式keys顯示欄位名稱。
第4到5行:iloc顯示指定範圍的資料內容,使用[]顯示指定欄位的資料內容。
Step3)分析與整理資料
取容易得心臟病與不容易得心臟病各50個案例進行比較。
程式說明
第1到2行:取出前50個容易得心臟病案例 (欄位output為1)到資料集unsafe,與不容易得心臟病案例 (欄位output為0)到資料集safe。
第3行:串接資料集unsafe與資料集safe到資料集all。
第4行:資料集all中找出欄位age與sex的各種組合個數。
Step4)建立訓練資料與測試資料
準備機器學習模型的訓練資料與測試資料。
程式說明
第1行:顯示資料集df的所有欄位。
第2行:設定X為資料集df欄位「'age', 'sex', 'cp', 'trtbps', 'chol', 'fbs', 'restecg', 'thalachh', 'exng', 'oldpeak', 'slp', 'caa', 'thall'」。
第3行:設定y為資料集df欄位「output」。
第4行:使用函式train_test_split,以X為獨立變數,y為相依變數,隨機挑選出訓練集與測試集,原始資料的百分之80為訓練集,剩餘百分之20為測試集。
第5到6行:使用shape顯示訓練資料與測試資料的筆數。
Step5)建立與訓練模型
使用SVC建立模型與訓練模型。
程式說明
第1行:建立支援向量機模型,設定kernel為linear,支援向量機的預設kernel為rbf。
第2行:輸入訓練資料到模型進行訓練。
Step6)模型預測
輸入測試資料到模型進行預測。
程式說明
第1行:以test_X為輸入,使用函式predict進行預測,變數pred_y參考到此結果。
第2行:使用函式score計算模型正確率。
第3行:使用混淆矩陣進行分析,發現8個測試資料辨別錯誤。
Step7)更換支援向量機的kernel
更換支援向量機的kernel為rbf與poly
程式說明
第1到2行:建立支援向量機模型,設定kernel為rbf,輸入訓練資料到模型進行訓練。
第3到5行:使用函式predict進行預測,以test_X為輸入,變數pred_y參考到此結果,計算模組的正確率,使用混淆矩陣進行分析,發現18個測試資料辨別錯誤。
第6到7行:建立支援向量機模型,設定kernel為poly,輸入訓練資料到模型進行訓練。
第8到10行:使用函式predict進行預測,以test_X為輸入,變數pred_y參考到此結果,計算模組的正確率,使用混淆矩陣進行分析,發現14個測試資料辨別錯誤。
7-3-2使用支援向量機判斷人的活動狀態
使用經由支援向量機模型判斷腫瘤類別,本範例測資來自於Kaggle網站,可以從以下網址下載pulsar_data_train.csv。
https://www.kaggle.com/uciml/human-activity-recognition-with-smartphones
Step1)匯入資料
匯入cell_samples.csv到DataFrame。
程式說明
第1到7行:匯入函式庫。
第8行:請從Kaggle網站下載test.csv,讀取test.csv轉換成DataFrame儲存到變數df。
第9行:函式head顯示變數df的前五列資料。
Step2)檢查資料
檢查資料是否有空值、資料維度大小、欄位名稱、第一筆資料內容與目標值。
程式說明
第1行:使用函式isnull檢查資料是否有空值,如果欄位有空值就會回傳True,轉換成數值1,加總結果就會是空值個數。
第2到3行:使用shape顯示資料的筆數,函式keys顯示欄位名稱。
第4到5行:iloc顯示指定範圍的資料內容,使用[]顯示指定欄位的資料內容。
Step3)分析與整理資料
找出空值個數並刪除空值。
程式說明
第1行:找出欄位Activity各種狀態個數。
Step4)建立訓練資料與測試資料
準備機器學習模型的訓練資料與測試資料。
程式說明
第1到2行:使用LabelEncoder將欄位「Activity」轉換成數值。
第3行:設定X為資料集df刪除欄位「Activity」。
第4到5行:使用StandardScaler標準化輸入資料X,讓平均值為0,標準差平方為1。
第6行:設定y為資料集df欄位「Activity」。
第7行:使用函式train_test_split,以X為獨立變數,y為相依變數,隨機挑選出訓練集與測試集,原始資料的百分之80為訓練集,剩餘百分之20為測試集。
第8到9行:使用shape顯示訓練資料與測試資料的筆數。
Step5)建立與訓練模型
使用SVC建立模型與訓練模型。
程式說明
第1行:建立支援向量機模型,設定kernel為rbf,rbf也是支援向量機的預設kernel。
第2行:輸入訓練資料到模型進行訓練。
Step6)模型預測
輸入測試資料到模型進行預測。
程式說明
第1行:使用函式predict進行預測,以test_X為輸入,變數pred_y參考到此結果。
第2行:使用函式score計算模型正確率。
第3行:使用混淆矩陣進行分析,發現7個測試資料辨別錯誤。
Step7)更換支援向量機的kernel
更換支援向量機的kernel為linear與poly
程式說明
第1到2行:建立支援向量機模型,設定kernel為linear,輸入訓練資料到模型進行訓練。
第3到4行:使用函式predict進行預測,以test_X為輸入,變數pred_y參考到此結果,使用混淆矩陣進行分析,發現11個測試資料辨別錯誤。
第5到6行:建立支援向量機模型,設定kernel為poly,輸入訓練資料到模型進行訓練。
第7到8行:使用函式predict進行預測,以test_X為輸入,變數pred_y參考到此結果,使用混淆矩陣進行分析,發現16個測試資料辨別錯誤。