第17章主要在學習SVM的實作與比較,包括線性分類器訓練、處理線性不可分類別的kernel函數應用、預測機率生成、support vectors以及處理不平衡類別。而Exercise則擴展至由第15章到第17章的多個不同模型比較,使用Wine資料集評估了LinearSVC、Linear SVM、RBF SVM等模型的效能。透過這個章節的練習,能夠學習不同演算法的實作方法,理解它們在準確率和訓練時間上的差異,並掌握如何選擇適合特定問題的模型。
OS: Windows 11 23H2
CPU: Intel Core i7-13700K
GPU: NVIDIA GeForce RTX 4070 SUPER 12G
RAM: DDR5 64G 5600MT/s
Python Package Manager: uv
Python Version: 3.10.16
Python Package: numpy, pandas, sklearn, rich, seaborn, matplotlib
IDE: Visual Studio Code
為方便查看運行結果,故額外使用rich函式庫建立兩個Function格式化印出指定內容。
17.1 Training a Linear Classifier
Code:
Explanation:
此程式碼使用Linear SVC對Iris數據集進行二分類。只從數據集中選取前100筆樣本的兩個特徵,通過sklearn提供的StandardScaler方法標準化處理數據後,使用fit方法訓練Linear SVC模型,最後使用matplotlib的scatter方法繪製決策邊界和樣本分布圖,並預測測試樣本的類別(圖中的紅色圓點為測試樣本)。
Discussion:
Linear SVC方法的計算效率高且在低維數據上表現較好;但是無法處理非線性的關係,且對特徵縮放敏感,需要額外調整參數C以平衡誤差。
Result:
17.2 Handling Linearly Inseparable Classes Using Kernels
Code:
Explanation:
此程式碼使用SVC處理非線性可分的資料。首先透過隨機生成的二維資料點進行分類(使用XOR方法)。並在kernel中分別設定Linear和RBF兩種SVM模型(其中C參數皆設為1,以平衡調節模型對錯誤分類的容忍度;而RBF的gamma值設為1,控制創建的決策邊界彎曲程度與複雜度)。第一張圖顯示線性SVM的決策邊界(直線),雖然嘗試分離資料但無法正確處理這種類型的資料,導致許多點被錯誤分類。第二張圖則展示RBF SVM的效果,它創建了非線性的決策邊界(曲線),能更精確地分離資料。
Discussion:
Linear SVM的計算速度快且需調整的參數少,使其容易實現和優化。它提供良好的解釋性,能夠直觀展示各特徵的重要程度,並在高維特徵空間中表現穩定。然而,正如第一張圖所示,Linear SVM無法有效處理非線性關係,其決策邊界僅為超平面,表達能力受限。相比之下,RBF SVM透過將資料映射到高維空間,能夠創建更為靈活的非線性決策邊界,如第二張圖所示,可以更精確地分離複雜分布的資料點。不過,其需要更高的計算成本,尤其是在大型資料集上。RBF SVM還需要更謹慎地調整gamma和C參數,調整不當容易導致過擬合,且模型的解釋性較差,難以直觀理解特徵對決策的影響方式。
Result:
17.3 Creating Predicted Probabilities
Code:
Explanation:
此程式碼使用SVC產生預測機率值,首先載入Iris資料集並進行標準化處理,接著建立一個Linear SVM模型,其中設定probability=True以啟用機率輸出功能。模型訓練完成後,對一個測試觀測資料進行預測,並輸出其屬於各個類別的機率分布值。
Discussion:
SVM產生機率值可提供分類決策的信心程度,有助於風險評估和決策制定。然而,這些機率是透過後處理方法間接計算而非原生機率,計算成本較高且可能不如其他原生機率模型準確,尤其在多類別分類問題上表現受限。
Result:
17.4 Identifying Support Vectors
Code:
Explanation:
此程式碼展示了如何從SVM模型中檢查support vectors的各項數值。首先載入Iris資料集的前100筆樣本,標準化處理後訓練Linear SVM模型。訓練完成後,通過模型提供的三個方法:support_vectors_、support_以及n_support_來檢視SVM決策邊界的support vectors的特徵值、support vectors在原始資料中的索引位置、每個類別的support vectors數量。
Discussion:
分析support vectors能夠深入理解SVM模型的決策界限形成機制,有助於模型解釋與優化。support vectors數量少表示模型較為簡約,泛化能力強。然而此方法的限制在於:當使用非線性kernel函數時,support vectors在特徵空間的解釋會變得困難;且support vectors數量過多可能暗示模型過於複雜或存在噪音干擾,需要進一步調整參數。
Result:
17.5 Handling Imbalanced Classes
Code:
Explanation:
此程式碼處理不平衡類別的分類問題。首先從Iris資料集選取前100筆樣本(只取兩種類別),為創建不平衡資料集,將前40筆資料刪除,只留下後60筆資料。進行標準化處理後,透過設定class_weight="balanced"的SVC進行訓練,最後繪製決策邊界。
Discussion:
此方法的優點是透過調整類別權重,有效處理不平衡數據而無需額外採樣。然而,其可能在極端不平衡情況下效果有限,需要配合其他技術使用。
Result:
Settings
這邊使用scikit-learn的toy datasets中的Wine作為主要資料集,對第15~17章中的模型進行訓練與比較差異。
Wine資料集是scikit-learn提供的經典toy datasets之一,常用於分類演算法的學習與示範。這個資料集包含178個樣本,來自義大利同一地區的3種不同葡萄栽培者生產的葡萄酒。每個樣本都有13個特徵,這些特徵是化學分析的結果,包括酒精含量、蘋果酸含量、灰分、鎂含量、總酚含量等。資料集的目標是根據這些化學特徵將葡萄酒分類為3種不同的品種。這個資料集因為特徵明確、樣本數適中且分類任務清晰,是機器學習初學者學習分類算法的理想選擇。
Explanation:
首先透過sklearn提供的load_wine載入Wine資料集,並透過mask變數設定只使用資料集中的前兩個類別,接著經過標準化後,將其拆分為train_data、train_target、eval_data、eval_target用於訓練與評估各個不同的模型性能。
Code:
Explanation:
接著分別針對LinearSVC、Linear SVM、SBF SVM、DecisionTreeClassifier、DecisionTreeRegressor、RandomForestClassifier、RandomForestRegressor、AdaBoost、XGBoost、LightGBM、KNeighborsClassifier、RadiusNeighborsClassifier這些第15章~第17章所有出現的模型在相同的訓練集中進行訓練,並記錄每個模型的訓練所需時間與其在評估集上的準確度。
Code:
Discussion:
此實驗結果顯示了各個模型在效能與訓練時間的關係。KNeighborsClassifier和RandomForestClassifier都達到了100%的準確率,但KNeighborsClassifier訓練時間明顯較短(14.51 ms對比110.92 ms)。LinearSVC、Linear SVM和DecisionTreeClassifier都實現了約97%的高準確率,且訓練時間極短(1 ~ 2 ms)。
值得注意的是,DecisionTreeRegressor幾乎無需訓練時間(記錄為0 ms)卻達到近97%的準確率,顯示其極高的效率。相比之下,RadiusNeighborsClassifier雖然也幾乎無須訓練時間,但準確率卻只有90.91%。而XGBoost和LightGBM在設定num_class為2的情況下,不但訓練時間較長,準確率也較低,只有約55%。這可能是因為Wine資料集特徵數量少且樣本量小,使得這些針對大規模資料優化的演算法無法充分發揮優勢。此外,這些模型可能需要更精細的參數調校以適應此類小型、高維特徵空間的資料集,而預設參數設定可能導致過擬合或欠擬合現象。
Result:
Difficulties Encountered and Solutions
1. 在17.5處理多維不平衡資料集結果顯示不直觀的問題
Difficulties:在課本範例中直接使用Iris的多個不同的Class,透過SVC進行訓練,但並無輸出結果,若直接使用17.1的方法印出圖會導致顯示的決策邊界與資料點沒有任何關係(因為高維資料映射到低維時將其餘值設為0)。
Solution:將Iris資料集在進行訓練前只擷取兩種Class進行訓練,即可解決此問題。
References
[1] Machine Learning with Python Cookbook-2nd, by Kyle Gallatin and Chris Albon, O'Reilly, 2023, ISBN: 9781098135720
[2] 機器學習入門:使用Scikit-Learn與TensorFlow, 黃建庭, 碁峰, 2021, ISBN: 9786263240285
[3] 精通機器學習:使用Scikit-Learn, Keras與TensorFlow(第三版), Aurélien Géron, 歐萊禮, 2024, ISBN: 9786263246676
[4] scikit-learn 機器學習實戰, 鄧立國 郭雅秋 陳子堯 鄧淇文, 清華大學, 2022, ISBN: 9787302604396
[5] Python資料科學學習手冊(第二版), Jake VanderPlas , 歐萊禮, 2023, ISBN: 9786263246843