
机器学习SVM(支持向量机)实验报告.docx
9页实验报告实验名称:机器学习:线性支持向量机算法实现学 员: 张麻子 学 号: ***********培养类型: 硕士 年 级: 专 业: 所属学院: 计算机学院扌指导教员: ****** 职 称: 副教授 实验室: 实验日期: —一、实验目的和要求实验目的:验证SVM (支持向量机)机器学习算法学习情况要求:自主完成二、实验内容和原理支持向量机(Support Vector Machine, SVM)的基本模型是在特征空间上找到 最佳的分离超平面使得训练集上正负样本间隔最大SVM是用来解决二分类问题的 有监督学习算法通过引入了核方法之后SVM也可以用来解决非线性问题但本次实验只针对线性二分类问题SVM 算法分割原则:最小间距最大化,即找距离分割超平面最近的有效点距离 超平面距离和最大对于线性问题:■J.x | 二 0假设存在超平面可最优分割样本集为两类,则样本集到超平面距离为 「叭+虬 aP =旳=而需压求取:由于该问题为对偶问题,可变换为min^llwll2亠, y, i 7 j'.:- I可用拉格朗日乘数法求解但由于本实验中的数据集不可以完美的分为两类,即存在躁点可引入正则化参数C,用来调节模型的复杂度和训练误差。
作出对应的拉格朗日乘式:对应的KKT条件为:=必=工X]他丫讯=5Xi 创=°4十金=C=> q V yf (疳 丁旳-叭=、_ &=> /3; = 0 V = 0— Cj —刀二I u疥凶=0刃 £ = - E^l = o\ — C — ol[ — 3iVi %(M ©% 4-&1-1 + 6l = 0,Vi 鞋=0故得出需求解的对偶问题:a ia ■yj(xlxj)■ 1S. t. Y a iyj = o , c MM 0,本次实验使用python编译器,编写程序,数据集共有2 7 0个案例,挑选其中 70%作为训练数据,剩下30%作为测试数据进行了两个实验,一个是取C值为1, 直接进行SVM训练;另外一个是利用交叉验证方法,求取在前面情况下的最优C 值三、 实验器材实验环境:windows7操作系统+python编译器四、 实验数据(关键源码附后)实验数据:来自UCI机器学习数据库,以Heart Disease数据集为例五、 操作方法与实验步骤1、选取C=l,训练比例7:3,利用3yt hon库sklearn下的SVM ()函数进 行训练,后对测试集进行测试;2、选取训练比例7:3,C=, 1, 30)}。
利用交叉验证方法求出C值的最优解六、实验结果与分析实验一得出结果:C値:1训拣集正确率:0. S6^72^S6772'18677 测试集正确率:0. 82"16049382"1605删试集预测结果: L1. 1. 2. 2. 1.1. 1.1.1. L. 1.2.2. 2.2.1.1. 2.2. 1.2. 1.2. 2.1. 1, 1. 1. 1.2, 1.1.2, L 2.2.2. 2.1.1.2. 1.1. 2.1. 1,2. 1.2. 2. 2. 2. 1.1. 2.1.1. 2. 1.2.1. 1.1.1.1. 2.2. 2.1. 1.1. 1.2. 1. 2. 1. 2.1. 1.2.2.]LE1. 1, 1. 2. 1.1. 2.1.1. 1. 1.1,1. 2,2.L1. 2.& 2.2. 1.2. 1.2. 1. 1. 1. 1.2. 1.1.2. 1. 2.2.2. 2.1.2.2. 1.1. 2.1. 2.1. 1.2. 2. 2. 1. 1.2. 1.1.1. 2. 1.2.L. 1.1.1.1. 2.1. 2.1. 1.1. 1.2. 1. 2. 1. 2.1. 1.2.2.]]可见,训练集的正确率是0.,小于1,说明训练集存在躁点,需要选择性的排出,才能得到较好的训练效果,测试集正确率达到了,还须进一步提高。
实验二得出结果:最优参数;{'C' : 0. 0&90536206S96551S, 'kernel': 'linear'}precisionrecallfl-scoresupport1. 00. ST0.550. S64S2. 00. 790.820. 8133avg / total0. 840.840. 8481可见,在上述情况下,当时,可得到较好的训练效果七、问题与建议 (可选)本次实验只是对SVM性空间的应用,还有非线性问题,多分类问题等通过研究了解到,对于非线性问题,需要加入核函数;对于多分类问题,需要重新 调整模型八、附录(源代码)import numpy as npimport pandas as pdimport as pltimport matplotlib as mplfrom sklearn import svmfrom import train_test_split, GridSearchCVfrom import classification_report def LoadData(path):data = (path, dtype =B^!g[, delimite =)return data def Once_SVM(data, c=, train_rate二:x, y = (data, (13,), axis=1)x_train, x_test, y_train, y_test 二 train_test_split(x y, random_stat =0, train_siz 二train_rate)elf = (C=c, kernel 二'linear', decision_func tio n_shap 二'ovo') (x_t rain,())print(u'C 值:’,c)print(u'训练集正确率:',(x_train, y_train)) # 精度print(u'测试集正确率:',(x_test, y_test))prin t(u'测试集预测结果:')y_hat 二(x_test)print(y_hat)print (u'测试集真实结果:')prin tdef HmmmmSVM(da ta,x, y = (data, (13,), axis=1)x_train, x_test, y_train, y_test 二 train_test_split(x y, random_stat =0, train_siz 二train_rate)tuned_parameters = [{kernel': ['linear'], 'C': , 1, 30)}]#构造这个GridSearch的分类器,5-foldelf = GridSearchCV(), tuned_parameters, cv=5, scorir 二'accuracy')(x_t rain,())print (u'最优参数:')prin ty_true, y_pred = y_test, (x_test)print(classification_report(y_truq y_pred))if __name__ == __main__ :data = LoadDa ta(u'D:/ 研究生课程/机器学习 /ML_da ta/')Once_SVM(da ta, 1,CrossValidation_SVM(data。
