一、什麼是SVM分類器?
在講解SVM分類器之前,我們先來回顧一下最基本的分類問題。分類是機器學習中最常見的問題之一,而二分類問題則是其中最為經典的。我們的目的是將一組數據劃分為兩個不同的類別,並且保證分類的準確率盡量高。現實生活中,有很多分類問題不能夠被解決,因為數據的特徵非常複雜,或者數據本身就非常雜亂。在這種情況下,SVM(support vector machine,支持向量機)分類器可以幫助我們。
對於一般的二分類問題,SVM分類器的基本思路就是在不同類別的數據點之間划出一個超平面,讓數據點與超平面的距離盡量大,從而實現分類。在SVM分類器中,我們將離這個超平面最近的一些點叫做「支持向量」,它們是分割超平面的重要組成部分。SVM分類器的主要優點是:當你有大量特徵時,它可以通過使用核函數來處理高維數據,從而在分類問題上表現良好。
下面,我們來看一下如何使用sklearn中的SVM分類器。
二、如何使用SVM分類器?
使用SVM分類器的第一步是導入必要的工具包,以及準備好我們需要使用的數據集和相關的模塊。以下是一些基礎的導入代碼:
from sklearn import datasets
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
import numpy as np
其中,我們需要用到的數據集是威斯康辛州乳腺癌診斷數據集,它包含了569個樣本,每個樣本有30個特徵。數據的標籤是M(惡性)和B(良性),我們需要對這些樣本進行分類。使用sklearn提供的datasets中的load_breast_cancer可以很快地導入這個數據集:
cancer = datasets.load_breast_cancer()
X = cancer.data
y = cancer.target
接下來,我們需要將數據集劃分為訓練集和測試集,用於模型的訓練和預測。在這裡,我們採用test_size=0.3,即將70%的數據作為訓練集,30%的數據作為測試集。同時,我們使用了數據標準化,這是為了保證SVM分類器的支持向量在這些數據上比較均勻的分散,避免某些特徵和樣本對分類結果產生過大的影響。
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
clf = Pipeline([
("scaler", StandardScaler()),
("svm_clf", SVC(kernel="rbf", C=0.1, probability=True))
])
clf.fit(X_train, y_train)
其中,SVC這個類就是我們將要使用的SVM分類器。在這裡,我們使用的參數是rbf(徑向基函數,可以處理非線性問題)和C=0.1(正則化參數),即在分割超平面的準確率和支持向量之間進行平衡。
三、評估SVM分類器的準確率
當我們完成了SVM分類器的訓練之後,最後一個重要的步驟是評估模型的準確率。在這裡,我們使用了準確率,AUC和ROC曲線等指標來評價模型。對於某個二分類問題而言,AUC描述的是模型正確地區分正負樣本的能力,而ROC曲線則描述了改變分類閾值對分類器的分類能力造成的影響。
from sklearn.metrics import accuracy_score, roc_auc_score, roc_curve
y_pred = clf.predict(X_test)
y_proba = clf.predict_proba(X_test)[:, 1]
acc = accuracy_score(y_test, y_pred)
auc = roc_auc_score(y_test, y_proba)
fpr, tpr, thresholds = roc_curve(y_test, y_proba)
以上代碼展示了如何使用sklearn來計算SVM分類器的準確率和ROC曲線。y_pred是預測的測試集標籤,y_proba是預測標籤為1的置信度,即概率。其中,accuracy_score計算的是精度,roc_auc_score計算的是AUC值。
四、優化SVM分類器
最後,我們來看一下如何優化SVM分類器。優化方法有很多,但是針對SVM分類器而言,有以下幾種。
1、改變核函數類型
通常情況下,徑向基函數是最為常見的核函數類型。但是,有時候考慮使用多項式核函數或者sigmoid核函數等也是有一定收益的。
clf = Pipeline([
("scaler", StandardScaler()),
("svm_clf", SVC(kernel="sigmoid", C=0.1, gamma=1.0, coef0=0.0))
])
2、改變正則化參數C、核函數寬度gamma等參數
通過改變正則化參數C或者核函數寬度gamma等參數,可以讓SVM分類器更加適應性強或者更加專業化。
clf = Pipeline([
("scaler", StandardScaler()),
("svm_clf", SVC(kernel="rbf", C=10, gamma=0.1, probability=True))
])
3、使用GridSearchCV進行模型調優
GridSearchCV是sklearn中的一個模型調優工具,可以幫助我們儘快地找到最佳的模型參數,從而達到快速優化SVM分類器的效果。
from sklearn.model_selection import GridSearchCV
parameters = {'kernel': ['rbf'], 'C': [0.1, 1, 10], 'gamma': [0.1, 1, 10]}
svc = svm.SVC(probability=True)
clf = GridSearchCV(svc, parameters, n_jobs=-1, cv=5)
clf.fit(X_train, y_train)
以上就是SVM分類器的基礎知識和使用方法。SVM分類器能夠在許多不同的二分類問題上表現良好,但是在處理一些高維、非線性或者數據分布不平衡的問題時,可能需要使用其他的分類器或者優化策略。通過持續地學習,相信大家一定能夠在實際應用中靈活地使用SVM分類器或者其他分類器,從而更好地解決各種分類問題。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/250988.html