网站首页 > 技术文章 正文
机器学习专栏限时优惠
数据集的介绍
这篇文章是要使用机器学习中的支持向量机算法实现分类问题,首先我们现在使用非常有名的用于分类问题的数据集:鸢尾花数据集。它是基于鸢尾花的花萼的长度和宽度进行分类的。我们只用其中两维特征,这能够方便可视化。
我们先来看一下它的数据是什么样子的
这里有四列,我们只使用花萼的长度和宽度这两个特征来完成分类问题。
我们只获取了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)高斯核
这就是三种不同核方法的拟合效果
- 上一篇: 如何使用支持向量机学习非线性数据集
- 下一篇: 如何消除多重共线性
猜你喜欢
- 2024-11-24 7000字,Python分析:泰坦尼克号中女生更容易生还?
- 2024-11-24 SVM 算法 和 梅尔倒谱系数 结合使用噪音检测的应用
- 2024-11-24 scikit-learn的5大新功能
- 2024-11-24 机器学习集成方法:Bagging, Boosting, Stacking, Voting, Blending
- 2024-11-24 Kaggle练习赛---Titanic的分析与整理
- 2024-11-24 超参数自动调参库介绍
- 2024-11-24 支持向量机SVM(Support Vector Machine) Ⅰ原创 Yu
- 2024-11-24 集成学习小介
- 2024-11-24 如何利用手机远训练机器学习模型
- 2024-11-24 使用SVC支持向量机算法来进行人脸识别的CNN神经网络训练
- 最近发表
-
- 使用Knative部署基于Spring Native的微服务
- 阿里p7大佬首次分享Spring Cloud学习笔记,带你从0搭建微服务
- ElasticSearch进阶篇之搞定在SpringBoot项目中的实战应用
- SpringCloud微服务架构实战:类目管理微服务开发
- SpringBoot+SpringCloud题目整理
- 《github精选系列》——SpringBoot 全家桶
- Springboot2.0学习2 超详细创建restful服务步骤
- SpringCloud系列:多模块聚合工程基本环境搭建「1」
- Spring Cloud Consul快速入门Demo
- Spring Cloud Contract快速入门Demo
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)