下面是支持向量机一个二维二分类数据集的训练结果:
import mglearn import matplotlib.pyplot as plt from sklearn.svm import SVC plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False X,y=mglearn.tools.make_handcrafted_dataset() svm=SVC(kernel='rbf',C=10,gamma=0.1).fit(X,y) mglearn.plots.plot_2d_separator(svm,X,eps=.5) mglearn.discrete_scatter(X[:,0],X[:,1],y) #画出支持向量 sv=svm.support_vectors_ #支持向量的类别标签由dual_coef_的正负号给出 sv_labels=svm.dual_coef_.ravel()>0 mglearn.discrete_scatter(sv[:,0],sv[:,1],sv_labels,s=15,markeredgewidth=3) plt.xlabel('特征0') plt.ylabel('特征1') plt.show()
决策边界用黑线表示,支持向量是尺寸比较大的点:
在这个例子里,SVM给出了非常平滑且线性的边界。
在上面的例子里,gamma参数用于控制高斯核的宽度,它决定了点与点之间“靠近”是指多大的距离,C参数是正则化参数,与线性模型类似,它限制了每个点的重要性(dual_coef_)。
用一个例子展示改变参数的结果:
import mglearn import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False fig,axes=plt.subplots(3,3,figsize=(15,10)) for ax,C in zip(axes,[-1,0,3]): for a,gamme in zip(ax,range(-1,2)): mglearn.plots.plot_svm(log_C=C,log_gamma=gamme,ax=a) axes[0,0].legend(['分类0','分类1','sv分类0','sv分类1'],ncol=4,loc=(.9,1.2)) plt.show()
gamma较小,说明高斯核的半径较大,许多点都被看做比较相近,在图中可以看到,左边的图决策边界非常平滑,越往右的图决策边界更关注单个的点。大的gamma值会生成更复杂的模型。
与线性模型相同,C越小,说明模型非常受限,每个数据点的影响范围都有限。
默认情况下,C和gamma都等于1:
import numpy as np from sklearn.datasets import make_blobs import mglearn import matplotlib.pyplot as plt from sklearn.svm import LinearSVC from sklearn.datasets import load_breast_cancer from sklearn.model_selection import train_test_split from mpl_toolkits.mplot3d import Axes3D,axes3d from sklearn.svm import SVC plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False cancer=load_breast_cancer() X_train,X_test,y_train,y_test=train_test_split(cancer.data,cancer.target,random_state=0) svc=SVC(C=1,gamma=1) svc.fit(X_train,y_train) print('训练集精度:{:.2f}'.format(svc.score(X_train,y_train))) print('测试集精度:{:.2f}'.format(svc.score(X_test,y_test))) plt.plot(X_train.min(axis=0),'o',label='min') plt.plot(X_train.max(axis=0),'^',label='max') plt.legend(loc=4) plt.xlabel('特征index') plt.ylabel('特征大小') plt.yscale('log') plt.show()
这个模型在训练集上的分数非常完美,但是测试集上的精度只有0.63,存在非常严重的过拟合,SVM对参数的设置和数据的缩放都非常敏感。
特征的最大最小值:
可以看到,数据集特征具有完全不同的数量级,这对核SVM有极大影响。
猜你喜欢
网友评论
- 搜索
- 最新文章
- 热门文章