优秀的编程知识分享平台

网站首页 > 技术文章 正文

人工智能编程:不同的正则化参数对支持向量机效果的影响

nanyue 2024-11-24 19:41:52 技术文章 1 ℃

机器学习专栏限时优惠



数据集的介绍

这篇文章是要使用机器学习中的支持向量机算法实现分类问题,首先我们现在使用非常有名的用于分类问题的数据集:鸢尾花数据集。它是基于鸢尾花的花萼的长度和宽度进行分类的。我们只用其中两维特征,这能够方便可视化。

我们先来看一下它的数据是什么样子的

这里有四列,我们只使用花萼的长度和宽度这两个特征来完成分类问题。

我们只获取了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)高斯核

这就是三种不同核方法的拟合效果

最近发表
标签列表