人工智能编程:不同的正则化参数对支持向量机效果的影响
itomcoil 2025-06-24 14:24 12 浏览
机器学习专栏限时优惠
数据集的介绍
这篇文章是要使用机器学习中的支持向量机算法实现分类问题,首先我们现在使用非常有名的用于分类问题的数据集:鸢尾花数据集。它是基于鸢尾花的花萼的长度和宽度进行分类的。我们只用其中两维特征,这能够方便可视化。
我们先来看一下它的数据是什么样子的
这里有四列,我们只使用花萼的长度和宽度这两个特征来完成分类问题。
我们只获取了iris数据集的前两列,为X,我们获取对应每一个样本的标签值,为y,分别是0,1,2。
支持向量机的使用
支持向量机有两种:SVC,支持向量分类,用于分类问题;SVR,支持向量回归,用于回归问题。这里我们是使用支持向量机来完成分类问题,所以使用SVC。
sklearn.svm.SVC(C=1.0, kernel='rbf', degree=3, gamma='auto', coef0=0.0, shrinking=True, probability=False,tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=-1, decision_function_shape=None,random_state=None)
C:C-SVC的惩罚参数C,默认值是1.0C越大,相当于惩罚松弛变量,希望松弛变量接近0,即对误分类的惩罚增大,趋向于对训练集全分对的情况,这样对训练集测试时准确率很高,但泛化能力弱。C值小,对误分类的惩罚减小,允许容错,将他们当成噪声点,泛化能力较强。
kernel :核函数,默认是rbf,可以是‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’
0 – 线性:u'v
1 – 多项式:(gamma*u'*v + coef0)^degree
2 – RBF函数:exp(-gamma|u-v|^2)
3 –sigmoid:tanh(gamma*u'*v + coef0)degree :多项式poly函数的维度,默认是3,选择其他核函数时会被忽略。
gamma : ‘rbf’,‘poly’ 和‘sigmoid’的核函数参数。默认是’auto’,则会选择1/n_features coef0 :核函数的常数项。对于‘poly’和 ‘sigmoid’有用。probability :是否采用概率估计?.默认为Falseshrinking :是否采用shrinking heuristic方法,默认为true tol :停止训练的误差值大小,默认为1e-3cache_size :核函数cache缓存大小,默认为200class_weight :类别的权重,字典形式传递。设置第几类的参数C为weight*C(C-SVC中的C) verbose :允许冗余输出?max_iter :最大迭代次数。-1为无限制。decision_function_shape :‘ovo’, ‘ovr’ or None, default=None3random_state :数据洗牌时的种子值,int值
程序一:将数据集分成两部分,一部分140行训练集,一部分10行测试集,我们用140行训练集来训练模型,画出分类边界,然后用10行进行测试,并将测试的点画在图中
# -*- coding: utf-8 -*-
import numpy as np
from sklearn import svm
from sklearn import datasets
from matplotlib.colors import ListedColormap
import pylab as pl
iris = datasets.load_iris()
X = iris.data[:, :2]
y = iris.target
i=np.random.permutation(len(X))
x_train=X[i[:-10]]
y_train=y[i[:-10]]
x_test=X[i[-10:]]
y_test=y[i[-10:]]
svc = svm.SVC(kernel='linear')
cmap_light = ListedColormap(['#FFAAAA', '#AAFFAA', '#AAAAFF'])
cmap_bold = ListedColormap(['#FF0000', '#00FF00', '#0000FF'])
def plot_estimator(estimator, X, y):
estimator.fit(X, y)#拟合x,y
x_min, x_max = X[:, 0].min() - .1, X[:, 0].max() + .1y_min, y_max = X[:, 1].min() - .1, X[:, 1].max() + .1xx, yy = np.meshgrid(np.linspace(x_min, x_max, 100),np.linspace(y_min, y_max, 100))Z = estimator.predict(np.c_[xx.ravel(), yy.ravel()])Z = Z.reshape(xx.shape)pl.figure()#plt.figure(1) # 创建图表1pl.pcolormesh(xx,yy,Z, cmap=cmap_light)#类似np.pcolor ,是对坐标点着色xx,yy标识样本,Z表示作色方案
plot_estimator(svc,x_train,y_train)#调用plot_estimator函数
print svc.predict(x_test)#预测测试集,输出测试结果
print y_test#真实的测试集类型,与预测结果进行比较
pl.scatter(x_test[:, 0], x_test[:, 1], c=y_test, cmap=cmap_bold)#,将测试集数据散点图表示,c为指定cmap的颜色pl.axis('tight')pl.axis('off')pl.tight_layout()
pl.show()
代码分析
import pylab as pl#从 numpy 和 matplotlib 填充交互式命名空间,pylab结合了pyplot和numpy,对交互式使用来说比较方便,既可以画图又可以进行简单的计算,但是建议一个项目中还是numpy和pyplot分开使用比较好# 鸢尾花数据集是sklearn自带的。iris = datasets.load_iris()#只提取前面两列数据作为特征X = iris.data[:, :2]i=np.random.permutation(len(X))#生成一个从1到150的随机数组
这个代码的意思就是取140行训练集数据,取10行测测试集数据,是随机存取的。
svc = svm.SVC(kernel='linear')svc.fit(x_train,y_train)#基于这些数据训练出一个支持向量分离器SVC#拟合函数cmap_light = ListedColormap(['#FFAAAA', '#AAFFAA', '#AAAAFF'])#预测结果颜色cmap_bold = ListedColormap(['#FF0000', '#00FF00', '#0000FF'])#样本颜色# 因为鸢尾花是3分类问题,我们要对样本和预测结果均用三种颜色区分开。x_min, x_max = X[:, 0].min() - .1, X[:, 0].max() + .1#第一列的最大值加1,最小值减1y_min, y_max = X[:, 1].min() - .1, X[:, 1].max() + .1#第二列的最大值加1,最小值减1目的就是弄出足够大的网格空间# 产生网格节点xx, yy = np.meshgrid(np.linspace(x_min, x_max, 100),np.linspace(y_min, y_max, 100))#xx为一个100行100列的数组,其中每列上的数据都一样,yy为一个100行100列的数组,其中每行上的数据都一样# print xx.ravel()#将多维数组变成一维,这样那长度就是10000了#print np.c_[xx.ravel(), yy.ravel()]#将xx.ravel和yy.ravel合并为一个矩阵[[]],第一列为xx.level,第二列为yy.levelZ = estimator.predict(np.c_[xx.ravel(), yy.ravel()])#我们是使用刚刚拟合好的svc来预测np.c_[xx.ravel(), yy.ravel()],这个np.c_[xx.ravel(), yy.ravel()]仍然是通过X和y来获取到的,所以他们的预测结果所画的图的决策边界就是svc训练集的结果# 对预测结果上色Z = Z.reshape(xx.shape)#把Z的shape弄成100*100的,Z是预测的结果也就是0,1,2这些东西这个表示对应位置的颜色pl.pcolormesh(xx,yy,Z, cmap=cmap_light)#类似np.pcolor ,是对坐标点着色xx,yy标识样本,Z表示作色方案
代码图片版
代码执行结果为:
根据代码的可视化执行结果及下面的预测类别和实际类别比较发现,有一个样本预测出现了问题,准确度是90%。
- 正如我们所见,kernel="linear"(线性和函数)给了我们线性的决策边界:两类之间的分离边界是直线。
- 多分类的工作方式就是"one versus one" :在任意两类样本之间设计一个SVM,因此k个类别的样本就需要设计k(k-1)/2个SVM。当对一个未知样本进行分类时,最后得票最多的类别即为该未知样本的类别。
- 线性支持向量分类器(LinearSVC):对于线性核函数,有一个新的对象LinearSVC ,它使用了不同的算法。在某些数据集上运行地更快(比如稀疏数据集,文本挖掘就是典型的例子)。它对于多分类采用的是"one versus all"策略。线将一个类别和其它类别做一个分类,以此类推。
代码上体现一对多的分类就是:
svc = svm.LinearSVC()
效果为:
我们分类边界是根据一些样本点来确定的,不是全部,这些样本点我们称为支持向量,那么在当前案例中究竟哪些点为支持向量呢?
支持向量:就是最靠近分离边界的样本点。支持向量机的工作方式就是找到这些支持向量,它们被认为是在二分类问题中最具代表性的样本点。为了更方便的可视化,我们选择二分类问题,也就是只考虑鸢尾花数据集中的1类和2类样本。这两类不是线性可分的,我们查找此时的支持向量支持向量的坐标可以通过方法support_vectors_来找到。我们在图中将对它们着重标记。我们将所有的训练数据都在图中表示出来,其中哪个样本属于支持向量,我将其白色表示。
这个代码的意思为
x_train, y_train = x_train[np.in1d(y_train, [1, 2])], y_train[np.in1d(y_train, [1, 2])]plot_estimator(svc,x_train, y_train)pl.scatter(x_train[:, 0], x_train[:, 1], c=y_train, cmap=cmap_bold)pl.axis('tight')pl.axis('off')pl.tight_layout()pl.scatter(svc.support_vectors_[:, 0], svc.support_vectors_[:, 1], s=5, facecolors='white')pl.show()
np.in1d(A,B)的意思是在序列A中寻找与序列B相同的值,并返回一逻辑值(True,False)或逻辑值构成的向量,上面代码的意思就是在y_train中查找[1,2]这两个类别,是的化就为true,不是就是false,最终的x_train,y_train就是类别1,2的样本了,就把类别为0的给过滤了。
下面就是拟合这部分数据
然后画出训练数据的散点图
然后将支持向量画在图中,大小s为5,填充颜色为white,这样就可以方便我们看出哪些样本是支持向量了,效果为:
正则化:
只考虑支持向量其实就是一种正则化的形式。实际上,它强迫模型在处理样本特征的时候变得更加简单。正则项可以通过调整系数 C 来决定:小的C值:将会有很多支持向量。决策边界=类别A的平均值-类别B的平均值,它会忽略一些样本的影响大的C值:将会有较少的支持向量。决策边界是被大多数支持向量所决定,它会尽量满足每一个样本。
错误项的惩罚系数。C越大,即对分错样本的惩罚程度越大,因此在训练样本中准确率越高,但是泛化能力降低,也就是对测试数据的分类准确率降低。相反,减小C的话,容许训练样本中有一些误分类错误样本,泛化能力强。对于训练样本带有噪声的情况,一般采用后者,把训练样本集中错误分类的样本作为噪声。
当c大的时候的效果为:
svc = svm.SVC(kernel='linear',C=1e3)
可以看出当c很大的时候,会发现它的泛化效果不太好
当c小的时候的效果为:
svc = svm.SVC(kernel='linear',C=1e-1)
可以看出其实泛化效果也不是太好,可能是测试数据集不多的原因。
支持向量机的有个好处是对于许多数据集,默认参数'C=1'其实工作得很好。
核方法
采用核方法,能够很方便地产生非线性分类边界。
linear,线性核,会产生线性分类边界。一般来说它的计算效率最高,而且需要数据最少。poly ,多项式核,会产生多项式分类边界。rbf,径向基函数,也就是高斯核,是根据与每一个支持向量的距离来决定分类边界的。它的映射到无线维的。它是最灵活的方法,但是也需要最多的数据。
演示:
svc = svm.SVC(kernel='linear')线性核
svc = svm.SVC(kernel='poly', degree=4)多项式核:
svc = svm.SVC(kernel='rbf', gamma=1e2)高斯核
这就是三种不同核方法的拟合效果
相关推荐
- selenium(WEB自动化工具)
-
定义解释Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7,8,9,10,11),MozillaF...
- 开发利器丨如何使用ELK设计微服务中的日志收集方案?
-
【摘要】微服务各个组件的相关实践会涉及到工具,本文将会介绍微服务日常开发的一些利器,这些工具帮助我们构建更加健壮的微服务系统,并帮助排查解决微服务系统中的问题与性能瓶颈等。我们将重点介绍微服务架构中...
- 高并发系统设计:应对每秒数万QPS的架构策略
-
当面试官问及"如何应对每秒几万QPS(QueriesPerSecond)"时,大概率是想知道你对高并发系统设计的理解有多少。本文将深入探讨从基础设施到应用层面的解决方案。01、理解...
- 2025 年每个 JavaScript 开发者都应该了解的功能
-
大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发。1.Iteratorhelpers开发者...
- JavaScript Array 对象
-
Array对象Array对象用于在变量中存储多个值:varcars=["Saab","Volvo","BMW"];第一个数组元素的索引值为0,第二个索引值为1,以此类推。更多有...
- Gemini 2.5编程全球霸榜,谷歌重回AI王座,神秘模型曝光,奥特曼迎战
-
刚刚,Gemini2.5Pro编程登顶,6美元性价比碾压Claude3.7Sonnet。不仅如此,谷歌还暗藏着更强的编程模型Dragontail,这次是要彻底翻盘了。谷歌,彻底打了一场漂亮的翻...
- 动力节点最新JavaScript教程(高级篇),深入学习JavaScript
-
JavaScript是一种运行在浏览器中的解释型编程语言,它的解释器被称为JavaScript引擎,是浏览器的一部分,JavaScript广泛用于浏览器客户端编程,通常JavaScript脚本是通过嵌...
- 一文看懂Kiro,其 Spec工作流秒杀Cursor,可移植至Claude Code
-
当Cursor的“即兴编程”开始拖累项目质量,AWS新晋IDEKiro以Spec工作流打出“先规范后编码”的系统工程思维:需求-设计-任务三件套一次生成,文档与代码同步落地,复杂项目不...
- 「晚安·好梦」努力只能及格,拼命才能优秀
-
欢迎光临,浏览之前点击上面的音乐放松一下心情吧!喜欢的话给小编一个关注呀!Effortscanonlypass,anddesperatelycanbeexcellent.努力只能及格...
- JavaScript 中 some 与 every 方法的区别是什么?
-
大家好,很高兴又见面了,我是姜茶的编程笔记,我们一起学习前端相关领域技术,共同进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力在JavaScript中,Array.protot...
- 10个高效的Python爬虫框架,你用过几个?
-
小型爬虫需求,requests库+bs4库就能解决;大型爬虫数据,尤其涉及异步抓取、内容管理及后续扩展等功能时,就需要用到爬虫框架了。下面介绍了10个爬虫框架,大家可以学习使用!1.Scrapysc...
- 12个高效的Python爬虫框架,你用过几个?
-
实现爬虫技术的编程环境有很多种,Java、Python、C++等都可以用来爬虫。但很多人选择Python来写爬虫,为什么呢?因为Python确实很适合做爬虫,丰富的第三方库十分强大,简单几行代码便可实...
- pip3 install pyspider报错问题解决
-
运行如下命令报错:>>>pip3installpyspider观察上面的报错问题,需要安装pycurl。是到这个网址:http://www.lfd.uci.edu/~gohlke...
- PySpider框架的使用
-
PysiderPysider是一个国人用Python编写的、带有强大的WebUI的网络爬虫系统,它支持多种数据库、任务监控、项目管理、结果查看、URL去重等强大的功能。安装pip3inst...
- 「机器学习」神经网络的激活函数、并通过python实现激活函数
-
神经网络的激活函数、并通过python实现whatis激活函数感知机的网络结构如下:左图中,偏置b没有被画出来,如果要表示出b,可以像右图那样做。用数学式来表示感知机:上面这个数学式子可以被改写:...
- 一周热门
- 最近发表
- 标签列表
-
- ps图案在哪里 (33)
- super().__init__ (33)
- python 获取日期 (34)
- 0xa (36)
- super().__init__()详解 (33)
- python安装包在哪里找 (33)
- linux查看python版本信息 (35)
- python怎么改成中文 (35)
- php文件怎么在浏览器运行 (33)
- eval在python中的意思 (33)
- python安装opencv库 (35)
- python div (34)
- sticky css (33)
- python中random.randint()函数 (34)
- python去掉字符串中的指定字符 (33)
- python入门经典100题 (34)
- anaconda安装路径 (34)
- yield和return的区别 (33)
- 1到10的阶乘之和是多少 (35)
- python安装sklearn库 (33)
- dom和bom区别 (33)
- js 替换指定位置的字符 (33)
- python判断元素是否存在 (33)
- sorted key (33)
- shutil.copy() (33)