一.实验目的
1.巩固4种基本的分类算法的算法思想:朴素贝叶斯算法,决策树算法,人工神经网络,支持向量机算法;
2.能够使用现有的分类器算法代码进行分类操作
3.学习如何调节算法的参数以提高分类性能;
二、实验的硬件、软件平台
硬件:计算机
软件:操作系统:WINDOWS 2000
应用软件:C,Java或者Matlab,Weka
三、实验内容及步骤
利用现有的分类器算法对文本数据集进行分类
实验步骤:
1.了解文本数据集的情况并阅读算法代码说明文档;
2.利用文本数据集中的训练数据对算法进行参数学习;
3.利用学习的分类器对测试数据集进行测试;
4.统计测试结果;
四、思考题
1.如何在参数学习或者其他方面提高算法的分类性能?
五、使用WeKa进行问题求解
数据分析
可视化数据集
我们发现只有第6列的图形存在4种颜色且各种颜色之间具有明显的分类边界,因此Class_Values可以作为我们进行分类的类别。
特征分析
从上面的结果可知:
数据集存在7中特征,使用Class_Values作为类别划分的特征。
由此我们得知,我们可以对数据集可以使用分类算法,使用Class_Values作为类别划分的特征,并且存在4种类别。
测试类型
朴素贝叶斯算法
朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法。训练的时候,学习输入输出的联合概率分布;分类的时候,利用贝叶斯定理计算后验概率最大的输出。
贝叶斯公式
贝叶斯定理之所以有用,是因为我们在生活中经常遇到这种情况:我们可以很容易直接得出P(A|B),P(B|A)则很难直接得出,但我们更关心P(B|A),贝叶斯定理就为我们打通从P(A|B)获得P(B|A)的道路。
下面不加证明地直接给出贝叶斯公式:
换个表达形式就会明朗很多,如下:
条件独立性
设输入空间输入空间为n维向量的集合,输出空间为类标记集合输出空间y={c1……ck}。输入特征向量x和输出类标记y分属于这两个集合。X是输入空间上的随机变量,Y是输出空间上的随机变量。P(X,Y)是X和Y的联合概率分布,训练数据集
以及条件概率分布:
于是根据联合概率分布密度函数:
学习到联合概率分布P(X,Y)。
而条件概率分布条件概率分布的参数数量是指数级的,也就是X和Y的组合很多,假设xj可能取值Sj个,Y可能取值有K个,那么参数的个数是参数个数。特别地,取xj=S,那么参数个数为KSn,当维数n很大的时候,就会发生维数灾难。如下图:
这种指数级的复杂度增长被称为维数灾难。
为了计算它,朴素贝叶斯法对它做了条件独立性的假设:
也就是各个维度的特征在类确定的情况下都是独立分布的。这一假设简化了计算,也牺牲了一定的分类准确率。
朴素贝叶斯算法
基于条件独立性假设,以及贝叶斯公式,得到后验概率为:
将独立性假设代入上式,得到:
朴素贝叶斯分类器可以表示为:
也就是给定参数,找一个概率最大的ck出来。注意到上式分母其实就是P(X=x),x给定了就固定了,跟ck一点关系都没有,所以分母可以去掉,得到:
极大似然估计
前面说过,朴素贝叶斯法要学习的东西就是P(Y=ck)和P(X=x|Y=ck),这两个概率的估计用极大似然估计法(简单讲,就是用样本猜测模型参数,或者说使得似然函数最大的参数)进行:
也就是用样本中ck的出现次数除以样本容量。
分子是样本中变量组合的出现次数,分母是上面说过的样本中ck的出现次数。
分类算法
先从训练数据中计算先验概率和条件概率,然后对于给定的实例计算最大的条件概率,输出该条件对应的类别。形式化的描述如下:
实验结果(使用NaiveBayes算法)
正确率:
87.0949%
运行时间
0s
决策树算法
决策树学习算法包含特征选择、决策树的生成与剪枝过程。决策树的学习算法一般是递归地选择最优特征,并用最优特征对数据集进行分割。开始时,构建根节点,选择最优特征,该特征有几种值就分割为几个子集,每个子集分别递归调用此方法,返回节点,返回的节点就是上一层的子节点。直到数据集为空,或者数据集只有一维特征为止。
不同的决策树算法使用不同特征选择方式。比如:
ID3 算法选择信息增益最大的特征进行划分
C4.5 算法选择信息增益比最大的特征进行划分
CART算法选择基尼指数最大的特征进行划分
本次实验选择J48算法(C4.5算法)进行求解。
信息熵
对于一个可能有n种取值的随机变量:
其熵为:
X的熵与X的值无关,只与分布有关,所以也可以将X的熵记作H(p),即:
条件熵H(Y|X)
表示在已知随机变量X的条件下随机变量Y的不确定性,定义为在X给定的条件下,Y的条件概率分布对X的数学期望:
信息增益
信息增益表示得知特征X的信息而使类Y的信息的熵减少的程度。形式化的定义如下:
信息增益比
C4.5 算法
实验结果(使用J48算法)
正确率:
96.2936%
模型建立时间
0.05s
可视化决策树
人工神经网络
人工神经网络简介
人工神经网络由三部分组成:
- 架构:描述神经元的层次与连接神经元的结构
- 激励函数
- 找出最优权重值的学习算法
人工神经网络主要类型:
1. 前馈神经网络:最常用的神经网络类型,一般定义为有向无环图,信号只能沿着最终出入的那个方向传播
2. 反馈神经网络:网络图中有环.反馈环表示网络的一种内部状态
多层感知器
多层感知器(multilayer perceptron,MLP)是最流行的人工神经网络之一。它的名称不太恰当,多层感知器并非指单个带有多个层次的感知器,而是指可以是感知器的人工神经元组成的多个层次。MPL的层次结构是一个有向无环图。通常,每一层都全连接到下一层,某一层上的每个人工神经元的输出成为下一层若干人工神经元的输入。MLP至少有三层人工神经元。网络结构如下,分为输入,隐层与输出层:
激励函数
隐藏层中的人工神经元,也称单元,通常用非线性激励函数,如双曲正切函数和逻辑函数:
f(x)=tanh(x)
f(x)=1/(1+e^(-x))
成本函数
和其他监督模型一样,目标是找到成本函数最小化的权重值,通常,mlp的成本函数是残差平方和的均值,计算公式如下:
成本函数最小化
反向传播(backpropagation)算法经常用来连接优化算法求解成本函数最小化问题,比如梯度下降法。这个算法名称是反向(back)和传播(propagation)的合成词,是指误差在网络层的流向。理论上,反向传播可以用于训练具有任意层、任意数量隐藏单元的前馈人工神经网络,但是计算能力的实际限制会约束反向传播的能力。
BP算法
前向传播
在前向传播(forward propagation)阶段,特征变量被输入到网络,然后传播到下一层产生输出激励(activation)。首先,我们计算Hidden1单元的激励。我们找到Hidden1单元的的加权和,然后用激励函数处理输入的加权和。注意Hidden1单元会收到一个常误差项输入单元,并没有在下图中画出。其中 g(x)是一个激励函数:
然后,我们计算第二个隐藏单元Hidden2。和Hidden1类似,它也会收到一个常误差项输入单元。我们计算输入单元的加权和,或成为预激励,经过激励函数处理的激励如下图所示:
同理,我们计算第三个隐藏单元Hidden3的激励:
第一个隐藏层三个隐藏单元的激励计算完之后,我们再处理第二个隐藏层。本例中,第一个隐藏层第一个隐藏层到第二个隐藏层。与第一个隐藏层三个隐藏单元计算过程类似,都有一个常误差项输入单元.
当第二个隐藏层三个隐藏单元的激励计算完成后,我们计算输出层。Output1的激励是第二个隐藏层三个隐藏单元的激励的加权和经过激励函数处理的结果。类似与隐藏单元,有一个常误差项的输入单元,如下图所示:
同理,我们可以计算第二个输出单元Output2的激励。
计算完神经网络中所有单元的激励之后,我们就完成了前向传播过程。用这些随机生成的权重值是不可能很好的近似网络的真实函数的。我们必须更新权重值来生成一个更好的近似函数。
反向传播
我们把输出单元计算的误差作为网络误差。隐藏单元表示不可见的变量;没有数据可以进行对照,因此我们无法度量隐藏单元。为了更新权重,我们必须把网络的误差反向传回。于是,我们先从Output1输出单元开始。其误差等于真实值与预测值的差,乘以激励函数对Output1输出单元的偏导数:
算完输出层的误差之后,我们把误差传回第二个隐藏层。首先,我们计算Hidden4的误差。把Output1的误差乘以连接Hidden4与Output1的权重,再Output2的误差乘以连接Hidden4与Output2的权重,再把它们相加就得到了Hidden4的误差:
算完第一个隐藏层的误差之后,我们用这些误差来升级权重值。首先升级连接输入单元与Hidden1的边的权重,以及连接常误差项与Hidden1的边的权重。我们将连接Input1与Hidden1的边的权重Weight1增加学习速率,Hidden1的误差以及Input1的值的乘积。
按同样的方法处理权重Weight2,我们把学习速率,Hidden1的误差以及Input2的值的乘积增加到Weight2。最后,我们计算常误差项输入的权重,把学习速率,Hidden1的误差以及常误差项的值1的乘积增加到常误差项输入的权重,如下图所示:
使用同样的方法更新其它权重。这个阶段网络权重的更新工作就完成了。我们现在可以用心的权重再运行一遍前向传播,成本函数的值应该会减少。重复这个过程直到模型收敛或者停止条件得到了满足为止。与之前我们介绍过的线性模型不同,反向传播不能优化凸函数。反向传播可能用某个局部最小值的参数值达到收敛,而不是全局最小值。实际应用中,局部最小值通常可以解决问题。
实验结果(使用MLP算法)
正确率:
100%
运行时间
5.06s
可视化神经网络
支持向量机算法
线性可分支持向量机:
假设给定一个特征空间上的训练数据集
学习的目标是在特征空间中找到一个分离超平面,能将实例分到不同的类。分离超平面对应于方程法向量方程它由法向量w和截距b决定,可用(w,b) 来表示。分离超平面将特征空间划分为两部分,一部分是正类,一部分是负类。法向量指向的一侧为正类,另一侧为负类。
一般地,当训练数据集线性可分时,存在无穷个分离超平面可将两类数据正确分开。感知机利用误分类最小的策略,求得分离超平面,不过这时的解有无穷多个。线性可分支持向量机利用间隔最大化求最优分离超平面,这时,解是唯一的。
给定线性可分训练数据集,通过间隔最大化或等价地求解相应的凸二次规划问题学习得到的分离超平面为:
以及相应的分类决策函数 :
称为线性可分支持向量机。
考虑如图所示的二维特征空间中的分类问题。图中“。”表示正例,“x ”表示负例。训练数据集线性可分,这时有许多直线能将两类数据正确划分。线性可分支持向量机对应着将两类数据正确划分并且间隔最大的直线,如图所示。
函数间隔和几何间隔
对于给定的训练数据集T和超平面(w,b),定义超平 面(w,b)关于样本点(xi,yi)的函数间隔为
定义超平面(w,b)关于训练数据集T的函数间隔为超平面(w,b)关于T中所有样本点样本点.png的函数间隔之最小值,即
函数间隔可以表示分类预测的正确性及确信度。但是当我们成比例地改变w和b,例如将它们改为2w和2b,超平面并没有改变,但函数间隔却成为原来的2倍。这一事实启示我们,函数间隔不能用作间隔最大化的标准。
于是得到几何间隔
对于给定的训练数据集T和超平面(w,b),定义超平 面(w,b)关于样本点样本点的几何间隔为
所以同样可以得到数据集的几何间隔为:
我们发现函数间隔与集合间隔具有如下关系:
当我们成倍地增加w和b的值时,超平面并不会改变。
间隔最大化
支持向量机学习的基本想法是求解能够正确划分训练数据集并且几何间隔最大的分离超平面。对线性可分的训练数据集而言,线性可分分离超平面有无穷多个(等价于感知机),但是几何间隔最大的分离超平面是唯一的。这里的间隔最大化又称为硬间隔最大化(与将要讨论的训练数据集近似线性可分时的软间隔最大化相对应)。
间隔最大化的直观解释是:对训练数据集找到几何间隔最大的超平面意味着以充分大的确信度对训练数据进行分类。也就是说,不仅将正负实例点分开,而且对最难分的实例点(离超平面最近的点)也有足够大的确信度将它们分开。这样的超平面应该对未知的新实例有很好的分类预测能力。
1、最大间隔分离超平面
下面考虑如何求得一个几何间隔最大的分离超平面,即最大间隔分离超平面。具体地,这个问题可以表示为下面的约束最优化问题:
考虑几何间隔和函数间隔的关系式几何间隔和函数间隔的关系式,可将这个问题改写为
我们上面说到:成倍地改变w和b的值,超平面不会改变。因此可以改写该问题,在约束条件的两边同时除以,使得最右边为1,并且最大化和最小化是等价的,因此得到新关系式:
这是一个凸二次规划(convex quadratic programming)问题。
支持向量和间隔边界
在线性可分情况下,训练数据集的样本点中与分离超平面距离最近的样本点的实例称为支持向量(support vector)。支持向量是使约束条件式成立的点。
如图所示,在H1和H2上的点就是支持向量。
注意到H1和H2平行,并且没有实例点落在它们中间。在H1和H2之间形成一条长带,分离超平面与它们平行且位于它们中央。长带的宽度,即H1和H2之间的距离称为间隔(margin)。间隔依赖于分离超平面的法向量w。H1和H2称为间隔边界。
在决定分离超平面时只有支持向量起作用,而其他实例点并不起作用。如果移动支持向量将改变所求的解;但是如果在间隔边界以外移动其他实例点,甚至去掉这些点,则解是不会改变的。由于支持向量在确定分离超平面中起着决定性作用,所以将这种分类模型称为支持向量机。支持向量的个数一般很少,所以支持向量机由很少的“重要的”训练样本确定。
学习的对偶算法
原始的最优化问题为:
首先构建拉格朗日函数(Lagrange function)。为此,对每一个不等式约束不等式约束。引进拉格朗日乘子(Lagrauge multiplier)拉格朗日乘子得到拉格朗日函数:
根据拉格朗日对偶性,原始问题的对偶问题是极大极小问题:
最后得到等价的最优化问题(证明过程省略):
参数的计算:
通过引入拉格朗日函数,我们得到原问题:
的等价问题为:
w的求解:
b的求解:
分类超平面:
分类决策函数:
松弛变量
通常情况是,训练数据中有一些特异点(outlier),将这些特异点除去后,剩下大部分的样本点组成的集合是线性可分的。线性不可分意味着某些样本点不能满足函数间隔大于等于1的约束条件。
为了解决这个问题,可以对每个样本点引进一个松池变量,使函数间隔加上松弛变量大于等于1。这样,约束条件变为:
这样最优化问题变为:
非线性支持向量机与核函数
对解线性分类问题,线性分类支持向量机是一种非常有效的方法。但是,有时分类问题是非线性的,这时可以利用核技巧来实现非线性可分支持向量机。
我们注意到在线性支持向量机的对偶问题中,无论是目标函数还是决策函数(分离超平面)都只涉及输入实例与实例之间的内积。在对偶问题的目标函数
中的内积可以用核函数来代替。此时对偶问题的目标函数成为
同样,分类决策函数中的内积也可以用核函数代替,而分类决策函数式成为
SMO算法
输入:其中
输出:近似解
(1)取初始值
(2)选取优化变量 解析求解两个变量的最优化问题
求得最优解 更新为
(3)若在精度 范围内满足停机条件
其中,
则转(4);否则令
(4) 取
实验结果(使用SMO算法)
正确率
95.1389%
运行时间
0.24s
算法比较
结果分析
朴素贝叶斯算法:
模型建立时间最短。因为朴素贝叶斯算法是基于概率的一种分类算法,没有涉及参数优化的求解过程,因此不需要时间来建立模型,由于朴素贝叶斯算法是基于条件独立性的假设,即各特征之间是条件独立的,而实际上有些特征之间并不是条件独立,因此求解出的正确率会降低。
C4.5算法:
决策树算法的正确率比较高,而且模型建立的时间也很少,因为决策树算法是一种基于最优特征划分数据集的算法,不需要求解最优参数。主要的时间耗费在于最优特征选择。是一种比较理想的分类算法。
MLP:
我们发现MLP求解出的正确率是100%,理论上,多层神经网络可以表示任意分类函数。但是模型建立的时间耗费太大。这是因为MLP中的参数比较多。而且还涉及前向传播和后向传播的参数更新过程。因此需要耗费更多的时间来求解。
支持向量机:
正确率和C4.5差不多,但是需要更多的时间耗费来求解模型。这是因为。支持向量机算法的核心过程就是求解最优参数。每次通过某种参数优化方法来更新参数。因此需要比较的时间来更新参数。相对于神经网络,支持向量机的参数更少,因此模型建立的时间也相对较少。
六、如何提高算法的分类性能?
我们以MLP算法为例:
迭代次数:
首先设置迭代500次
得到结果
然后迭代700次:
我们发现模型建立的时间增加了,但是误差减小了。
学习率:
首先设置为0.3
然后修改为0.5
我们发现模型建立的时间增加了,但是误差减小了。
我们可以通过适当的修改学习率或者增加迭代次数来减少误差,但是可能会增加模型建立的耗费时间。