一.朴素贝叶斯
1.分类理论
朴素贝叶斯是一种基于贝叶斯定理和特征条件独立性假设的多分类的机器学习方法,所谓贝叶斯指的是:朴素贝叶斯分类器是通过比较类后验概率大小,将样本分到类后验概率最大的类别中,因此是一种贝叶斯方法;所谓朴素指的是:类后验概率是通过先验概率分布和条件概率分布求得,先验概率分布就是每个类的先验概率,条件概率分布即在给定不同类别的情况下,特征向量的分布,由于对于特征向量是高维的情况下,估计条件概率分布有一个指数级的参数,因此其有一个条件独立性假设:在给定类别的情况下,用于分类的各个特征之间都是条件独立的。
通过学习类先验概率分布和条件概率分布可学习到联合概率分布,因此朴素贝叶斯是一种生成方法,是通过训练数据集学习联合概率分布,学习数据生成的机制。
2.参数估计
其参数估计方法有极大似然估计法和贝叶斯估法,在极大似然估计中,类先验概率是通过求训练数据集中每个类的样本数占样本总数的比例,条件概率分布是用所有的特征的不同取值组合下的样本数占比除以每个类别的样本数占比,但是极大似然估计存在着缺点,也许会出现所要估计的概率为0的情况,这时会影响到后验概率的计算结果,使分类产生偏差,比如说是在给定类别条件下某个特征取值的概率为0,那么这个类别下的所有特征的联合条件概率为0,但是这明显有问题,因为如果凡是某个特征取值概率为0,条件概率就为0,最极端的情况可能会出现所有的类后验概率都为0,解决这一问题的方法是采用贝叶斯估计。
在贝叶斯估计中,是对每个要估计的概率的分子上都加上一个正数λ,这样对于原来概率为0的情况,就会使得概率不为0,很明显,满足概率的非负性,为了满足概率的正则性,对于类先验概率的估计,在分母上加上Kλ,对于每个特征的条件概率估计,在分母上加上Sj.λ,Sj是这个特征的所有可能取值,当λ=0,就是极大似然估计,当λ=1,就是拉普拉斯平滑,很显然其满足非负性和正则性,表明其确为一种概率分布。
3.模型特点
(1)优点
1.朴素贝叶斯模型发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率,贝叶斯分类提供了一个无法获得的黄金标准;
2. NBC模型所需估计的参数很少,对缺失数据不太敏感,算法也比较简单,由于假设给定已知类时各个特征是条件独立的,故大大减少了条件概率的数量,即减少了我们估计的参数的数量,朴素贝叶斯学习与预测大为简化,因而朴素贝叶斯法高效,且易于实现;
3.对小规模的数据表现很好,适合多分类任务,适合增量式训练。
(2)缺点
理论上,NBC模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为NBC模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,因此对输入数据的表达形式很敏感,这给NBC模型的正确分类带来了一定影响,在属性个数比较多或者属性之间相关性较大时,NBC模型的分类效率比不上决策树模型。而在属性相关性较小时,NBC模型的性能最为良好。
二.KNN算法
1.分类理论
(1)总述
K近邻法是一种基本的分类和回归方法,这里我们只探讨分类问题中的k近邻法。
K近邻法是一种可以用于多类分类的机器学习方法,K近邻法不具有显示的学习过程,是给定带有类标记的训练数据,对于新的样本,根据其K个最近邻的训练样本的类别,利用多数表决的原则来预测类别,其三个基本要素是:k值的选择,距离度量,分类决策规则
K近邻法中,当训练集,k值,距离度量及分类决策规则确定后,对于任何一个新的输入实例,它所属的类唯一的确定
KNN即最近邻算法的主要过程
1.计算训练样本和测试样本中每个样本点的距离(常见的距离度量有欧式距离,马氏距离等);
2.对上面所有的距离值进行排序;
3.选前k个最小距离的样本;
4.根据这k个样本的标签进行投票,得到最后的分类类别;
(2)距离度量
特征空间中的两个实例点的距离是两个实例点相似程度的反映,k近邻模型的特征空间一般是n维实数向量空间,使用的距离是欧氏距离,但也可以是其他距离,如更一般的Lp距离或Minkowski距离
设特征空间是n维实数向量空间
Lp距离定义为
当p=2时,称为欧式距离;
p=1时,称为曼哈顿距离,也叫城市距离;
当p=无穷,切比雪夫距离,它是各个坐标距离的最大值
(3)k值的选择
对于真实的数据,后验条件概率分布是未知的,但是贝叶斯分类提供了一个无法获得的黄金标准,很多方法都试图估计这个条件概率,对于一个给定的点,KNN是用其周围最近的k个点中每一类点的数目占这K个点的比例作为每一类的后验概率,尽管很简单,但是KNN决策边界经常惊奇的接近于最优贝叶斯决策边界。
当然了,K的选择对KNN分类器也会有巨大的影响:
当K值较小的时候,相当于用较小的邻域中的训练实例进行预测,“学习”的近似误差会减小,只有与输入实例较近的(相似的)训练实例才会对预测结果起作用,但缺点是“学习”的估计误差会增大,预测结果会对近邻的实例点非常敏感,如果较近的实例点恰好是噪声,预测就会出错,k值比较小就意味着整体模型变得复杂,决策边界会太灵活,容易发生过拟合,对应的分类器是低偏差高方差;
当K值较大时,就相当于用较大的邻域中的训练实例进行预测,其优点学习”的估计误差会减小,较多的训练实例能够减小噪声对预测的影响,会造成低方差,但缺点是学习的近似误差会增大,与输入实例点不近的训练实例也会对预测结果起作用,会造成高偏差,k值的增大就意味着整体的模型变得简单但会使类别之间的界限变得模糊,容易发生欠拟合,对应的分类器是低方差高偏差
k的选择合适的话,那么决策边界就会接近于贝叶斯边界,一个较好的K值可通过各种启发式技术来获取,比如:交叉验证。k的选择是根据测试误差最小的原则如果k=N,那么无论输入实例是什么,都将简单的预测它属于在训练实例中最多的类,这时,模型过于简单,完全忽略训练实例中的大量有用信息,是不可取的
(4)分类决策规则
多数表决原则等价于经验风险最小化
2.KNN算法的特点
(1)优点:
1.思想简单,理论成熟,既可以用来做分类也可以用来做回归;
2.可用于非线性分类;
3.训练时间复杂度为O(n2);
4.准确度高,对数据没有假设,在K值合适的情况下对outlier不敏感;
(2)缺点:
1.样本不平衡问题(即有些类别的样本数量很多,而其它样本的数量很少);
2.计算量大;
3.需要大量的内存;
3.KNN的改进分析
(1)样本不平衡问题
当样本不平衡时,即:一个类的样本容量很大,而其他类样本数量很小时,很有可能导致当输入一个未知样本时,该样本的K个邻居中大数量类的样本占多数。 但是这类样本并不接近目标样本,而数量小的这类样本很靠近目标样本。这个时候,我们有理由认为该位置样本属于数量小的样本所属的一类,但是,KNN却不关心这个问题,它只关心哪类样本的数量最多,而不去把距离远近考虑在内
因此,我们可以采用权值的方法来改进。和该样本距离小的邻居权值大,和该样本距离大的邻居权值则相对较小,由此,将距离远近的因素也考虑在内,避免因一个样本过大导致误判的情况。
(2)计算量大
从算法实现的过程可以发现,该算法存两个严重的问题,第一个是需要存储全部的训练样本,第二个是计算量较大,因为对每一个待分类的样本都要计算它到全体已知样本的距离,才能求得它的K个最近邻点。
针对计算量大的问题, KNN算法的改进是分组快速搜索近邻法,其基本思想是:将样本集按近邻关系分解成组,给出每组质心的位置,以质心作为代表点,和未知样本计算距离,选出距离最近的一个或若干个组,再在组的范围内应用一般的KNN算法。由于并不是将未知样本与所有样本计算距离,故该改进算法可以减少计算量,但并不能减少存储量。
(3)需要大量的内存
使用K-近邻算法必须保存所有训练数据,如果数据很大,占用空间很大。而且,对一个样本分类,必须计算其与所有训练样本集中的样本的距离,这可能会非常耗时。针对这两个方面的问题,k-近邻的改进算法为kd树。
4.kd树
(1)引入
实现k近邻法时,主要考虑的是如何对训练数据进行快速k近邻搜索,这点在特征空间维数大及训练数据容量大时尤其必要
K近邻法的最简单的实现方法是线性扫描,这时要计算输入实例与每一个训练实例的距离,当训练集很大时,计算非常耗时,这种方法是不可行的,为了提高k近邻搜索的效率,可以考虑使用特殊的结构存储训练数据,以减少计算距离的次数,具体方法有很多,下面介绍kd树
(2)kd树的介绍
①kd树介绍
kd树是一种对k维空间中的实例点进行存储以便对其进行快速检索的树形数据结构,kd树是二叉树,表示对k维空间的一个划分,构造kd树相当于不断地用垂直于坐标轴的超平面将k维空间进行切分,构成一系列的k维超矩形区域,kd树的每个结点对应于一个k维超矩形区域
类比于二分查找,把二分查找中的数据点换成k维数据点,这样的划分就变成了用超平面对k维空间的划分。空间划分就是对数据点进行分类,“挨得近”的数据点就在一个空间里面。KD树中每个节点是一个向量,和二叉树按照数的大小划分不同的是,KD树每层需要选定向量中的某一维,然后根据这一维按左小右大的方式划分数据。
②在构建KD树时,关键需要解决2个问题
Ⅰ选择向量的哪一维进行划分;
通常,依次选择坐标轴对空间切分, 也可以是选择随机选择某一维或按顺序选择,但是更好的方法应该是在数据比较分散的那一维进行划分(分散的程度可以根据方差来衡量)。方差越大,说明这个维度上的数据越不集中(稀疏、分散),也就说明了它们就越不可能属于同一个空间,因此需要在这个维度上进行划分。
Ⅱ如何划分数据。
好的划分方法可以使构建的树比较平衡,可以每次选择中位数来进行划分,选择训练实例点在选定坐标轴上中位数为切分点,这样得 到的kd树是平衡的,注意,平衡的kd树搜索时效率最优的(平衡二叉树:是一颗高度平衡的二叉排序树,它要么是一棵空树,要么其左子树和右子树的深度之差的绝对值不超过1,且它的左子树和右子树都是平衡二叉树)。
③算法(构造平衡kd树)
Ⅰ开始:构造根节点:
ⅰ选择切分坐标轴和切分点:根节点对应于包含训练数据集的K维空间的超矩形区域,选择x1为坐标轴,以训练数据集中所有的实例的x1坐标的中位数为切分点
ⅱ切分:将根节点对应的超矩形切分为两个子区域,切分由通过切分点并与坐标轴x1垂直的超平面实现,由根节点生成深度为1的左右子节点:左节点对应坐标小于切分点的子区域,右子节点对应于坐标大于切分点的子区域
ⅲ保存根结点:将落在切分超平面上的实例点保存在根节点
Ⅱ重复:对深度为j的结点
ⅰ选择切分坐标轴和切分点:选择xl为切分点的坐标轴,l=j(mod k)+1,以该结点的区域中所有实例的xl坐标的中位数作为切分点
ⅱ切分:将该节点对应的超矩形区域切分为两个子区域,切分由通过切分点并与坐标轴xl垂直的超平面实现,由该结点生成深度为j+1的左右子节点,左子节点对应xl小于切分点的子区域,右子节点对应xl坐标大于切分点的子区域
ⅲ保存结点:将落在切分超平面上的实例点保存在该结点
Ⅲ确定迭代停止条件
直到两个子区域上没有实例点存在时停止,从而形成kd树的区域划分
④搜索kd树
下面介绍如何利用kd树进行k近邻搜索,可以看到,利用kd树可以省去对大部分数据点的搜索,从而减少搜索的计算量,这里以最近邻为例加以叙述,同样的方法可以应用到k近邻
用kd树的最近邻搜索:
输入: 已构造的kd树;目标点x;
输出:x的最近邻。
(1)在kd树中找出包含目标点x的叶结点
从根结点出发,递归的向下访问kd树。若目标点当前维的坐标值小于切分点的坐标值,则移动到左子结点,否则移动到右子结点。直到子结点为叶结点为止(搜寻的迭代停止条件是当前移动到的目标区域的左右子节点为None);
(2)以此叶结点为“当前最近点”(可用于设置最近距离的初始值)
(3)递归的向上回退,在每个结点进行以下操作:
(a)如果该结点保存的实例点比当前最近点距目标点更近,则以该实例点为“当前最近点”;(在实际代码实现的时候只需在搜寻的时候搜寻当前最近点的父节点的左右节点即可)
(b)当前最近点一定存在于该结点一个子结点对应的区域。
检查该子结点的父结点的另一个子结点对应的区域是否有更近的点。具体的,检查另一个子结点对应的区域是否与以目标点为球心、以目标点与“当前最近点”间的距离为半径的超球体相交。如果相交,可能在另一个子结点对应的区域内存在距离目标更近的点,移动到另一个子结点。(这里的移动的意思就是说更新当前的最近点)
接着,递归的进行最近邻搜索。如果不相交,向上回退。
(4)当回退到根结点时,搜索结束。最后的“当前最近点”即为x的最近邻点
由于搜索被限制在空间局部区域上,效率大为提高
如果实例点是随机分布的,kd树搜索的平均计算复杂度是O(logN),这里N是训练实例数。kd树更适用于训练实例数远大于空间维数时的k近邻搜索。当空间维数接近训练实例数时,它的效率会迅速下降,几乎接近线性扫描,因为扫描次数等于给定目标值所在的叶节点在二叉排序树的层数,这个层数是由特征向量的维数决定的,因此当空间维数很大时,效率会下降
二叉排序树是既可以实现插入和删除的效率提高,也可以比较高效率的实现查找的算法,在kd树中,主要是为了加速k近邻的搜索,提高查找效率,就不用每次都计算新的实例与所有训练样本的距离了
三.决策树
决策树是通过建立一个树形结构来存储训练数据,相当于把特征空间划分成不同的单元,然后在每个单元上定义一个类的条件概率分布,因此决策树是由各个单元给定条件下的条件概率分布组成,决策树学习是由训练数据集估计条件概率模型,基于特征空间划分的条件概率模型有无穷多个,我们选择的条件概率模型应该不仅对训练数据由很好的拟合,而且对未知数据有很好的预测。主要是以损失函数(通常是正则化的极大似然函数)为目标,损失函数最小化为策略建立决策树模型,包含三个步骤:特征选择、决策树的生成和决策树的修剪
考虑所有的特征空间的划分在计算上是不可行的,所以我们采用一个自上而下的贪心算法,也被称为递归二元划分。
所谓自上而下即从树的顶点开始,连续的划分特征空间,每次划分为两个分支
所谓贪心即在每一步划分的时候,最好的划分只是指的是当前的某一步按照某个特征进行划分是最好的,并不是寻找在未来也是最好的划分,所以在每一步都要考虑哪一个特征被选择用来划分决策树是最好的,而这一准则可以用残差平方和(回归树)和信息增益或基尼指数(分类树)来衡量。
1.特征选择
(1)特征选择的作用
Ⅰ筛选有分类能力的特征
当实际用来构建决策树的特征数过多时,可以在决策树最开始的时候对特征进行选择,只留下对决策树有足够分类能力的特征;
Ⅱ筛选分类能力最好的特征
在构建决策树的过程中,每一步的划分都需要选择当前划分最好的特征,也就是分类能力最好的特征
(2)特征选择的准则
信息增益或信息增益比。
Ⅰ熵和条件熵
ⅰ熵是表示随机变量不确定性的度量,熵越大,随机变量的不确定性越大
ⅱ条件熵度量了在给定X条件下Y剩下的不确定性
随机变量X给定条件下随机变量Y的条件熵定义为X给定条件下Y的条件概率分布的熵对X的数学期望
Ⅱ信息增益和信息增益比
ⅰ信息增益表示得知特征X的信息而使得类Y的信息的不确定性减少的程度。
ⅱ为什么信息增益最大的特征就好?
entroy(前) - entroy(后)差异越大,说明使用当前特征划分数据集D的话,其纯度上升的更快。而我们在构建最优的决策树的时候总希望能更快速到达纯度更高的集合,在决策树构建的过程中我们总是希望集合往最快到达纯度更高的子集合方向发展,因此我们总是选择使得信息增益最大的特征来划分当前数据集D。
ⅲ信息增益的缺点
以信息增益作为划分训练数据集的特征,在不要求是二叉树的情况下,可能存在偏向于选择取值较多的特征的问题,使用信息增益比可以对这一问题进行校正,这是特征选择的另一准则
如果是取值更多的属性,更容易使得数据更“纯”(尤其是连续型数值),其信息增益更大,决策树会首先挑选这个属性作为树的顶点。结果训练出来的形状是一棵庞大且深度很浅的树,这样的划分是极为不合理的。
信息增益比:特征A对训练数据集D的信息增益比定义为其信息增益与训练数据D关于特征A的值的熵的比
2.决策树的生成
(1)ID3算法
ID3算法用信息增益作为特征选择准则,只有树的生成,所以该算法容易造成过拟合
(2)C4.5算法
与ID3算法相似,在其基础上进行了改进,在生成的过程中,用信息增益比来进行特征选择,并且还增加了决策树的剪枝
剪枝方法:极小化决策树整体的损失函数或代价函数来实现
基本思想:过拟合就是模型过于复杂,学习了训练数据中一切信息包括噪声和非代表性数据,因此剪枝就是从在损失函数中引入模型复杂度,同时考虑训练数据的拟合程度和模型的复杂度
设已生成的决策树的叶节点个数为|T|个,即决策树的复杂度为|T|,每个叶节点的样本数为
每个叶节点上的第k类的样本数为
每个叶节点t上的经验熵为
α>=0为参数,那么决策树的损失函数为:
右边第一项是模型训练数据的预测误差,即模型与训练数据的拟合程度,剪枝就是当α确定时,选择损失函数最小的模型,即损失函数最小的子树,可以看出α确定时子树越大,训练数据拟合的越好,训练误差越小,模型复杂度就越高,第二项的值就越大,α正好表示了对训练误差和模型复杂度的权衡
具体剪枝时,是从叶节点开始剪枝,判断一个叶节点是否进行剪枝就是比较剪枝后的子树和剪枝前的子树的损失函数,如果剪枝后的损失函数更小,那么从模型的简单性考虑,我们会选择剪枝,剪枝后父节点变成了叶节点,如此重复下去,直到不能继续为止,在比较两个子树损失函数的差时,其计算可以在局部进行,所以决策树剪枝可以由一种动态规划算法实现
可以看出,决策树生成只考虑了通过提高信息增益(或信息增益比)对训练数据进行更好的拟合,而决策树剪枝通过优化损失函数还考虑了减小模型复杂度。决策树生成学习局部的模型,而决策树剪枝学习整体的模型
(3)CART算法(classication and regression tree)
CART假设决策树是二叉树
Ⅰ回归树
ⅰ特征选择
特征选择准则是误差平方和,我们知道对于确定的变量和确定的切分点,区域划分后要使得总误差平方和最小,那么每个区域的预测值是这个区域的样本的因变量取值的平均值;那么对于确定的变量,我们通过选择不同的切分点进行划分,比较不同切分点划分以后的总误差平方和,选择总误差平方和最小的切分点就是这个变量的最优切分点;那么我们只需要比较各个变量进行区域划分后的模型预测能力,然后选择最大的变量即可,类似于选择分类树里面的分类能力最好的变量
对于分类变量,如果是二分类的,那么计算按照这个分类变量不同取值划分的区域的总误差平方和,如果是多分类的分类变量或者是数值型变量,那么就按照最优切分点进行区域划分,按照大于这个切分点和小于这个切分点分为两个区域,计算两个区域的总误差平方和,作为衡量这个变量的预测能力,按照这方法计算所有变量的划分后的总误差平方和,每次进行划分时都选择候选变量中总误差平方和最小的
ⅱ生成回归树
每次选择一个最优变量和最优切分点,重复上述划分过程,直到满足停止条件为止,这样就生成一棵回归树,被称为最小二乘回归树,每个叶节点的预测值就是这个叶节点上的样本的因变量取值的平均值
Ⅱ分类树
ⅰ特征选择
使用基尼指数来选择最优特征,同时决定该特征的最优二值切分点
在分类树中的三个指标的区别:
基尼指数和熵之半的曲线很接近,都可以近似代表分类误差率,但是分类误差率对树的生长不敏感,所以更偏向于选择基尼指数和交叉熵来作为递归二分法的衡量指标,基尼指数和交叉熵被用来估计一次划分的质量,这两个指标对结点纯度比分类误差率更加敏感,而分类误差率被用来更偏向于我们的目标是最后生成树的预测效率
ⅱ生成分类树
算法步骤和上面回归树类似,只是换成了基尼指数最小,算法停止的条件是结点中的样本数小于阈值或样本集的基尼指数小于预定阈值(样本基本同属于同一类),或者没有更多特征
ⅲ分类树的剪枝
1.从决策树的低端进行剪枝,直到根节点,形成一个子树序列
Breiman等人证明,可以用递归的方法对树进行剪枝,将α从小增大,
产生一系列的区间
剪枝得到的子树序列对应着区间
的最优子树序列
�序列中的子树是嵌套的
具体的,从整体树开始剪枝,对于任意的内部节点,比较其作为单节点(剪枝后)损失函数和其作为根节点的损失函数,当α很小的时候,后者小于前者,当α逐渐增大,后者=前者,再继续,后者会超过前者,所以在临界点时即二者相同时,此时前者的节点更少,就进行剪枝,按照这个方法,计算所有内部节点的对应的临界值,选择最小的那个节点开始剪枝,不断的进行剪枝,直至到达根节点
2.在剪枝得到的子树序列中用交叉检验选择最优的子树
◆在训练数据集上进行学习得到一个决策树
◆根据不同的复杂度α,修剪得到不同的子树
◆将训练数据集分为K份,重复一下过程:i=1,2,...,K
(a)在除第k份数据上重复上面两步,得到关于不同复杂度α的子树
(b)将这些子树在第k份数据上做预测,并计算误差平方和,得到了不同复杂度α的测试误差
循环结束后,对于不同的α都有K个误差值,对这K个误差值进行平均,选择最小测试误差对应的α
3.模型特点
(1)优点:
1.决策树易于理解和实现.更能反映人类作决策的行为,可以用图形展示,甚至可以被非专家所解释;
2.能够同时处理数据型和常规型属性。其他的技术往往要求数据属性的单一(R语言中不需要创造虚拟变量也可以处理定类变量)
3.对缺失值不敏感,可以处理不相关特征数据,不需要考虑数据是否线性可分
(2)缺点:
1.预测效率上没有监督学习方法好;
2.容易造成过拟合(解决办法:集成学习)
3.在处理特征关联性比较强的数据时表现得不是太好