6.1 人工神经网络
6.2
决策树
6.3
遗传算法
6.4
近邻算法
6.5
规则推导
6.1 人工神经网络
神经网络近来越来越受到人们的关注,因为它为解决大复杂度问题提供了一种相对来说比较有效的简单方法。神经网络可以很容易的解决具有上百个参数的问题(当然实际生物体中存在的神经网络要比我们这里所说的程序模拟的神经网络要复杂的多)。神经网络常用于两类问题:分类和回归。
在结构上,可以把一个神经网络划分为输入层、输出层和隐含层(见图4)。输入层的每个节点对应一个个的预测变量。输出层的节点对应目标变量,可有多个。在输入层和输出层之间是隐含层(对神经网络使用者来说不可见),隐含层的层数和每层节点的个数决定了神经网络的复杂度。

除了输入层的节点,神经网络的每个节点都与很多它前面的节点(称为此节点的输入节点)连接在一起,每个连接对应一个权重Wxy,此节点的值就是通过它所有输入节点的值与对应连接权重乘积的和作为一个函数的输入而得到,我们把这个函数称为活动函数或挤压函数。如图5中节点4输出到节点6的值可通过如下计算得到:
W14*节点1的值+W24*节点2的值
神经网络的每个节点都可表示成预测变量(节点1,2)的值或值的组合(节点3-6)。注意节点6的值已经不再是节点1、2的线性组合,因为数据在隐含层中传递时使用了活动函数。实际上如果没有活动函数的话,神经元网络就等价于一个线性回归函数,如果此活动函数是某种特定的非线性函数,那神经网络又等价于逻辑回归。
调整节点间连接的权重就是在建立(也称训练)神经网络时要做的工作。最早的也是最基本的权重调整方法是错误回馈法,现在较新的有变化坡度法、类牛顿法、Levenberg-Marquardt法、和遗传算法等。无论采用那种训练方法,都需要有一些参数来控制训练的过程,如防止训练过度和控制训练的速度。

决定神经网络拓扑结构(或体系结构)的是隐含层及其所含节点的个数,以及节点之间的连接方式。要从头开始设计一个神经网络,必须要决定隐含层和节点的数目,活动函数的形式,以及对权重做那些限制等,当然如果采用成熟软件工具的话,他会帮你决定这些事情。
在诸多类型的神经网络中,最常用的是前向传播式神经网络,也就是我们前面图示中所描绘的那种。我们下面详细讨论一下,为讨论方便假定只含有一层隐含节点。
可以认为错误回馈式训练法是变化坡度法的简化,其过程如下:
前向传播:数据从输入到输出的过程是一个从前向后的传播过程,后一节点的值通过它前面相连的节点传过来,然后把值按照各个连接权重的大小加权输入活动函数再得到新的值,进一步传播到下一个节点。
回馈:当节点的输出值与我们预期的值不同,也就是发生错误时,神经网络就要 “学习”(从错误中学习)。我们可以把节点间连接的权重看成后一节点对前一节点的“信任”
程度(他自己向下一节点的输出更容易受他前面哪个节点输入的影响)。学习的方法是采用惩罚的方法,过程如下:如果一节点输出发生错误,那么他看他的错误是受哪个(些)输入节点的影响而造成的,是不是他最信任的节点(权重最高的节点)陷害了他(使他出错),如果是则要降低对他的信任值(降低权重),惩罚他们,同时升高那些做出正确建议节点的信任值。对那些收到惩罚的节点来说,他也需要用同样的方法来进一步惩罚它前面的节点。就这样把惩罚一步步向前传播直到输入节点为止。
对训练集中的每一条记录都要重复这个步骤,用前向传播得到输出值,如果发生错误,则用回馈法进行学习。当把训练集中的每一条记录都运行过一遍之后,我们称完成一个训练周期。要完成神经网络的训练可能需要很多个训练周期,经常是几百个。训练完成之后得到的神经网络就是在通过训练集发现的模型,描述了训练集中响应变量受预测变量影响的变化规律。
由于神经网络隐含层中的可变参数太多,如果训练时间足够长的话,神经网络很可能把训练集的所有细节信息都“记”下来,而不是建立一个忽略细节只具有规律性的模型,我们称这种情况为训练过度。显然这种“模型”对训练集会有很高的准确率,而一旦离开训练集应用到其他数据,很可能准确度急剧下降。为了防止这种训练过度的情况,我们必须知道在什么时候要停止训练。在有些软件实现中会在训练的同时用一个测试集来计算神经网络在此测试集上的正确率,一旦这个正确率不再升高甚至开始下降时,那么就认为现在神经网络已经达到做好的状态了可以停止训练。
图6中的曲线可以帮我们理解为什么利用测试集能防止训练过度的出现。在图中可以看到训练集和测试集的错误率在一开始都随着训练周期的增加不断降低,而测试集的错误率在达到一个谷底后反而开始上升,我们认为这个开始上升的时刻就是应该停止训练的时刻。

神经元网络和统计方法在本质上有很多差别。神经网络的参数可以比统计方法多很多。如图4中就有13个参数(9个权重和4个限制条件)。由于参数如此之多,参数通过各种各样的组合方式来影响输出结果,以至于很难对一个神经网络表示的模型做出直观的解释。实际上神经网络也正是当作“黑盒”来用的,不用去管“盒子”里面是什么,只管用就行了。在大部分情况下,这种限制条件是可以接受的。比如银行可能需要一个笔迹识别软件,但他没必要知道为什么这些线条组合在一起就是一个人的签名,而另外一个相似的则不是。在很多复杂度很高的问题如化学试验、机器人、金融市场的模拟、和语言图像的识别,等领域神经网络都取得了很好的效果。
神经网络的另一个优点是很容易在并行计算机上实现,可以把他的节点分配到不同的CPU上并行计算。
在使用神经网络时有几点需要注意:第一,神经网络很难解释,目前还没有能对神经网络做出显而易见解释的方法学。
第二,神经网络会学习过度,在训练神经网络时一定要恰当的使用一些能严格衡量神经网络的方法,如前面提到的测试集方法和交叉验证法等。这主要是由于神经网络太灵活、可变参数太多,如果给足够的时间,他几乎可以“记住”任何事情。
第三,除非问题非常简单,训练一个神经网络可能需要相当可观的时间才能完成。当然,一旦神经网络建立好了,在用它做预测时运行时还是很快得。
第四,建立神经网络需要做的数据准备工作量很大。一个很有误导性的神话就是不管用什么数据神经网络都能很好的工作并做出准确的预测。这是不确切的,要想得到准确度高的模型必须认真的进行数据清洗、整理、转换、选择等工作,对任何数据挖掘技术都是这样,神经网络尤其注重这一点。比如神经网络要求所有的输入变量都必须是0-1(或-1
-- +1)之间的实数,因此像“地区”之类文本数据必须先做必要的处理之后才能用作神经网络的输入。
6.2决策树
决策树提供了一种展示类似在什么条件下会得到什么值这类规则的方法。比如,在贷款申请中,要对申请的风险大小做出判断,图7是为了解决这个问题而建立的一棵决策树,从中我们可以看到决策树的基本组成部分:决策节点、分支和叶子。

决策树中最上面的节点称为根节点,是整个决策树的开始。本例中根节点是“收入>¥40,000”,对此问题的不同回答产生了“是”和“否”两个分支。
决策树的每个节点子节点的个数与决策树在用的算法有关。如CART算法得到的决策树每个节点有两个分支,这种树称为二叉树。允许节点含有多于两个子节点的树称为多叉树。
每个分支要么是一个新的决策节点,要么是树的结尾,称为叶子。在沿着决策树从上到下遍历的过程中,在每个节点都会遇到一个问题,对每个节点上问题的不同回答导致不同的分支,最后会到达一个叶子节点。这个过程就是利用决策树进行分类的过程,利用几个变量(每个变量对应一个问题)来判断所属的类别(最后每个叶子会对应一个类别)。
假如负责借贷的银行官员利用上面这棵决策树来决定支持哪些贷款和拒绝哪些贷款,那么他就可以用贷款申请表来运行这棵决策树,用决策树来判断风险的大小。“年收入>¥40,00”和“高负债”的用户被认为是“高风险”,同时“收入<¥40,000”但“工作时间>5年”的申请,则被认为“低风险”而建议贷款给他/她。
数据挖掘中决策树是一种经常要用到的技术,可以用于分析数据,同样也可以用来作预测(就像上面的银行官员用他来预测贷款风险)。常用的算法有CHAID、
CART、 Quest 和C5.0。
建立决策树的过程,即树的生长过程是不断的把数据进行切分的过程,每次切分对应一个问题,也对应着一个节点。对每个切分都要求分成的组之间的“差异”最大。
各种决策树算法之间的主要区别就是对这个“差异”衡量方式的区别。对具体衡量方式算法的讨论超出了本文的范围,在此我们只需要把切分看成是把一组数据分成几份,份与份之间尽量不同,而同一份内的数据尽量相同。这个切分的过程也可称为数据的“纯化”。看我们的例子,包含两个类别--低风险和高风险。如果经过一次切分后得到的分组,每个分组中的数据都属于同一个类别,显然达到这样效果的切分方法就是我们所追求的。
到现在为止我们所讨论的例子都是非常简单的,树也容易理解,当然实际中应用的决策树可能非常复杂。假定我们利用历史数据建立了一个包含几百个属性、输出的类有十几种的决策树,这样的一棵树对人来说可能太复杂了,但每一条从根结点到叶子节点的路径所描述的含义仍然是可以理解的。决策树的这种易理解性对数据挖掘的使用者来说是一个显著的优点。
然而决策树的这种明确性可能带来误导。比如,决策树每个节点对应分割的定义都是非常明确毫不含糊的,但在实际生活中这种明确可能带来麻烦(凭什么说年收入¥40,001的人具有较小的信用风险而¥40,000的人就没有)。
建立一颗决策树可能只要对数据库进行几遍扫描之后就能完成,这也意味着需要的计算资源较少,而且可以很容易的处理包含很多预测变量的情况,因此决策树模型可以建立得很快,并适合应用到大量的数据上。
对最终要拿给人看的决策树来说,在建立过程中让其生长的太“枝繁叶茂”是没有必要的,这样既降低了树的可理解性和可用性,同时也使决策树本身对历史数据的依赖性增大,也就是说这是这棵决策树对此历史数据可能非常准确,一旦应用到新的数据时准确性却急剧下降,我们称这种情况为训练过度。为了使得到的决策树所蕴含的规则具有普遍意义,必须防止训练过度,同时也减少了训练的时间。因此我们需要有一种方法能让我们在适当的时候停止树的生长。常用的方法是设定决策树的最大高度(层数)来限制树的生长。还有一种方法是设定每个节点必须包含的最少记录数,当节点中记录的个数小于这个数值时就停止分割。
与设置停止增长条件相对应的是在树建立好之后对其进行修剪。先允许树尽量生长,然后再把树修剪到较小的尺寸,当然在修剪的同时要求尽量保持决策树的准确度尽量不要下降太多。
对决策树常见的批评是说其在为一个节点选择怎样进行分割时使用“贪心”算法。此种算法在决定当前这个分割时根本不考虑此次选择会对将来的分割造成什么样的影响。换句话说,所有的分割都是顺序完成的,一个节点完成分割之后不可能以后再有机会回过头来再考察此次分割的合理性,每次分割都是依赖于他前面的分割方法,也就是说决策树中所有的分割都受根结点的第一次分割的影响,只要第一次分割有一点点不同,那么由此得到的整个决策树就会完全不同。那么是否在选择一个节点的分割的同时向后考虑两层甚至更多的方法,会具有更好的结果呢?目前我们知道的还不是很清楚,但至少这种方法使建立决策树的计算量成倍的增长,因此现在还没有哪个产品使用这种方法。
而且,通常的分割算法在决定怎么在一个节点进行分割时,都只考察一个预测变量,即节点用于分割的问题只与一个变量有关。这样生成的决策树在有些本应很明确的情况下可能变得复杂而且意义含混,为此目前新提出的一些算法开始在一个节点同时用多个变量来决定分割的方法。比如以前的决策树中可能只能出现类似“收入<¥35,000”的判断,现在则可以用“收入<(0.35*抵押)”或“收入>¥35,000或抵押<150,000”这样的问题。
决策树很擅长处理非数值型数据,这与神经网络只能处理数值型数据比起来,就免去了很多数据预处理工作。
甚至有些决策树算法专为处理非数值型数据而设计,因此当采用此种方法建立决策树同时又要处理数值型数据时,反而要做把数值型数据映射到非数值型数据的预处理。
6.3遗传算法
基于进化理论,并采用遗传结合、遗传变异、以及自然选择等设计方法的优化技术。
6.4近邻算法
将数据集合中每一个记录进行分类的方法。
6.5规则推导
从统计意义上对数据中的“如果-那么”规则进行寻找和推导。
采用上述技术的某些专门的分析工具已经发展了大约十年的历史,不过这些工具所面对的数据量通常较小。而现在这些技术已经被直接集成到许多大型的工业标准的数据仓库和联机分析系统中去了。