《机器学习基础及应用》教案第9课使用支持向量机实现图像识别.docx
课题使用支持向量机实现图像识别课时2课时(90min)教学目标知识技能目标:(1)掌握线性可分数据的支持向量机分类原理(2)掌握线性不可分数据的支持向量机分类原理(3)了解支持向量机的回归原理(4)掌握支持向量机的Sklearn实现方法(5)掌握支持向量机的参数调节方法(6)能够使用支持向量机训练模型(7)能够编写程序,寻找支持向量机参数的最优值素质目标:了解时代新科技,激发学习兴趣和创新思维,增强民族自信心帮助学生树立履行时代使命的责任担当,激起学生报效祖国的理想情怀教学重难点教学重点:线性可分数据的支持向量机分类原理,线性不可分数据的支持向量机分类原理,支持向量机的回归原理,支持向量机的Sklearn实现方法,支持向量机的参数调节方法教学难点:使用支持向量机训练模型;能够编写程序,寻找支持向量机参数的最优值教学方法案例分析法、问答法、讨论法、i井授法教学用具电脑、投影仪、多媒体课件、教材教学过程主要教学内容及步骤课前任务【教师】布置课前任务,和学生负责人取得联系,让其提醒同学通过APP或其他学习软件,完成课前任务,提前了解使用支持向量机实现图像识别的相关知识【学生】完成课前任务考勤【教师】使用APP进行签到【学生】班干部报请假人员及原因问题导入【教师】提出以下问题:线性可分雌的支持向量机分类原理,支持向量机对线性不可分数据进行分类的原理是什么?支持向量机常用的核函数有哪些?【学生】思考、举手回答传授新知【教师】通过学生的回答引入要讲的知识,介绍支持向量机的基本原理、支持向量机的Sklearn实现等知识7.1 支持向量机的基本原理支持向量机(supportvectormachine,SVM)是一种应用非常广泛的机器学习模型,能够解决线性和非线性的分类与回归问题。从实际应用来看,支持向量机在各种实际问题中的表现都常优秀,其在人脸识别、文本和超文本分类、图像分割等领域都有着非常重要的地位。支持向量机非常适合解决复杂但数据集规模较小的分类问题.7.1.1 支持向量机的分类原理1.线性可分数据的支持向量机分类原理对于线性可分的数据,支持向量机对其进行分类的原理是,给定一个训练数据集,基于这个数据集在样本空间中找到一个分类超平面,将不同类别的样本分开.在二维空间中,超平面表现为线的形式.÷【教师】通过多媒体展示“数据样本点与分类超平面”图片(详见教材),并迸彳方并解有两类不同的样本数据Dl和D2,Dl用小正方形表示,D2用实心圆表示,支持向量机的分类方法就是在这组样本中找到一个分类超平面作为决策边界,决策边界一侧的所有样本在分类中属于一个类别,另一侧的所有样本在分类中属于另一个类别。÷【教师】通过多媒体展示“数据样本点与多个分类超平面”图片(详见教材),并进彳方并解可见,支持向量机最重要的任务是从样本空间中找到一个合适的分类超平面。在图7-1的数据分布中,很容易就能在小正方形和实心圆之间画出多个分类超平面。接下来通过计算寻找最合适的分类超平面。【教师】通过多媒体展示“支持向量与间隔”图片(详见教材),并进行讲解在分类任务中,样本数据点与决策边界(分类超平面)的距离越远,说明模型越好。然而在实际应用中,往往不需要计算所有样本数据点与决策边界的距离,而是计算离决策边界最近的样本数据点与决策边界的距离,如果这些样本数据点能分类正确,那么,其他样本数据点也能分类正确。在支持向量机中,通常把离分类超平面距离最近的样本数据点称为支持向量,而两个异类支持向量到分类超平面的距离之和称为分类超平面的间隔,通常记作L显然,离分类超平面距离最近的点到分类超平面的距离(间隔)d最大时对应的分类超平面就是最优分类超平面。因此,寻找最优分类超平面的过程就转化成了求间隔d的最大值的过程。只要计算出d的最大值,就能找到对应的分类超平面,这个分类超平面就是最优的分类超平面。在样本空间中,通常使用方程WTX+6=°来描述超平面。其中,"=(叫吗,町)为超平面的参数向量,决定了超平面的方向;X=(X,42,/)为特征向量;b为位移项,决定了超平面与原点之间的距离。那么,间隔d的计算公式可表示为2"二何其中为向量W的模长,模长表示向量在空间中的长度。求d的最大值,就是求Wl的最小值,为方便计算,通常把求解的最小值转化为求解以下公式的最小值。这个公式就是支持向量机分类模型的损失函数,求解该损失函数的最小值,一般需要先用拉格朗日函数将其转化为对偶问题,然后再使用序列最小优化(sequentialminimaloptimization,SMO)算法求解该对偶优化问题。【高手点拨】支持向量机分类模型的损失函数之所以要加上平方,是因为模长是一个带根号的式子,取平方是为了消除根号,方便求导。÷【教师】组织学生讨论以下问题:请同学们查阅相关资料,讨论什么是拉格朗日函数,什么是SMO算法。÷【学生】聆听、思考、讨论、回答计【教师】总结学生的回答2 .硬间隔与软间隔对于给定的线性可分训练样本数据集,上述SVM模型要求对任何训练样本都不能做出错误分类,这种构造SVM模型的方法称为硬间隔。可见,硬间隔对训练样本数据集的线性可分性要求非常严苛.而实际上,多数样本数据集中都会存在噪声数据,通常只能大致将两类样本用分类超平面分割,此时将无法完成SVM模型的构造。为解决上述问题,人们提出了一种软间隔构造SVM模型的方法。训练软间隔SVM模型时并不要求所有训练样本都能被正确分类,而是允许少量训练样本被错误分类。软间隔的实现方法是在模型优化过程中引入一个取值较小的非负松弛变量来放宽约束条件。松弛变量的取值越大,SVM模型对错误分类的容忍度越高.3 .线性不可分数据的支持向量机分类原理÷【教师】通过多媒体展示“线性不可分样本数据集“和“高维空间样本数据集”图片(详见教材),并进行讲解线性可分样本数据集,可使用上述线性支持向量机训练模型。然而,对于线性不可分的样本数据集就不能直接用线性支持向量机训练模型了,而需要使用核函数将样本数据点变换到适当的高维空间,使得样本数据点在高维空间中满足线性可分,并由此构造所需的SVM模型。核函数的思想可用现实生活中的实例进行类比。例如,桌上随意散放着一些绿豆和瓜子,这些绿豆和瓜子由于是杂乱摆放的,因此无法用一条直线将其分开;这时,可用力拍一下桌子,使得绿豆和瓜子都弹起来;由于绿豆弹得高一些,瓜子弹得低一些,它们弹起来的瞬间,可在空中加一个平面把它们分隔开。核函数的思想与这个实例相似,使用核函数可将线性不可分的数据集变换到高维空间,然后再通过支持向量机进行分类,将非线性问题转化为线性问题。支持向量机常用的核函数如表7-1所示。其中,多项式核函数和高斯径向基核函数(简称高斯核)是最常用的两种核函数。÷【教师】通过多媒体展示“支持向量机中常用的核函数”表格,介绍相关知识表7-1支持向量机中常用的核函数核函数含义适用场合参数linear()线性核函数蝌该核函数无参数polyO多项式核函数偏线性该核函数有3个参数,分别是gamma、degree和COe用rbf()高斯径向基核函数偏非线性该核函数的参数为gamma,这个参数的设置非常关键,如果设置过大,则整个高斯核会向线性核方向退化,向更高维度非线性投影的能力就会减弱;但如果设置过小,则会使得样本中噪声的影响加大,从而干扰最终SVM的有效性sigmoid()双曲正切核函数非线性该核函数有两个参数,分别是gamma和COeK)7.1.2支持向量机的回归原理支持向量机除了能够用于分类任务,还可以用于回归任务。回归任务研究的是一组变量与另一组变量之间的关系,其预测结果是连续的数值。支持向量机用于回归任务的原理是,给定一个训练数据集,基于这个数据集在样本空间中找到一个形如的回归模型,来拟合样本数据点,使得模型的预演随与样本真实值y尽可能接近,其中与b是待确定的模型参数.对于一般的回归算法,学习得到的模型的输出值与样本真实值y完全相同时,损失才为零;而支持向量机回归模型允许与y之间存在偏差£,当且仅当时,才计算损失,相当于以为中心,构建一个宽度为2£的间隔带(可将"宽度为2£的间隔带"理解为关于超平面的管道),若训练样本落入此间隔带,则认为预测正确。÷【教师】通过多媒体展示“支持向量机回归模型”图片(详见教材),并进行讲解在回归任务中,模型预测值与真实值越接近,说明模型越好,而支持向量机解决回归问题时,允许存在偏差,只需要计算I/*).£的样本点的损失.因此,支持向量机回归模型的损失函数须在分类模型的损失函数中加入该条件,于是有19mllH+C(,)-yJ其中,C为正则化常数为£不敏感损失函数Jc的取值为显然,损失函数最小时对应的W和b值即为最优参数值,对应的超平面即为最优超平面。求解该函数的最小值,与求解支持向量机分类模型损失函数最小值的方法类似,一股需要先用拉格朗日函数将其转化为对偶问题,然后再用SMO算法求解该对偶优化问题。【高手点拨】支持向量机回归模型也可使用核函数将非线性数据变换到适当的高维空间,然后在高维空间中构造最优超平面。÷【教师】讲解“素养之窗”的内容(详见教材),了解我国智能产业的发展7.2支持向量机的Sklearn实现7.2.1 Sklearn中的支持向量机模块Sklearn的svm模块提供了SVC类和SVR类,分别用于实现支持向量机分类和支持向量机回归。在Sklearn中,可通过下面语句导入支持向量机模块。fromsklearn.svmimportSVC#导入支持向量机分类模块fromsklearn.svmimportSVR#导入支持向量机回归模块SVC类和SVR类都有如下几个参数.(1)参数kernel用于指定核函数的类型,默认值为rbf(高斯径向基核函数),其他值有linear,poly,sigmoid和precomputed(用户预先计算好的核矩阵,输入后算法内部将用用户提供的矩阵进行计算).(2)参数degree表示多项式核函数的维度,默认值为3,选择其他核函数时该参数会被忽略。(3)参数gamma为核函数rgb()、PoIyO和SigmOido的参数,其取值决定了数据映射到新的特征空间后的分布。默认值为auto,表示其值是样本特征数的倒数。(4)参数C表示松弛系数的惩罚项系数,默认值为1.0如果C值设置得比较大,则模型预测准确率较高,泛化能力较弱;如果C值设置得比较小,则模型预测准确率会解氐,但是泛化能力会增强。(5)参数Coea)只针对POIyo和Sigmoido核函数,表示核函数的常数项。7.2.2 支持向量机参数的调节1 .使用核函数训练模型【例7-1】使用支持向量机的4种核函数(线性核函数、多项式核函数、高斯径向基核函数和双曲正切核函数)分别对Skleam自带的肺癌数据集进行分类,并除4种核函数的预测准确率。【程序分析】使用支持向量机对Skleam自带的肺癌数据集进行分类的步骤如下。(1)导入SkIeam自带的肺癌数据集,并杳看数据集中的数据。【参考代码】fromsklearn.datasetsimportload_breast_cancer#导入肺癌数据集fromsklearn.svmimportSVC#导入支持向量机分类模块fromsklearn.model_selectionimporttrain_test_splitimportnumpyasnpimportpandasaspdx,y=load_breast_cancer().data,load_breast_cancer().targetprint(x.shape)print(x)【运行结果】程序运行结果如图所示。可见,数据集中有569条数据,每条数据包含30个特征变量。(569,30)1.799e-K)l1.038e-K)l1.228e+O2.2.654e-014.GOle-Ol1.189e-012.057e-K)l1.777e-K)l1.329e+O2.1.8C0e-Ol2.750e-018.902e-021.969e-H)l2.125e-i1.3OOe+O2.2.430e-Ol3.613e-018.758e-021.6604l2.808401l.O83e+O2.1.418-012.218-017.820-022.060e>l2.933e-i1.4Ole+O2.2.650e-014.087e-011.240e-017.760e-t002.454eMl4.792e+01.O.OOOrHJO2.871e-017.039e-02(2)从图中可以看出,数据之间存在数据量纲(如第1行第3列数据与第1彳亍最后一列健差S巨较大,数据的数量级差距在I(X)倍以上)问题。因此,在训练模型之前,需要戏段据进行标准化处理。【参考代码】#数据标准化处理fromsklearn.preprocessingimportStandardScalerX=StandardScalerO.fit-transfbrm(x)print(x)【运行结果】程序运行结果如图所示.可见,数据标准化处理后,消除了数据的数量级差距。1.09706398-2.073335011.937014611.82982061-0.353632410.281189991.579888110.456186950.201391211.26993369.1.68595471.1.56650313.2.29607613.1.0870843.1.955000352.75062224-0.243889671.1522550.70228425-0.318409161.838341032.21963528-1.80840125-0.751206692.04557380.67267578.2.336457191.98252415.1.22179204-1.81438851.0.41406869.2.28998549.-1.74506282-1.104548951.91908301-0.04813821(3)分别选择支持向量机的4种核函数训练模型,并输出模型的预测准确率。【参考代码】份割数据集fromsklearn.metricsimportaccuracy-scorex_train.x_tes(,y_train,y_test=lrain_test_split(x,y,test_size=0.3.randoni_siate=420)Kemel=),linear',poly'V'rb,"sigmoid"forkernelinKernel:model=SVC(kemel=kemel,gamma="auto",degree=1)#设置多项式核函数的degree参数为1model.fit(x_train,y_train)Pred=model.predict(xjest)ac=accuracy_score(y_test,pred)Print("选择s核函数时,模型的预测准确率为%F'%(kernel,ac)【运行结果】程序运行结果如图所示。可见,使用线性核函数时,模型的预测准确率最高,故该数据集偏线性可分.选搔Iinear核困数时,模型的预测准确率为0.976608选怪P。Iy核函数时,模型的预测准确率为0964912选择rbf核函数时,模型的预测准确率为0.970760选择SigmOi戚函数时,模型的狡测准确率为0953216÷【教师】随机邀请学生回答以下问题:本例题中如果不进行数据预处理,结果会是什么呢?请同学们删除本例程序中的"数据预处理"代码,然后运行程序,观察其运行结果,并讨论为什么会出现这样的结果。计【学生】聆听、思考、回答÷【教师】总结学生的回答2.多项式核函数参数的调节多项式核函数的参数有3个,这3个参数共同影响其分类效果.在实际应用中,往往使用网格搜索法共同调节这3个参数。【例7-2使用支持向量机的多项式核函数对Skleam自带的肺癌数据集进行分类,并使用网格搜索法寻找参数的最优值。【程序分析】使用网格搜索法寻找多项式核函数参数的最优值并训练分类模型的步骤如下。(1)导入Sklearn自带的肺癌数据集,并对数据集进行数据标准化处理。【参考代码】fromsklearn.datasetsimportload_breast_cancer#导入肺癌数据集fromsklearn.svmimportSVC#导入支持向量机分类模块fromsklearn.model_selectionimportIrainJeSLSPIilimportnumpyasnpfromsklearn.preprocessingimportStandardScalerx,y=Ioad_breast_cancer().data,load_breast_cancer().targetX=StandardSCaIero.fit_transfbrm(x)#标准化姐里(2)使用网格搜索法找到多项式核函数参数的最优值,并使用该参数值训练模型,输出其预测准确率。【参考代码】fromskleam.model_selectionimportStratifiedshiiffleSplit#导入分层抽样方法fromSkleammodeLseleciionimportGridSearchCV#导入网格搜索方法gamma_range=np.logspace(-10,1,20)coefD-range=np.linspace(0,5,10)param_grid=dict(gamma=gamma_range,coeft)=coefD_range)cv=StratifiedShuffleSplit(n_splits=5,test_size=0.3,random_state=420)#对样本进行分层抽样grid=GridSearchCV(SVC(kemel="poly",degree=1),param_grid=param_grid,cv=cv)#使用网格搜索法寻找参数的最优值grid.fit(x,y)Print值为:%s"%grid.best_params_)Print("选取该参数值时,模型的预测准确率为:%f'%grid.best_score_)【运行结果】程序运行结果如图所示。可见,网格搜索给出了多项式核函数的最优参数值,以及模型的预测准确率。模型的预测准确率较调参前略有提高,但整体分数还是没有超过线性核函数的预测准确率。【程序说明】Iogspace(StaEstopmum)函数可用于构造等比数列,其中,参数start表示数列的开始项为10的start次幕,参数stop表示数列的结束项为IO的stop次鬲,参数num表示数列的元素个数;np.linspace(Start,stop,num)函数可用于构造等差数列,其中,参数start表示数列的开始项,参数stop表示数列的结束项,参数num表示数列的元素个数;StratifiedShUffIeSPIit(n_splits=5,test_size=0.3,random_state=42()函数用于对样本进行分层抽样,其中,参数n.splits表示将训练数据分成train/test对的组数,可根据需要进行设置,默认值为10,参数test,size用于设置train/test对中train和test所占的比例,参数random.statc为随机数种子,其值设定为f值,表示每次抽到的样本数据相同;GridSearchCV(SVC(kemel="poly",degree=1,),param_grid=param_grid,cv=cv)函数表示使用网格搜索法进行参数调节,其中,第一个参数表示选用的分类算法,参数ParamYrid表示需要优化的参数的取值,其值为字典或列表类型,参数CV表示交叉验证参数。【高手点拨】多项式核函数参数degree的默认值为3,表示核函数的阶数为3,此时计算耗时非常长。因此,本例题中将其值设置为I(表示多项式核只能进行线性分类),不再对其进行参数调节。3.高斯径向基核函数参数的调节【例7-3使用支持向量机的高斯径向基核函数对SkIeam自带的肺癌数据集进行分类,并寻找高斯径向基核函数参数gamma的最优值。【程序分析】寻找高斯径向基核函数参数gamma的最优值并训练分类模型的步骤如下。(1)导入Sklearn自带的肺癌数据集,并对数据集进行数据标准化处理(参考代码与例7-2相应步骤的参考代码相同,此处不再赘述).(2)寻找高斯径向基核函数参数gamma的最优值,并且使用该参数值训练模型,输出其预测准确率。【参考代码】fromSklearnjnetricsimportaccuracy_scoreimportmatplotlib.pyplotaspitx_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3,random_state=420)#分割数据集score=gamma_range=np.logspace(-10,1,50)foriingamma_range:model=SVC(kemel='rbf,gamma=i)model.fit(x_train,y_train)pred=model.predict(x_test)ac=accuracy_score(y_test,pred)score.append(ac)#画曲线图,横轴为gamma值,纵轴为对应模型的预测准确率plt.plot(gamma_range,score)plt.show()#输出模型的最大预测准确率与对应的gamma值PrinU"参数gamma的最优值为:%s"%gamma_rangescore.index(max(score)Print("选取该参数值时,模型的预测准确率为:%f1%max(score)【运行结果】程序运行结果如图所示。可见,高斯径向基核函数的最高预测准确率约为97.66%,与线性核函数达到了相同的水平,此时gamma参数的取值约为0.012,一般来说,gamma的取值越大,模型越复杂,更容易出现过拟合现象,泛化能力越差。0.95 -0.90-0.85 0.80 -0.75-0.70-0.65-0.60-O2468IO参数ga0na的最优值为:0.012067926406393264选取该参数值时,模型的预刘准确率为:0.9766084.松弛系数惩罚项C的调节在实际应用中,松弛系数惩罚项C与核函数的相关参数(gamma.CoeK)或degree)往往搭配在一起进行调节,这是支持向量机模型调参的重点。通常情况下,C的默认值1是一个除合理的参数。如果数据的噪声点很多,一般要减小C的值,当然也可以使用网格搜索法或学习曲线来调整C的值。【例7-4使用支持向量机的线性核函数与高斯径向基核函数对肺癌数据集进行分类,并分别寻找两个模型中松弛系数惩罚项C的最优值。【程序分析】寻找松弛系数惩罚项C的最优值并使用支持向量机的线性核函数与高斯径向基核函数训练模型的步骤如下。(1)导入Sklearn自带的肺癌数据集,并对数据集进行数据标准化处理(参考代码与例7-2相应步骤的参考代码相同,此处不再赘述).(2)使用支持向量机的线性核函数训练模型,寻找最优的C值,并输出模型的预测准确率。【参考代码】fromskleam.metricsimportaccuracy_scoreimportmatplotlib.pyplotaspitx_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3,random_state=420)#分割数据集score=C_range=np.linspace(0.01,30.50)foriinC-range:model=SVC(kernel=,linear,.C=i)model.fit(x_train,y_train)pred=model.predict(x_iest)ac=accuracy_score(y_iest,pred)score,append(ac)#画曲线图,横轴为C值,纵轴为对应模型的预测准确率plt.plot(C_range,score)plt.show()#输出模型的最大预测准确率与对应的C值Prin1("模型的最优C值为:%s"%C_rangescore.index(max(score)Print("模型选取该参数时的预测准确率为:%f,%max(score)【运行结果】程序运行结果如图7-13与图7-14所示.可见,当C值约为1.2341时,线性核函数的分类准确率最高,达到了约97.66%。模型选取该参数时的预测准确率为:0.976608(3)使用支持向量机的高斯径向基核函数训练模型,寻找最优的C值,并输出模型的预测准确率e将步骤(2)参考代码中的"model=SVC(kernel='linearC=i)"修改为,model=SVC(kemel="rbf,C=i.gamma=0.01207)rt,然后运行【运行结果】程序运行结果如图所示.可见,当C值约为6.7424时,高斯径向基核函数模型的预测准确率达到最大值,约为98.25%,这个值超过了线性核函数模型的最高预测准确率。模型的最优C值为:6.7424489795918365模型选取该参数时的预测准确率为:0.982456【高手点拨】支持向量机的几种核函数在实际应用中的性能表现:(1)线性核函数与多项式核函数在数据中的表现很不稳定,如果数据相对线性可分,则表现不错;如果数据像环形数据那样彻底不可分,则表现很糟糕。(2)双曲正切核函数在非线性数据中的表现比以上两个核函数好一些,但效果不如高斯径向基核函数,在线性数据上完全比不了线性核函数,故很少使用。(3)高斯径向基核函数在任何数据集上都表现不错。因此,在训练支持向量机模型时,应先尝试使用高斯径向基核函数,如果高斯径向基核函数的表现不好,再尝试其他核函数。【学生】聆听、思考、理解,记录课堂实践【教师】介绍“使用支持向星机实现人脸识别”项目的大概流程,安排学生扫描微课二维码观看视频"数据准备”数据降维处理”“训练与评估模型”和”显示分类结果“(详见教材),并进彳瑙解和演示1 .数据准备步骤1导入Sklearn自带的名人人脸照片数据集步骤2选取最少有60张照片的名人作为数据集步骤3获取最少有60张照片的名人的姓名和照片尺寸,并将其输出(详见教材)2 .数据降维处理步骤1导入主成分分析(principalcomponentanalysis,PCA)降维算法步骤2对数据集进行降维处理,维度降低到150个步骤3以3行5列的形式显示降维后的部分照片.(详见教材)3 .训I练与评!魏型步骤1将降维处理后数据集拆分为训练集与测试集步骤2使用网格搜索法寻找支持向量机中高斯径向基核函数参数gamma与模型松弛系数惩罚项C的最优值.(详见教材)4 .显示分类结果步骤1创建一个4行6列的画布步骤2使用imshow()函数在画布中绘制图像步骤3显示模型的预测姓名,预测正确显示为黑色文字,预测错误显示为黑色加边框文字(详见教材)【学生】参照教师的演示进行操作,如遇问题可询问老师【教师】巡堂辅导,及时解决学生遇到的问题课堂小结【教师】简要总结本节课的要点支持向量机的基本原理支持向量机的Skleam实现使用支持向量机实现人脸识别【学生】总结回顾知识点作业布置【教师】布置课后作业请根据课堂知识,完成本章项目实训和项目考核中与本次课程有关的题目。【学生】完成课后任务教学反思