赵走x博客
网站访问量:151921
首页
书籍
软件
工具
古诗词
搜索
登录
深入浅出Python机器学习:31、自动特征选择
深入浅出Python机器学习:30、数据“升维”
深入浅出Python机器学习:29、数据表达
深入浅出Python机器学习:28、聚类算法
深入浅出Python机器学习:27、特征提取
深入浅出Python机器学习:26、数据降维
深入浅出Python机器学习:25、数据预处理
深入浅出Python机器学习:24、神经网络实例一一手写识别
深入浅出Python机器学习:23、神经网络的原理及使用
深入浅出Python机器学习:22、神经网络的前世今生
深入浅出Python机器学习:21、SVM 实例一一波士顿房价回归分析
深入浅出Python机器学习:20、SVM 的核函数与参数选择
深入浅出Python机器学习:19、支持向量机SVM 基本概念
深入浅出Python机器学习:18、随机森林实例一一要不要和中目亲对象进一步发展
深入浅出Python机器学习:17、随机森林
深入浅出Python机器学习:16、决策树
深入浅出Python机器学习:15、朴素贝叶斯实战一一判断肿瘤是良性还是恶性
深入浅出Python机器学习:14、朴素贝叶斯算法的不同方法
深入浅出Python机器学习:13、朴素贝叶斯基本概念
深入浅出Python机器学习:12、使用L1 正则化的线性模型一一套索回归
深入浅出Python机器学习:11、使用L2 正则化的线性模型一一岭回归
深入浅出Python机器学习:10、最基本的线性模型一一线性回归
深入浅出Python机器学习:9、线性模型的墓本概念
深入浅出Python机器学习:8、K 最近邻算法项目实战一一酒的分类
深入浅出Python机器学习:7、K最近邻算法用于回归分析
深入浅出Python机器学习:6、K最近邻算法处理多元分类任务
深入浅出Python机器学习:5、k最近邻算法在分类任务中的应用
深入浅出Python机器学习:4、K 最近邻算法的原理
深入浅出Python机器学习:3、一些必需库的安装及功能简介
深入浅出Python机器学习:2、基于python i吾言的环境配置
深入浅出Python机器学习:1、概述
人脸数据集加载faces = fetch_lfw_people()报错
31、直方图
74、插件开发:Android端API实现
Python3之socket编程--3:基于UDP的套接字
15、使用 jQuery 处理 Ajax 请求
深入浅出Python机器学习:20、SVM 的核函数与参数选择
资源编号:75907
人工智能
深入浅出Python机器学习
热度:99
SVM 的核函数与参数选择
# 1、不同核函数的SVM对比 在这里要特别指出的是,我们在第4 章线性模型中,提到过一个称为linearSVM 的算法,实际上, linearSVM 就是一种使用了线性内核的SVM 算法。不过linearSVM 不支持对核函数进行修改,因为它默认只能使用线性内核。为了让大家能够直观体验不同内核的SVM 算法在分类中的不同表现,我们画个图像来进行展示,在Jupyter notebook 中输入代码如下: ``` import numpy as np # 导入支持向量机SVM from sklearn import svm # 导人红酒数据集 from sklearn.datasets import load_wine import matplotlib.pyplot as plt # 定义一个函数用来画图 def make_meshgrid(x,y,h=0.2): x_min,x_max=x.min()-1,x.max()+1 y_min,y_max=y.min()-1,y.max()+1 xx,yy=np.meshgrid(np.arange(x_min,x_max,h), np.arange(y_min,y_max,h)) return xx,yy # 定义一个绘制等高线的函数 def plot_contours(ax,clf,xx,yy,**params): Z=clf.predict(np.c_[xx.ravel(),yy.ravel()]) Z=Z.reshape(xx.shape) out=ax.contourf(xx,yy,Z,**params) return out # 使用酒的数据集 wine=load_wine() # 选取数据集的前两个特征 X=wine.data[:,:2] y=wine.target C=1.0 # SVM的正则化参数 models=(svm.SVC(kernel='linear',C=C),svm.LinearSVC(C=C), svm.SVC(kernel='rbf',gamma=0.7,C=C), svm.SVC(kernel='poly',degree=3,C=C)) models=(clf.fit(X,y) for clf in models) # 设定图题 titles=('SVC with linear kernel','LinearSVC (linear kernel)', 'SVC with RBF kernel','SVC with polynomial (degree 3) kernel') # 设定一个子图形的个数和排列方式 fig,sub=plt.subplots(2,2) plt.subplots_adjust(wspace=0.4,hspace=0.4) # 使用前面定义的函数进行画图 X0,X1=X[:,0],X[:,1] xx,yy=make_meshgrid(X0,X1) for clf,title,ax in zip(models,titles,sub.flatten()): plot_contours(ax,clf,xx,yy,cmap=plt.cm.plasma,alpha=0.8) ax.scatter(X0,X1,c=y,cmap=plt.cm.plasma,s=20,edgecolors='k') ax.set_xlim(xx.min(),xx.max()) ax.set_ylim(yy.min(),yy.max()) ax.set_xlabel('Feature 0') ax.set_ylabel('Feature 1') ax.set_xticks(()) ax.set_yticks(()) ax.set_title(title) # 将图型显示出来 plt.show() ``` 运行结果:  [结果分析]从图中,我们可以看到线性内核的SVC 与linearSVC 得到的结果非常近似,但仍然有一点点差别。其中一个原因是linearSVC 对L2 范数进行最小化,而线性内核的SVC 是对L1范数进行最小化。不论如何, linearSVC 和线性内核的SVC 生成的决定边界都是线性的,在更高维数据集中将会是相交的超平面(请读者朋友自行想象)。而RBF 内核的SVC 和polynomial 内核的SVC 分类器的决定边界则完全不是线性 的,它们更加弹性。而决定了它们决定边界形状的,就是它们的参数。在polynomial 内核的SVC 中,起决定性作用的参数就是degree 和正则化参数C ,在本例中我们使用的degree 为3 ,也就是对原始数据集的特征进行乘3 次方操作。而在RBF 内核的SVC 中,起决定作用的是正则化参数C 和参数gamma ,接下来我们重点介绍一下RBF 内核SVC的gamma 参数调节。 # 2、支持向量机的gamma 参数调节 首先让我们看一下不同的gamma 值对于RBF 内核的SVC 分类器有什么影响, 在Jupyter Notebook 中输入代码如下: ``` import numpy as np # 导入支持向量机SVM from sklearn import svm # 导人红酒数据集 from sklearn.datasets import load_wine import matplotlib.pyplot as plt # 定义一个函数用来画图 def make_meshgrid(x,y,h=0.2): x_min,x_max=x.min()-1,x.max()+1 y_min,y_max=y.min()-1,y.max()+1 xx,yy=np.meshgrid(np.arange(x_min,x_max,h), np.arange(y_min,y_max,h)) return xx,yy # 定义一个绘制等高线的函数 def plot_contours(ax,clf,xx,yy,**params): Z=clf.predict(np.c_[xx.ravel(),yy.ravel()]) Z=Z.reshape(xx.shape) out=ax.contourf(xx,yy,Z,**params) return out # 使用酒的数据集 wine=load_wine() # 选取数据集的前两个特征 X=wine.data[:,:2] y=wine.target C=1.0 # SVM的正则化参数 models=(svm.SVC(kernel='rbf',gamma=0.1,C=C), svm.SVC(kernel='rbf',gamma=1,C=C), svm.SVC(kernel='rbf',gamma=10,C=C), ) models=(clf.fit(X,y) for clf in models) # 设定图题 titles=('gamma=0.1','gamma=1','gamma=10') # 设定一个子图形的个数和排列方式 fig,sub=plt.subplots(1,3,figsize=(10,3)) plt.subplots_adjust(wspace=0.4,hspace=0.4) # 使用前面定义的函数进行画图 X0,X1=X[:,0],X[:,1] xx,yy=make_meshgrid(X0,X1) for clf,title,ax in zip(models,titles,sub.flatten()): plot_contours(ax,clf,xx,yy,cmap=plt.cm.plasma,alpha=0.8) ax.scatter(X0,X1,c=y,cmap=plt.cm.plasma,s=20,edgecolors='k') ax.set_xlim(xx.min(),xx.max()) ax.set_ylim(yy.min(),yy.max()) ax.set_xlabel('Feature 0') ax.set_ylabel('Feature 1') ax.set_xticks(()) ax.set_yticks(()) ax.set_title(title) # 将图型显示出来 plt.show() ``` 运行结果:  [ 结果分析} 从图7 - 8 中,可以看出,自左至右gamma 值从0.1 增加到10, gamma值越小,则RBF 内核的直径越大,这样就会有更多的点被模型圈进决定边界中,所以决定边界也就越平滑, 这时的模型也就越简单: 而随着参数的增加,模型则更倾向于把每一个点都放到相应的决定边界中,这时模型的复杂度也相应提高了。所以gamma 值越小,模型越倾向于欠拟合,而gamma 值越大,则模型越倾向于出现过拟合的问题。 而至于正则化参数C,读者朋友可以参见我们在第4 章线性模型的介绍, C 值越小,模型就越受限,也就是说单个数据点对模型的影响越小,模型就越简单:而C 值越大,每个数据点对模型的影响就越大,模型也会更加复杂。 # 3、SVM算法的优势与不足 SVM 可以说是在机器学习领域非常强大的算法了,对各种不同类型的数据集都有不错的表现。它可以在数据特征很少的情况下生成非常复杂的决定边界,当然特征数量很多的情况下表现也不错,换句话说, SVM 应对高维数据集和低维数据集都还算是得心应手。但是,前提条件是数据集的规模不太大。如果数据集中的样本数量在1万以内,SVM 都能驾驭得了,但如果样本数量超过10 万的话, SVM 就会非常耗费时间和内存。 SVM 还有一个短板,就是对于数据预处理和参数调节要求非常高。所以现在很多场景下大家都会更乐意用我们在上一章中介绍的随机森林算法或者是梯度上升决策树(GBDT )算法了。因为它们不需要对数据做预处理,也不用费尽心机去调参。而且对于非专业人士来说,随机森林和梯度上升决策树要比SVM 更容易理解,毕竟SVM 算法的建模过程是比较难以呈现的。 不管怎么说, SVM 还是有价值的。假设数据集中样本特征的测度都比较接近,例如在图像识别领域,还有样本特征数和样本数比较接近的时候, SVM 都会游刃有余。 需要请读者朋友留意的是,在SVM 算法中,有3 个参数是比较重要的:第一个是核函数的选择:第二个是核函数的参数,例如RBF 的gamma 值;第三个是正则化参数C。 RBF 内核的gamma 值是用来调节内核宽度的, gamma 值和C 值一起控制模型的复杂度,数值越大模型越复杂, 而数值越小模型越简单。实际应用中, gamma 值和C 值往往要一起调节,才能达到最好的效果。