支持向量机需要注意的地方:
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)