支持向量機需要注意的地方:
1. 三個理解步驟:
(1) 理解svm的損失函數,min ||w||^2/2並且y(wx+b)>=k的限制條件的推導
(2) 拉格朗日定理求最小值,以及推導過程
2. 關於核函數的作用:
可以通過升維度的方式將無法線性可分的數據可分,但升維的代價太大,所以通過核函數可以達到類似的效果並且計算量也不是那麼大,核函數相當於增加了一維,在空間中形成更核函數類似的超平面( 理解決策邊界 / 超平面 )
通常【線性核函數】對於線性可分的數據集效果比較好,但非線性數據集就不是很好;【多項式核函數】的效果在不調節d參數時,跟線性核函數的效果差不多,,但是如果調節參數,多項式效果會比較好;【高斯核函數】在這幾個核函數中是效果最好的;【sigmod核函數】的效果不是特別理想。
根據幾個核函數的公式,【線性核函數】幾乎沒有什麼參數可調,【多項式核函數】可通過調d參數,但d越大,次方越大,付出的計算代價越大;【高斯核函數】高斯核函數可以調節兩個參數;
3. svm最後的評估效果可以通過準確率和泛化誤差來判定:
準確率高,但測試集的泛化能力可能差(即超平面C參數很小),準確率 低,但可能的泛化能力會高一點(即超平面C參數間隔大)
from sklearn.datasets import make_blobs
from sklearn.svm import SVC
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
# 使用make_blogs函數創建數據集合
X,y = make_blobs(n_samples=50,centers=2,random_state=0,cluster_std=0.6)
X.shape
pd.DataFrame(y)
plt.figure()
# 查看數據的分佈情況
plt.scatter(X[:,0], X[:,1], c=y, s=50,cmap = "rainbow")
plt.xticks([])
plt.yticks()
def plot_svc_decision_function(model,ax=None):
# 2.獲取網格座標xy
if ax is None:
ax=plt.gca()
# 獲取當前座標軸的兩端極值
xlim = ax.get_xlim()
ylim = ax.get_ylim()
# 將x/y軸的兩極值切分成30等分
axisx = np.linspace(xlim[0],xlim[1],30)
axisy = np.linspace(ylim[0],ylim[1],30)
axisx, axisy= np.meshgrid(axisx, axisy)
xy = np.vstack([axisx.ravel(), axisy.ravel()]).T
# 4.獲取到決策樹的決策邊界座標,decision_function接口主要獲取每個樣本到座標決策邊界轉化後的座標
P = model.decision_function(xy).reshape(axisx.shape)
#print(P.shape)
# (30,30)
ax.contour(axisx,axisy,P,colors=["r","b","r"],levels=[-1,0,1],alpha=0.5,linestyles=["--","-","--"])
ax.set_xlim(xlim)
ax.set_ylim(ylim)
# 1.描點,建立座標系,爲網格座標分割數組做準備
plt.scatter(X[:,0], X[:,1], c=y, s=50,cmap = "rainbow")
# 2.SVC訓練數據
model = SVC(kernel="linear").fit(X,y)
# 3.畫圖
plot_svc_decision_function(model)
#plt.show()
# 通過環形數據來演示關於線性SVC的分類方式
from sklearn.datasets import make_circles
# X爲生成數據座標,y爲標籤,對應描點scatter的顏色
X,y = make_circles(100,factor=0.1,noise=.1)
# pd.DataFrame(y)
# clf = SVC(kernel="linear").fit(X,y)
clf = SVC(kernel="rbf").fit(X,y)
plt.scatter(X[:,0],X[:,1],c=y,cmap = "rainbow")
plot_svc_decision_function(clf)