版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第14章
scikit-learn之数据建模
14.1scikit-learn模块功能介绍
14.2scikit-learn数据建模之线性回归
14.3scikit-learn数据建模之logistic回归
14.5scikit-learn数据建模之支持向量机
14.4scikit-learn数据建模之神经网络
14.6scikit-learn数据建模之数据聚类14.5scikit-learn数据建模之支持向量机
1995年,基于统计学习的理论基础发展出了一种新的通用学习方法-支持向量机(SVM,SupportVectorMachines)。支持向量机的提出,一举解决了第二代神经网络的结构选择和局部最小值(过拟合、欠拟合)等问题。以统计学习为理论基础的支持向量机被应用于机器学习的各个领域,称为最通用的万能分类器。
支持向量机是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器;支持向量机由于使用核技巧,使它称为实质上的非线性分类器。
支持向量机的学习策略是间隔最大化,它的学习算法是求解凸二次规划的最优化算法。现已被广泛地应用于文本分类、图像处理、语音识别、时间序列预测和函数估计等领域。14.5.1支持向量机的基本模型
定义14.5.1超平面:称下列点集为超平面,其中w为系数向量,z为标量。定义超平面的意义在于,它能将一个凸集分为两部分:设
为两非空集合,如果存在非零向量
及
,使得则称超平面
分离了集合
。14.5.1支持向量机的基本模型现给定样本数据集:
,学习的目标是在特征空间中找到一个分离超平面,能将实例分到不同的类。分离超平面对应于方程:
,它由法向量w和截距b决定,用激活函数表示为:一般来说,当数据集T线性可分时,存在无数个分离超平面,可将实例分到不同的类。我们希望求得一个最优超平面,或间隔最大的超平面。(14.5.1)14.5.1支持向量机的基本模型一般来说,一个点距离分离超平面的远近可以表示为分类预测的确信程度。在超平面确定的情况下,
能够相对地表示点x距离超平面的远近。样本空间中任意点x到超平面
的距离可写为:而
的符号与y的符号是否一致能够表示分类是否正确。故可用量:来表示分类的准确度。令(14.5.2)(14.5.3)14.5.1支持向量机的基本模型如图所示,满足(14.5.2)两个不等式中,等号成立的那些点,被称为“支持向量”(supportvector),两个异类支持向量到超平面的距离之和为:14.5.1支持向量机的基本模型这个和,我们称之为“间隔”(margin)。我们的目标是:找到一个划分超平面,使其“间隔”最大,即
最小化,同时满足(14.5.1)。于是(14.5.4)称为支持向量机(SVM)的基本模型。(14.5.4)这是一个约束优化问题。解决方法一般是,先构造一个拉格朗日函数,再通过对偶问题,将原约束优化问题转为对偶的无约束优化问题。14.5.2支持向量机的对偶问题首先构建拉格朗日函数。对(14.5.4)式中每一个不等式约束,引进拉格朗日乘子
,定义拉格朗日函数为:其中
。(14.5.5)根据拉格朗日对偶性,原始问题(14.5.4)的对偶问题是极大极小问题:(14.5.6)14.5.2支持向量机的对偶问题支持向量机(SVM)的基本模型:(原始问题)原始问题的对偶问题:(14.5.5)小结一下:样本数据集线性可分。
如何求模型中的参数:?14.5.2支持向量机的对偶问题(14.5.6)(1)求为了得到对偶问题的解,需要先求拉格朗日函数对w,b的极小,再求对
的极大。将拉格朗日函数分别对w,b的求偏导,并令其等于0,可得将上式代回到拉格朗日函数(14.5.5),得14.5.2支持向量机的对偶问题提取公因式并代入:14.5.2支持向量机的对偶问题(14.5.6)(2)求
对
的极大,即是对偶问题:(14.5.8)14.5.2支持向量机的对偶问题(14.5.6)将(14.5.8)式的目标函数由求极大转换成求极小,就得到与原始问题(14.5.4)等价的对偶最优化问题:(14.5.9)14.5.2支持向量机的对偶问题
定理14.1考虑线性可分问题,设
是对偶最优化问题(14.5.9)的最优解,则至少存在某个下标j,使得
,并可按下式求得原始函数最优化问题(14.5.4)对(w,b)的最优解:(14.5.10)由定理14.1知,分离超平面可以写成:分类决策函数可以写成:14.5.2支持向量机的对偶问题另外,对于任意训练样本
,总有
或
。若
,则该样本不会在分离超平面(14.5.11)的求和中出现,也不会对分类决策函数(14.5.12)有任何影响;若
,则必有
,所对应的样本点位于最大间隔边界上,是一个支持向量。这显示出支持向量机的一个重要性质:训练完成后,大部分的训练样本都不需要保留,最终模型仅与支持向量有关。综上所述,对于给定的线性可分训练数据集,可以首先求对偶最优化问题(14.5.9)的最优解
,再利用(14.5.10)求得原始问题的解:
,从而得到分离超平面及分类决策函数。这种算法称为线性可分支持向量机的对偶学习算法,是线性可分支持向量机学习的基本算法。14.5.2支持向量机的对偶问题如果给定的样本数据集
线性不可分,即不满足(14.5.4)的约束条件,此时训练数据中有一些奇异点(outlier)。为了解决这个问题,可以对每个样本点
引进一个松弛变量
,使函数间隔加上松弛变量大于等于1,这样,约束条件变为:同时,对对每个松弛变量,支付一个代价
,这样,目标函数变为:这里,C﹥0称为惩罚参数,一般应由问题决定,C值大时对误分类的惩罚增大,反之减少。上式包含两层含义:使
尽量小即间隔尽量大,同时使误分类点的个数尽量小,C是调和二者的系数。14.5.3非线性支持向量机与核函数非线性分类问题是指通过利用非线性模型才能很好地进行分类的问题。如:看下面的例子,图14-17,左图,是一个分类问题,红色菱形表示正实例点,蓝色圆表示负实例点。由图可见,无法用一条直线(线性模型)将正负实例点正确分开,但可以用一个椭圆曲线(非线性模型)将它们正确分开。通过映射,把这些点映射到球面上,则可找到一个平面,将这些点线性分开。14.5.3非线性支持向量机与核函数如果给定的样本数据集
线性不可分,但能够用
中的一个超曲面将正负实例正确分开,则称这个问题为非线性可分问题。
定义14.5.1核函数:设
为输入空间,
为特征空间(希尔伯特空间),如果存在一个从
到
的映射:使得
,函数K(x,z)满足则称K(x,z)为核函数,式中
为
和
的內积。14.5.3非线性支持向量机与核函数
常用核函数:(1)线性核:
(2)高斯核:(既可用于分类,也可用于回归)(3)sigmoid核:(4)多项式核:利用核函数,可以将线性分类的学习方法应用到非线性分类问题中去。此时,只需将线性支持向量机对偶形式中的內积换成核函数即可。14.5.3非线性支持向量机与核函数下面是非线性支持向量机的一般模型:学习得到的决策函数为:
分类:
,回归:支持向量机的最后一个问题:(14.5.9)的最优解
如何求解呢?不难发现,这是一个二次规划问题。人们提出了很多高效算法,其中非常著名的是序列最小优化算法(SequentialMinimalOptimization,SMO)。14.5.4利用sklearn.svm库构建支持向量机模型
SVM特别适用于小型复杂数据集,samples<100k。硬间隔分类有两个主要的问题:1)必须要线性可分;2)对异常值特别敏感,会导致不能很好的泛化或找不出硬间隔。使用软间隔分类可以解决硬间隔分类的两个主要问题,尽可能保存街道宽敞和限制间隔违例(即位于街道之上,甚至在错误一边的实例)之间找到良好的平衡。在Sklean的SVM类中,可以通过惩罚参数C来控制这个平衡,C值越小,则街道越宽,但是违例会越多,如果SVM模型过度拟合,可以试试通过降低C来进行正则化。
sklearn中SVM的算法库分为两类,一类是分类,包括SVC、
NuSVC、LinearSVC3个类。另一类是回归,包括SVR、NuSVR、LinearSVR3个类。相关的类都包裹在sklearn.svm模块之中。14.5.4利用sklearn.svm库构建支持向量机模型
分类函数SVC()参数及使用说明:
1)C:C-SVC的惩罚参数,默认值是1.0;
C越大,相当于惩罚松弛变量,希望松弛变量接近0,即对误分类的惩罚增大,趋向于对训练集全分对的情况,这样对训练集测试时准确率很高,但泛化能力弱。C值小,对误分类的惩罚减小,允许容错,将他们当成噪声点,泛化能力较强;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)14.5.4利用sklearn.svm库构建支持向量机模型
分类函数SVC()参数及使用说明:
2)kernel:核函数,默认是rbf,可以是‘linear’(线性核),‘poly’(多项式),‘rbf’(高斯核),‘sigmoid’(逻辑斯蒂),‘precomputed’(预先计算的);3)degree:多项式poly函数的维度,默认是3,选择其他核函数时会被忽略;4)gamma:‘rbf’,‘poly’和‘sigmoid’的核函数参数。默认是’auto’,则会选择1/n_features;5)coef0:核函数的常数项,对于‘poly’和‘sigmoid’有用;6)probability:是否采用概率估计,默认为False;7)shrinking:是否采用shrinkingheuristic方法,默认为true;14.5.4利用sklearn.svm库构建支持向量机模型
分类函数SVC()参数及使用说明:8)tol:停止训练的误差值大小,默认为1e-3;9)max_iter:最大迭代次数,-1为无限制;10)decision_function_shape:决策函数形状,‘ovo’(onevone,即将类别两两之间进行划分)、‘ovr’(onevrest,即一个类别与其他类别进行划分)、None,默认为default=None;11)random_state:数据清洗时的随机种子数,取int值;
主要调节的参数有:C、kernel、degree、gamma、coef0。14.5.4利用sklearn.svm库构建支持向量机模型
支持向量机回归函数SVR()参数及使用说明,其中核函数rbf,称为高斯径向基:
1)degree:int,多项式核函数的次数('poly'),默认=3,其他内核忽略;
3)tol
:
float,默认值=1e-3,容忍停止标准;sklearn.svm.SVR(kernel='rbf',degree=3,gamma='auto',
coef0=0.0,tol=0.001,C=1.0,epsilon=0.1,shrinking=True,
cache_size=200,verbose=False,max_iter=-1)
2)coef0
:
float,默认值0.0,核函数中的独立项。它在'poly'和'sigmoid'中重要;
4)cache_size
:
float,指定内核缓存的大小(以MB为单位);5)max_iter
:
int,求解器内迭代的最大迭代次数,默认值为-1表示无限制;14.5.4利用sklearn.svm库构建支持向量机模型
属性:1)support_:(array-like,shape=[n_SV])Indicesofsupportvectors;2)support_vectors_:(array-like,shape=[nSV,n_features])Supportvectors;3)dual_coef_:(array,shape=[1,n_SV])Coefficientsofthesupportvectorinthedecisionfunction;4)coef_:(array,shape=[1,n_features])Weightsassignedtothefeatures(coefficientsintheprimalproblem).Thisisonlyavailableinthecaseofalinearkernel.
coef_
isreadonlypropertyderivedfrom
dual_coef_
and
support_vectors_;5)intercept_:(array,shape=[1])Constantsindecisionfunction。
方法
:fit(X,y)
、predict(X)
、score(X,y)。14.5.4利用sklearn.svm库构建支持向量机模型例14-12用SVC对“鸢尾花数据集”多分类建模:建模思路:SVC对小样本的非线性多分类问题,建模结果比较理想,训练参数选择主要有:惩罚参数C、核函数kernel、核函数中的参数gamma、决策函数decision_function_shape。说明:在“鸢尾花数据集”150个数据中,第0类的50个数据与后100个数据是线性可分的,第1类的50个数据与第2类的50个数据,是非线性可分的。因此,该数据集是衡量一个分类算法优劣的尺子。
例14-12用SVC对“鸢尾花数据集”多分类建模1234567891011121314importnumpyasnp;importmatplotlib.pyplotaspltfromsklearnimportdatasets,metricsfromsklearn.svmimportSVC#支持向量机多分类fromsklearn.model_selectionimporttrain_test_splitiris=datasets.load_iris()x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target,test_size=0.2,random_state=0)p=[];c=np.arange(0.01,0.2,0.005)#惩罚参数
foriinnp.arange(len(c)):#对不同的惩罚参数进行迭代,观察对应的预测正确率#svc=SVC(C=c[i],kernel='linear',decision_function_shape='ovr')svc=SVC(C=c[i],kernel='rbf',gamma='auto',decision_function_shape='ovr')#分类决策:'ovr'svc.fit(x_train,y_train)#模型训练y_fit=svc.predict(x_test)#预测数据a_score=metrics.accuracy_score(y_test,y_fit)#预测正确率p.append(a_score)
例14-12用SVC对“鸢尾花数据集”多分类建模15161718192021plt.rcParams['font.sans-serif']='SimHei'#消除中文乱码plt.title('基于SVC的鸢尾花数据集多分类',fontsize=13)plt.xlabel('惩罚参数C');plt.ylabel('预测正确率')plt.plot(c,p);plt.show()d=svc.decision_function(x_test)#根据测试数据,计算对应的决策数组foriinrange(len(d)):#决策数组中,分量最大的维数为分类标签
print('决策向量函数:',d[i],'预测输出:',y_fit[i],'目标输出',y_test[i])调试时,kernel='linear'时,为线性核,C越大分类效果越好,但有可能会过拟合(defaulC=1);kernel='rbf'时,为高斯核,gamma值越小,分类界面越连续;gamma值越大,分类界面越“散”,分类效果越好,但有可能会过拟合。决策向量函数:[-0.212651031.013261122.2108132]预测输出:2
,
目标输出
2决策向量函数:[-0.208201622.227393770.89149869]预测输出:1
,
目标输出
1……
例14-12用SVC对“鸢尾花数据集”多分类建模从图可以看出,当惩罚参数C=0.135时,预测正确率:100%。14.5.5利用SVR进行回归预测:过拟合与股票预测有多种方法,可以对时间序列数据(如:人口增长数、国家GDP数、股票综合指数等)进行回归预测。支持向量机(SVM)是其中之一,它适用于小样本数据。SVM可以将输入向量X非线性映射到高维特征空间上,然后进行线性回归拟合,其核函数一般为高斯径向基函数,但里面的gamma(伽马参数)若取值太小(0.001),会造成欠拟合(即:训练拟合较差),而gamma若取值太大(0.9),又会造成过拟合(即:训练数据拟合非常好,但对未训练数据的拟合非常差)。高斯核:(既可用于分类,也可用于回归)gamma(伽马参数)14.5.5利用SVR进行回归预测:过拟合与股票预测例14-13文件“历年总人口、新生人口和死亡人口.csv”收集了我国部分地区1949-2019年的出生人口数、死亡人口数,数据来自“中国统计局”官网(具体数据见本章附件)。从2016年开始,出生人口数不断下降,而死亡人口数不断上升,按照目前的人口政策及社会的发展情况,有权威机构利用多种模型及方法,预测:再过八年左右,我国人口总数将达到峰值。下面简单用SVM模型,对人口出生数、死亡数进行回归建模。年份总人口(万)出生人口(万)死亡人口(万)净增人口(万)1949541671950108386719505519620429941048……………20161382711786977809201713900817239867372018139538152399353020191400051465998467
例14-13用SVM模型,对人口出生数、死亡数进行回归建模。建模思路:输入自变量x=0,1,…,67,因变量y分别用前68年(1949-2016)的出生人口数、死亡人口数进行SVR训练;然后根据已经训练好的模型参数,用自变量x=0,1,…,69,70进行输入测试,测试输出的人口数据,前68个数据为拟合,后3个数据为预测。训练过程中,设置核函数的伽马参数的不同取值,观察拟合情况。图14-19(a)人口数拟合及预测(gamma=0.001)
图14-19(b)人口数拟合及预测(gamma=0.9)预测人口数(欠拟合)过拟合:拟合好,预测差最后3年的人口数据没有参与训练。例14-13用SVM模型,对人口出生数、死亡数进行回归建模。123456789101112importpandasaspdimportnumpyasnpimportmatplotlib.pyplotaspltImportimageio#引入库,用于保存帧图像fromsklearn.svmimportSVRdf=pd.read_csv(‘d:\\历年总人口、新生人口和死亡人口.csv',encoding='gbk')year=np.array(df.iloc[0:72,0])#年份(1949-2019):获取df第0-71行、第0列的数据,返回一维数组y_data=np.array(df.iloc[0:72,2])#历年(1949-2019)出生人口数:获取df第0到71行、第2列的数据z_data=np.array(df.iloc[0:72,3])#历年(1949-2019)死亡人口数:获取df第0到71行、第3列的数据y_train=y_data[0:68]#出生训练数据:取前68年(1949-2016)的出生人口数,用于训练z_train=z_data[0:68]#死亡训练数据:取前68年(1949-2016)的死亡人口数,用于训练x_train=np.array(range(len(y_train)))#自变量训练数据:出生人口数下标为时间序列0,1,2,3,...例14-13用SVM模型,对人口出生数、死亡数进行回归建模。1314151617181920212223x_train=np.reshape(x_train,(-1,1))y_train=np.reshape(y_train,(-1,1))#将一维数组y_train变为二维数组:历年出生人口数z_train=np.reshape(z_train,(-1,1))#将一维数组z_train变为二维数组:历年出死亡口数x_test=np.array(range(len(y_data)))#将整个数据用于测试拟合x_test=np.reshape(x_test,(-1,1))f=plt.figure(figsize=(10,6),dpi=80)plt.rcParams['font.sans-serif']=['SimHei']#绘图时可以显示中文f.set_facecolor((0.92,0.92,0.96))#设置坐标轴颜色g=np.linspace(0.001,0.99,30)#从0.001到0.99,分30等份image_list=[]plt.ion()核函数的gamma(伽马参数)取不同值,观察拟合情况例14-13用SVM模型,对人口出生数、死亡数进行回归建模。24252627282930313233343536373839foriinrange(len(g)):#对核函数的伽马参数gamma的不同取值进行迭代
svr=SVR(C=1e3,kernel='rbf',gamma=g[i])#惩罚参数:C=1e3,核函数:kernel='rbf
svr.fit(x_train,y_train)#用出生人口数y_train模型训练
y_fit=svr.predict(x_test)#后面3年的出生人口数据没有用于训练,输出的为预测拟合
plt.cla()#清除原有图像
plt.title('核函数的参数伽马:'+str(g[i]),fontsize=22)plt.plot(x_test,y_data,color='b',marker='+')#实际历年出生人口数折线图
plt.plot(x_test,y_fit,color='r',linestyle=':',marker='o')#拟合历年出生人口数,后3年的数据为预测
svr.fit(x_train,z_train)#用死亡人口数z_train模型训练
z_fit=svr.predict(x_test)#后面3年的死亡人口数据没有用于训练,输出的为预测拟合
plt.plot(x_test,z_data,color='b',marker='+')#实际历年死亡人口数折线图
plt.plot(x_test,z_fit,color='g',linestyle=':',marker='o')#拟合历年死亡人口数,后3年的数据为预测
plt.xticks(range(0,len(year),5),year[0::5],rotation=45,fontsize=15)plt.legend(['实际出生人口数','预测出生人口数','实际死亡人口数','预测死亡人口数'],fontsize=12)plt.savefig('temp.png');plt.pause(1)#暂停0.2秒
image_list.append(imageio.imread('temp.png'))例14-13用SVM模型,对人口出生数、死亡数进行回归建模。4041plt.ioff()#关闭交互模式imageio.mimsave('d:\\SVR.gif',image_list,duration=1)#保存帧图像14.5.5利用SVR进行回归预测:过拟合与股票预测例14-14文件《A股沪市综合指数(20200101-20201224).csv》收集了我国A股沪市综合指数的收盘指数、每日涨幅(具体数据见本章附件)。用SVM模型,对沪市收盘指数进行回归建模。交易日期收盘指数拟合预测202001023085.23085.1202001033083.793083.7
202001063083.413083.3………202005072871.522871.6
202005082895.342895.2202005112894.82907.5202005122891.562907.1202005132898.052906.9
建模思路:先取前82天的收盘指数数据y,对应自变量输入x=0,1,…,82,进行SVR训练;然后根据已经训练好的模型参数,用自变量x=0,1,…,84,85进行输入测试,测试输出的收盘指数,前82个数据为拟合,后3个数据(没有参与训练)为预测。拟合预测例14-14用SVM模型,对沪市收盘指数进行回归建模。123456789101112importpandasaspd;importnumpyasnpimportmatplotlib.pyplotasplt;fromsklearn.svmimportSVRfromsklearnimportmetricsdf=pd.read_csv('d:\\A股沪市综合指数(20200101-20201224).csv',encoding='gbk')#---(1)加载数据d
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五版饭店租赁合同合同履行监督与评估机制2篇
- 2025年度大数据中心建设合同担保协议书范本2篇
- 2025年度楼顶广告牌拆除与建筑结构安全检测合同4篇
- 2025年度爱情承诺不分手情感修复与重建合同3篇
- 2025年度旅游客车租赁与景点门票联售合同4篇
- 2024-2025学年高中政治第二单元探索世界与追求真理第6课第2框在实践中追求和发展真理作业含解析新人教版必修4
- 2025年灵活就业劳动合同履行中的法律风险防范
- 2024配电工程施工承包合同
- 2025年度旅游纪念品开发与销售合同范本4篇
- 2025年度门禁系统智能识别技术研究与应用合同
- 2024年海口市选调生考试(行政职业能力测验)综合能力测试题及答案1套
- 六年级数学质量分析及改进措施
- 一年级下册数学口算题卡打印
- 2024年中科院心理咨询师新教材各单元考试题库大全-下(多选题部分)
- 真人cs基于信号发射的激光武器设计
- 【阅读提升】部编版语文五年级下册第三单元阅读要素解析 类文阅读课外阅读过关(含答案)
- 四年级上册递等式计算练习200题及答案
- 法院后勤部门述职报告
- 2024年国信证券招聘笔试参考题库附带答案详解
- 道医馆可行性报告
- 仙家送钱表文-文字打印版
评论
0/150
提交评论