【面试考】【入门】决策树算法ID3,C4.5和CART

关于决策树的purity的计算方法能够参考:
决策树purity/基尼系数/信息增益 Decision Trees
若是有不懂得能够私信我,我给你讲。html

ID3

用下面的例子来理解这个算法:算法


下图为咱们的训练集。总共有14个训练样本,每一个样本中有4个关于天气的属性,这些属性都是标称值。输出结果只有2个类别,玩(yes)或者不玩(no):
在这里插入图片描述数据库

首先先计算整个数据集的熵Entropy:机器学习

  • 由于整个数据集只有两个类别,他们的分布几率分别是\(\frac{9}{14}\)\(\frac{5}{14}\),因此根据Entropy是:\(Entropy(S)=-(\frac{9}{14}*log_2(\frac{9}{14})+\frac{5}{14}*log_2(\frac{5}{14}))=0.94\)

而后咱们要考虑根据哪个属性进行分裂,假设根据Outlook属性进行分裂,咱们能够发现Outlook中有三个值,分别是:Sun,Rain,Overcast,分别计算他们的熵:
\(Entropy(S_{sun})=-(\frac{2}{5}*log_2(\frac{2}{5})+\frac{3}{5}*log_2(\frac{3}{5}))=0.971\)
\(Entropy(S_{overcast})=-(\frac{4}{4}*log_2(\frac{4}{4})+\frac{0}{4}*log_2(\frac{0}{4}))=0\)
\(Entropy(S_{rain})=-(\frac{3}{5}*log_2(\frac{3}{5})+\frac{2}{5}*log_2(\frac{2}{5}))=0.971\)
计算完三个Entropy后,来计算信息增益Information Gain:
\(IG(S,Outlook)=Entropy(S)-(\frac{5}{14}*Entropy(S_{sun})+\frac{5}{14}*Entropy(S_{overcast})+\frac{5}{14}*Entropy(S_{rain}))=0.246\)学习

用一样的道理,咱们能够求出来剩下的几个特征的信息增益:
\(IG(S,Wind)=0.048\)
\(IG(S,Temperature)=0.0289\)
\(IG(S,Humidity)=0.1515\)
由于outlook这个做为划分的话,能够获得最大的信息增益,因此咱们就用这个属性做为决策树的根节点,把数据集分红3个子集,而后再在每个子集中重复上面的步骤,就会获得下面这样的决策树:
在这里插入图片描述spa

ID3的缺点

  1. 若是样本中存在一个特征,这个特征中全部值都不相同(比方说是连续值的特征),这样能够想一想的出假设用这个特征做为划分,那么信息增益必定是很是大的,由于全部的划分中都只会包含一个样本;对于具备不少值的属性它是很是敏感的,例如,若是咱们数据集中的某个属性值对不一样的样本基本上是不相同的,甚至更极端点,对于每一个样本都是惟一的,若是咱们用这个属性来划分数据集,它会获得很大的信息增益,可是,这样的结果并非咱们想要的。
  2. ID3不能处理连续值属性;
  3. ID3算法不能处理具备缺失值的样本;
  4. 很是容易过拟合。

C4.5

对于有不少值得特征,ID3是很是敏感的,而C4.5用增益率Gain ratio解决了这个问题,先定义内在价值Intrinsic Value:.net

\[IV(S,a)=-\sum_{v\in values(a)}{\frac{|x\in S|value(x,a)=v|}{|S|}*log_2(\frac{|x\in S|value(x,a)=v|}{|S|})} \]

这个公式怎么理解呢?orm

  • S就是数据集样本,\(|S|\)就是样本数量;
  • a是某一个特征,比方说Outlook或者是Wind,而后\(v\in values(a)\)就是v就是a这个特征中的某一个值;
  • \(|x\in S|value(x,a)=v|\)这个就是某一个特征a是v的样本数量;
    而后决策树以前使用信息增益Information Gain来做为分裂特征的选择,如今使用增益率IG rate:

\[IGR(S,a)=\frac{IG(S,a)}{IV(S,a)} \]

可想而知,若是存在一个特征,比方说一个学生的学号(每个学生的学号都不相同),若是用ID3选择学号进行分裂,那么必定能够达到很是大的信息增益,可是其实这是无心义过拟合的行为。使用C4.5的话,咱们要计算IGR,这个学号的特征的内在价值IV是很是大的,因此IGR并不会很大,因此模型就不会选择学号进行分裂。htm

此外。C4.5能够处理连续值得划分,下面,我举例说明一下它的解决方式。假设训练集中每一个样本的某个属性为:{65, 70, 70, 70, 75, 78, 80, 80, 80, 85, 90, 90, 95, 96}。如今咱们要计算这个属性的信息增益。咱们首先要移除重复的值并对剩下的值进行排序:{65, 70, 75, 78, 80, 85, 90, 95, 96}。接着,咱们分别求用每一个数字拆分的信息增益(好比用65作拆分:用≤65和>65≤65和>65作拆分,其它数字同理),而后找出使信息增益得到最大的拆分值。所以,C4.5算法很好地解决了不能处理具备连续值属性的问题。blog

C4.5如何处理缺失值

  • 若是是训练数据中出现了缺失数据,那么就会考虑这个缺失数据全部可能的值。比方说一开始的数据库中,D1的Outlook变成了缺失值,那么D1的Outlook就会有\(\frac{4}{13}\)的几率是Sun,有\(\frac{4}{13}\)的几率是Overcast,有\(\frac{5}{13}\)的几率是Rain,而后其实也能够理解为这个样本就会变成3个样本,这三个样本有着不一样的权重。
  • 若是是在预测数据中出现了缺失数据,那么一样的,认为这个数据的这个缺失数据多是任何可能的值,这个几率就是看决策树中Outlook划分的子集的样本数量。这个地方可能有点难懂,不理解的能够看这个博文:
    机器学习笔记(7)——C4.5决策树中的缺失值处理

C4.5对决策树的剪枝处理
有两种剪枝处理方法,一个是预剪枝,一个是后剪枝,二者都是比较验证集精度,区别在于:

  • 预剪枝:从上到下进行剪枝,若是精度没有提高,那么就剪掉,这个处理在训练模型的过程当中进行;
  • 后剪枝:从下到上进行剪枝,若是剪掉精度能够提高,就剪掉,这个处理过程是在模型训练结束以后再进行的。
    一般来讲后者会比前者保留更多的分支,欠拟合的风险小,可是训练时间的开销会大一些。
    更具体地内容推荐这篇博文,讲的清晰易懂(没有必要看懂这个博文中的Python实现过程,毕竟如今sklearn库中都封装好了):
    机器学习笔记(6)——C4.5决策树中的剪枝处理和Python实现

CART

分类回归树Classification and Regression Trees与C4.5的算法是很是类似的,而且CART支持预测回归任务。而且CART构建的是二叉树。

相关文章
相关标签/搜索