决策树算法
决策树的基本思想与人自身的决策机制非常类似,都是基于树结构进行决策,即对于不论什么问题。我们都先抽出当中的几个主要特征。然后对这些特征一个一个的去考察,从而决定这个问题应该属于的类别。比如我们要去商场买电脑,我们一般要通过考察电脑的CPU。内存,硬盘。显存等这些特征来推断这台电脑是好电脑还是一般电脑。当我们做推断的时候。我们都是首先看这个电脑的CPU怎么样,是i3?i5?还是i7?假设是i7我们就有更大概率倾向于觉得这台电脑是好电脑。然后我们再依次考察内存,硬盘。显存等。终于根据这些特征决定其性能的好坏。
这样我们就能够构建出一颗决策树来:
当然,对于不同的人,需求不同,所以对于特征考量的重要性也不同,比如常常玩儿游戏的人会更在乎显存,而常常看电影的则会更加在乎硬盘的大小,这时候由于其需求的不同。对于好电脑的定位也可能会不同。也会构建不同的树。因此决策树算法的核心在于怎样选择特征从而构建出我们要想要的决策树从而能够更加通用的去进行分类。为了能够构建决策树,须要介绍特征选择算法,为了能够让构建的决策树更加通用,也就是泛化能力更强,须要介绍剪枝算法
变量定义:
D ——— 样本集合
pk ——— 在样本集合D中第k类样本所占的比例
Y ——— 样本类别集合
特征选择算法
熵与信息增益
在维基百科中,对熵的定义是这样的“entropy (more specifically, Shannon entropy) is the expected value (average) of the information contained in each message.”。我们能够知道熵是用来定义一条消息中所包括的的信息量的,即熵越大,信息量越大,熵越小,信息量越小。那么我们能够知道,假设一个消息中的信息大部分都属于同一个类别,即消息中的信息纯度非常高,信息的确定性非常大,信息不混乱的时候,信息量是非常小的。这时候熵也是非常小的。而假设一个消息中包括全部信息且这些信息是均匀分布的,即并没有那个信息占有主导,那么这时候我们能够觉得消息中的信息的纯度是非常低的,信息的不确定性非常大,信息量也非常大,由于其包括全部可能的信息,这时候熵应该是最大的。
即信息的纯度越高,熵越大,纯度越低,熵越小。
集合 D 的熵定义为
H(D)=?∑k=1|Y|pklog2pk
通过该公式我们也能够看出。假设集合D中的信息纯度越高,确定性越大。熵越小。而信息纯度越低,确定性越小则熵越大。假设D中样本所涉及的问题是一个二分类问题。即|Y|=2,这时候H(D)=?∑|Y|k=1pklog2pk就能够展开为H(D)=?(p0log2p0+(1?p0)log2(1?p0))。那么我们能够知道当p0=0/1的时候,集合D的信息纯度最高。不确定性为0,全部的数据都属于同一个类别,此时熵取得最小值0;而当p0=0.5的时候,D的信息纯度最低,不确定性最高,由于全部可能类别的数据都是均匀分布的。即取不论什么类别的数据都有可能且可能性是相等的,这时候其熵取得最大值1。
条件熵
H(D|A)=∑i=1npiH(D|A=ai)
是指当已知信息(属性)A的时候,其所包括的信息量。即在已知A的条件下。D中信息的纯度情况,不确定性的情况
信息增益(互信息)
Gain(D,A)=H(D)?H(D|A)
是指数据集D在已知条件A的情况下使得信息纯度提升的情况。即所包括信息不确定性减少的情况。
通过该公式我们能够知道,当H(D|A)非常小。即在已知条件A的时候,集合D的纯度非常高,不确定性非常小。也就是说由于A的确定使得使得集合D的纯度大幅度的提高。即A对数据分类的影响非常大,不确定性急剧减小。是数据分类的主要影响因素;而当H(D|A)非常大的时候。则正好相反,此时即使在已知A的条件下。数据集D依旧非常混乱,纯度非常低,那么我们能够觉得属性A对于数据的分类影响非常小。因此,在极端情况。即当H(D|A)=0的时候,说明当已知A时,数据集D纯度达到了最高。各个数据的类别就全然确定。那么信息增益也是最大的;当H(D|A)=H(D)的时候,说明A对于数据纯度的提高为0,此时A的存在与否。对于数据的混乱程度毫无影响,即对于分类情况,其效果为0,信息增益最小。
信息增益率
Gainratio(D,A)=Gain(D,A)IV(A)
当中
IV(A)=?∑i=1n|Di||D|log|Di||D|
n为特征A的取值个数,|Di|是特征A取值ai的时候的个体数,当特征取值越多。通常IV(A)的值也会越大。
特征选择
ID3 & C4.5
我们在选择特征的时候。都希望所选择的特征能够使得数据的纯度提升最大,不确定性减少最多。最好能够通过该特征的选择使得数据完毕分类。通过上面对熵和信息增益的描写叙述我们能够知道。这样的描写叙述与信息增益的功效正好相符。因此我们每次选择特征的时候,都希望选择信息增益最大的特征。
这样的利用信息增益进行选择的算法就是ID3算法。
可是我们能够发现,当使用信息增益进行特征选择的时候,其倾向于选择取值数目多的属性。
假设数据集D为10台电脑,分别标ID号为0?9。我们要对这10台电脑进行分类。假设此时我们把ID号作为属性特征之中的一个,那么此时ID号的信息增益必定是最大的。由于其将每个个体都作为一个类别直接分成10类,此时ID3算法必定会选择ID号作为主特征进行分类。其生成的决策树将会是一层十个分支的树结构,这显然并非我们想要的,由于我们知道ID号为一个无效特征。基于这个原因,我们能够使用信息增益率来作为选择特征的根据。由于根据上面对信息增益率的描写叙述我们知道当特征取值过多的时候,分母IV(A)的取值会变大。从而使得总体的信息增益率可能变小。从而能够避免选择取值非常多的无效特征的问题(如ID)。而使用信息增益率作为特征选择的根据的算法称为C4.5算法。
CART算法
CART是Classfication and Regression Tree的简称,其即能够用于分类也能够用于回归,该算法使用的是基尼指数来进行特征的选择
基尼值
基尼值的定义为
Gini(D)=∑k=1|Y|∑k′≠kpkpk′
其反映了从数据集D中随机抽取两个样本,其类别不一致的概率。由于反应的是数据类别不一致的概率,因此假设数据集D的纯度越高。则基尼值越小。这里注意,∑k′≠kpk′=1?pk,因此基尼值还能够表示为
Gini(D)=∑k=1|Y|pk(1?pk)=1?∑k=1|Y|p2k
基尼指数
对于属性A,其基尼指数定义为
Giniindex(D,A)=∑v=1V|Dv||D|Gini(Dv)
。当中V是属性A取得的不同的值。
在选择属性的时候,要选择那个使得划分后基尼指数最小的属性作为最优化分属性。
剪枝算法
在构建决策树的时候,有时候为了更好的学习训练样本,可能会学过头。使得决策树分支过多。以至于将训练数据自身的一些特征作为了全部数据的一般特征从而导致学习过拟合。因此我们须要一些方法来去掉一些分支从而减少过拟合的风险。
剪枝算法有两种,预剪枝和后剪枝。预剪枝是指在构建决策树的过程中,对每个节点在划分之前进行预计。假设划分无法带来决策树泛化性能的提升,则放弃这次划分,将该节点标记为叶子节点。而后剪枝则是先通过训练集生成一个决策树,然后再自底向上的对非叶子节点进行考察。假设将该节点相应的子树转化为一个叶子节点不会减少泛化性能。则将该子树替换为叶子节点。我们能够看到预剪枝的基本思想是贪心算法,其基于贪心策略防止这些分支的展开,这可能会导致所生成的欠拟合的问题。
而后剪枝由于通常会保留比预剪枝很多其它的分支,因此欠拟合的风险要小非常多。泛化性能通常优于预剪枝。可是后剪枝过程是在生成决策树之后,须要从底向上对树中全部非叶子节点都考察一遍,因此其训练时间要比预剪枝和不剪枝都要打非常多。