SVM、KNN、ANN、MLP、DT、Keras、Tensorflow处理糖尿病数据集分类⽬录
实验内容
针对提供的糖尿病数据集()中指定类别(0,1)完成分类
任务。
该糖尿病数据集来源于⼀个UCL机器学习数据库,其由768个数据点组成,各有9个属性:怀孕次数、⾎糖、⾎压、⽪脂厚度、胰岛素、BMI⾝体质量指数、糖尿病遗传函数、年龄以及结果。
其中“结果”是要预测的属性,0表⽰未患糖尿病,1表⽰患有糖尿病。在这768个数据点中,有500个被标记为0,268个被标记为1。要求使⽤提供样本的前60%作为训练样本,后40%作为测试样本,建⽴⼀个糖尿病的预测模型。注意训练模型时,不得使⽤测试样本,且样本的顺序不能变化。
可以采⽤任何分类算法及数据预处理⽅法。
算法原理与分析
SVM原理
SVM⽀持向量机,简单来说是⼀个有监督的⼆类分类器,其作为传统机器学习的⼀种通⽤的前馈神经⽹络,基本模型是在特征空间上到最佳的分离超平⾯使得训练集上正负样本间隔最⼤,在引⼊了核函数之后SVM也可⽤来解决⾮线性问题。
线性可分与不可分
线性可分:⼆维空间可以⽤⼀条直线将两类样本分开;⾼维空间则可以⽤⼀个⾼维函数分隔开。
线性不可分:通过⾼斯核函数将其映射到⾼维空间,将⾮线性转换为线性可分。
函数间隔与⼏何间隔
超平⾯分析与⼏何间隔详解
⼆次最优化
软间隔最⼤化
拉格朗⽇对偶化
核函数
KNN原理
k近邻算法原理
距离加权最近邻算法
距离
相似性⼀般⽤空间内两个点的距离来衡量,关于距离的度量⽅法常⽤的有:欧⼏⾥得距离、明考斯基距离,曼哈顿距离、马⽒距离等。
K值选取
K值,即选取的临近点个数,若K值过⼩,⼀旦有噪声成分存在将会对预测产⽣较⼤影响,K值的减⼩意味着整体模型变复杂,容易出现过拟合现象;若K值过⼤,就相当于⽤较⼤邻域中的训练实例进⾏预测,学习的近似误差会增⼤,这时与⽬标数据点较远实例也会产⽣作⽤,使预测发⽣错误,K值的增⼤意味着整体的模型变得简单。K的取值尽量要取奇数,⼀般情况下,K值会倾向选取较⼩的值,可以使⽤交叉验证法来选取最优K值。
消极学习与积极学习
(1)积极学习(Eager Learning)
这种学习是指在进⾏判断之前,先利⽤训练数据进⾏训练得到⼀定的模型或者⽬标函数,等到需要时就可以直接拿来进⾏决策,如神经⽹络、SVM、决策树以及贝叶斯分类。该学习⽅式考虑到了所有的训练样本,是⼀个全局的近似,需耗费训练⼀定训练时间,但其决策时间基本为0。
(2)消极学习(Lazy Learning)
这种学习只是简单地将训练样本存储起来,等到出现需要分类的新实例时分析其与所存储样例的关系后确定新实例的⽬标函数值,不存在之前的训练过程,如KNN算法、局部加权回归等。因其决策时虽需要计算所有样本与新实例的距离,但只⽤到了⼏个局部的训练数据,所以是⼀个局部近似,由于每次决策需要求⼀次与所有样本的距离,因此该⽅法需要⾜够⼤的存储空间且决策过程较慢。
DTtensorflow版本选择
树模型
决策树是⼀种从根节点逐步⾛到叶⼦节点的决策,既可以应⽤于分类也可以⽤于回归,叶⼦节点为最终的决策结果。
训练与测试
训练阶段是根据给定的数据集构造出⼀棵树,从根节点开始选择最有价值的特征切分节点;测试阶段则是根据构造出来的决策树模型⾛⼀遍。
特征切分的衡量标准
决策树算法
控制决策树的复杂度
通常来说,构造决策树直到所有叶节点都是纯叶⼦节点,这会导致模型⾮常复杂,并且对训练数据⾼度拟合。纯叶⼦节点的存在说明这棵树在训练集上的精度是100%,训练集中的每个数据点都位于分类正确的叶节点中。防⽌过拟合有两种常见的策略:
(1)预剪枝:及早停⽌树的⽣长,通过限制树的最⼤深度、限制叶⼦节点的最⼤数⽬或者规定⼀个节点中数据点的最⼩数⽬来防⽌其继续划分。
(2)后剪枝:先构造树,随后删除或折叠信息量很少的节点。
ANN
模型介绍
前向传播
反向传播
BP算法的特点与局限
需要⼀定量的历史数据(特征),通过历史数据的训练来学习从⽽进⾏分类、聚类、预测等,但其计算较复杂,速度⽐较慢,容易陷⼊局部最优解的局⾯。
实验设计
读取数据集
数据可视化
数据预处理
考虑到⼀些算法如神经⽹络和SVM对数据的缩放⾮常敏感,通常需要对特征进⾏调节,即对数据进⾏简单的按特征缩放和移动,从⽽使数据更加适合于这些算法。
其中涉及到python中sklearn库的StandardScaler和MinMaxScaler。
StandardScaler是使所有特征都位于同⼀量级,使每个特征的平均值为0、⽅差为1;MinMaxScaler是使所有的特征都位于0到1之间。归⼀化通常⽤于数据分化⽐较⼤的场景,即有的数值很⼤,有的数值很⼩,
通过数学函数将原始值进⾏映射,从⽽消除不同特征之间数值相差很⼤导致结果不同的因素,这样提⾼了迭代求解的收敛速度和精度,但同时数据也会失去原始的⼀些信息。
标准化即将每个特征的数值平均变为0,标准差变为1,使得不同度量之间的特征具有可⽐性,对⽬标函数的影响体现在⼏何分布上,⽽不是数值上,不改变原始的数据分布。这个⽅法被⼴泛应⽤在机器学习算法中,如SVM、逻辑回归和类神经⽹络,使每个特征都服从标准正态分布,从⽽消除每个特征分布不同导致结果不同的因素。
建⽴模型
使⽤python中sklearn库建⽴分类模型
使⽤Tensorflow建⽴分类模型
使⽤keras库建⽴分类模型
⾃制ANN和KNN模型
参数选择(模型评估)
KNN调参
这⾥KNN模型需要进⾏调整的是K的数值,即n_neighbors的个数,可以通过绘制训练精度和测试精度与不同K值得关系曲线图来出最合适的K值。
从上⾯的曲线图可以看出,在实际进⾏KNN模型训练时,K值过⼩时,相当于使⽤较⼩的邻域进⾏预测,如果邻居恰好是噪声点,会导致过拟合。随着K值不断增⼤,模型的训练精确度先增后减,第⼀次到达最⼤精确值是K=3,随着K值超过8或者9后,因距离较远的样本也会对预测起作⽤,所以导致预测错误,模型训练精度开始呈下降趋势,因此这⾥选择K=9。
SVM调参
SVM的模型具有两个重要的参数:⼀个是正则化参数C,其默认为1,限制了每个点的重要性,即对误差的容忍度,C越⾼,说明越不能容忍出现误差,容易过拟合,C越⼩,容易⽋拟合,因此C过⼤或过⼩,泛化能⼒变差;⼀个是gamma,默认其为特征个数的倒数,⽤于控制⾼斯核的宽度(这⾥的核函数⼀般选择“rbf”,即径向基函数),决定点与点之间“靠近”是指多⼤的距离,gamma越⼤,⽀持向量越少,存在训练准确率可以很⾼,⽽测试准确率不⾼的可能,就是通常说的过训练;gamma值越⼩,⽀持向量越多,则会造成平滑效应太⼤,⽆法在训练集上得到特别⾼的准确率,也会影响测试集的准确率。
先采⽤交叉⽹格验证,在设定的参数对中,选择出最好的参数对,但因该实验要求中样本的顺序不可以变化,在确定⼀个⼤概的范围后,还需要进⼀步的再次调参。
从表中可以看到起初时,测试集的精度略⾼于训练集,说明模型实际上还处于⼀个⽋拟合的状态,需要进⼀步地增⼤C和gamma的值,即增⼤模型的复杂度,当增⼤到⼀定的程度时,⼜看到训练集的精度开始⾼于测试集,则开始趋向过拟合状态,因此将本次与上次的参数设定进⾏折中处理,最后选定的C为55,gamma的值为1。
DT调参
决策树主要考虑的便是树的层数即深度,若不限制树的深度,树的深度很⼤导致叶⼦节点都是纯的,⾜以让记住训练数据的所有标签,出现过拟合的情况,泛化能⼒不佳,因此需要采取剪枝操作,可以设置max_depth,默认是None,即⾃动扩⼤到纯节点,这⾥设置的
max_depth为4.
MLP调参
多层感知器的分类需要估计⽹络的复杂度,即层数和每层的单元个数,可以先设置1或2个隐层,然后逐步增加到合适的值。
常⽤的调参⽅法:⾸先创建⼀个⼤到⾜以过拟合的⽹络,确保这个⽹络可以对任务进⾏学习,然后知道训练数据可以被学习之后,要么缩⼩⽹络,要么增⼤alpha来增强正则化,可以提⾼泛化性能。
其中参数solver:默认选项是“adam”,在⼤多数情况下效果都很好;“lbfgs”的鲁棒性相当好,但在⼤型模型或⼤型数据集上的时间会⽐较长;“sgd”许多深度学习研究⼈员都会⽤到。
经过增加神经元个数,增加迭代次数,设置适合学习率还有增⼤alpha参数值提⾼权值的正则化后,改变效果如下所⽰:
⾃制ANN调参
⾃制的神经⽹络需要对学习率、正则化系数、迭代次数参数进⾏调整。
根据上⾯MLP的先验经验,先设置隐藏层的节点个数为300个,表中是各情况下的预测精度。
由上表可知,最合适的学习率为0.001、正则系数0.0001,下⾯调整隐藏层节点的个数,增加复杂度使其更好地训练数据,从⽽更好地预测。
由上表可知选出的隐藏层节点个数为400,相应的迭代次数为25000。
以上的结果都是未加⼊数据预处理的,经过后续改进,加⼊数据标准化后,之前选出的各合适参数情况下的预测精度变为了0.8117,时间也缩短为364s。
Keras调参
利⽤Keras进⾏训练时,设置了三层dense,⼀层全连接层时,出现了过拟合情况,后来加⼊了在dense⾥⾯加⼊了正则项,并在每层dense后⾯添加了⼀个dropout层,有效地解决了过拟合情况,最终预测精度为0.7500。
数据预测
⾃制模型的预测
利⽤上⾯训练的模型进⾏预测,然后将预测的结果与真实样本实际分类值进⾏对⽐,正确个数与总个数的⽐即为预测的精度。
利⽤⾃带库的预测
通过python中的score函数,将预测的值和真实标签的值进⾏对⽐,最后再出相应的精度。
实验结果与分析
对于实验的结果这⾥⽤分类报告和混淆图来表现,利⽤的是sklearn中的库,调⽤代码如下所⽰:
分类报告中有精确率,召回率,f1率、各真实类别个数,预测精度、macro平均率和权重平均率。
准确率:被预测为正类样本中有多少是真正的正类,即P = TP/(TP+FP);
召回率:正类样本中有多少被预测为正类,即R = TP/(FN+TP);
f值,虽然准确率和召回率是⾮常重要的度量,但是仅查看⼆者之⼀⽆法提供完整的图景,将两种度量进⾏汇总的⼀种⽅法是f值,它是准确率与召回率的调和平均:F=2*(precision*recall) / (precision+recall),同时考虑了准确率和召回率,因此它对于不平衡的⼆分类数据集来说是⼀种⽐精度更好的度量。
分析:经过前⾯的数据预处理和参数选择之后,根据上⾯的分类报告可以看出后40%的数据样本,即308个预测样本(其中215个分类为0,93个分类为 1)应⽤不同模型时的预测精度;
从表格中可以看到⾃制ANN的精度最⾼为81.17%,其次是SVM和MLP的80.52%,再接着是KNN的77.92%,Tensorflow的77%,最后是Keras的75%和DT的74.68%,在⽤时⽅⾯因ANN、MLP、Keras和Tensorflow都涉及到了⽹络,还有⼤量的迭代次数,因此单位都是s,⽽其他分类模型采⽤的是ms为单位,且⽤时最多的是⾃制的ANN,达到300s多,是因为其中应⽤的是⾃⼰写的梯度下降函数以及前、⽅向传播函数,算法还需进⼀步优化,综合来看可以选择SVM和MLP,不仅分类效果较好,⽤时还较少,效率⾼。
从上⾯的混淆图可以看到真实样本为0或1,实际被分类为0或1的样本个数,⼤体来说,0的正确分类率⼤于1被正确分类的⽐率,是因为在460个训练样本(285个0样本,175个1样本)和308个预测样本(215个0样本,93个1样本)中,0和1样本分布个数不均匀,1的个数⼤概只有0个数的⼀半,即样本概率分布不均匀,造成样本数量1的不⾜,训练模型时不能够更好地刻画1的分类特征。
由于这次分类中涉及到8个属性,却只有868个数据样本,样本数据较少,所以⼀定程度上限制了精度的提⾼。