决策树面试知识点最全总结(二)
决策树的生成 ID3和C4.5
1 .ID3算法:
ID3算法的核心是在决策树各个节点上应用信息增益准则选择特征,递归的构建决策树。
具体的方法是:从根节点开始,对结点计算所有可能的特征的信息增益,选择信息增益最大的特征作为该结点的特征,由该特征的不同取值建立子节点;再对子节点递归的调用以上方法,构建决策树;直到所有特征的信息增益均很小或者没有特征可以选择为止(递归终止条件)。最后得到一个决策树。
ID3算法步骤:
输入:训练数据集D,特征集A,阀值ε;
输出:决策树T
1)若D中所有实例属于同一类
Ck
C
k
,则T是单节点树,并将类
Ck
C
k
作为该结点的类标记,返回T
2)若A=∅,则T为单节点树,并将D中实例树最多的类
Ck
C
k
作为该结点的类标记,返回T
3)否则,按照信息增益的计算方法计算特征集A中的各个特征对D的信息增益,选择信息增益最大的特征
Ag
A
g
4)如果
Ag
A
g
的信息增益小于阀值ε,则T是单节点树,并将D中实例数量最大的类
Ck
C
k
作为该结点的类标记,返回T
5)否则,对
Ag
A
g
的每一个可能值
ai
a
i
,依据
Ag=ai
A
g
=
a
i
将D分割为若干非空子集
Di
D
i
,将
Di
D
i
中实例数最大的作为标记,构建子节点,由结点和子节点构成树T,返回T
6 )对第i个子结点,以
Di
D
i
为训练集,以A -
Ag
A
g
为特征集,递归的调用步(1-5),得到子树
Ti
T
i
,返回
Ti
T
i
# 输入是各个样本的类别列表
#输出是样本数量最多的样本的类别
def majorityCnt(classList):
classCount={}
for vote in classList:
if vote not in classCount.keys():
classCount[vote]=0
calssCount[vote]+=1
sortedClassCount=sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True)
return sortedClassCount[0][0]
# 创建决策树
#输入参数数据集dataSet 阀值ε
def createTree(dataSet,ε):
classList=[example[-1] for example in dataSet]
#对应1) 类别完全相同
if classList.count(classList[0])== len(classList):
return classList[0]
#对应2)特征用完了
if len(dataSet[0])==1:
return majorityCnt(classList)
#对应3) 选择最优特征
bestFeature,bestInfoGain = chooseBestFeatureToSplit(dataSet)
MyTree={dataSet[bestFeature][-1]:{}}
#对应4)最优特征的信息增益都小于阀值,那不用继续划分了
if bestInfoGain < ε:
return majorityCnt(classList)
#对应5)获取最优特征的所有特征值,根据特征值,把训练集划分到各个子训练集
bestFeatValues = [example[bestFeature] for example in dataSet]
uniqueFeatValues= set(bestFeatValues)
# 对应6)在各个子集上重复1-5
for value in uniqueFeatValues:
MyTree[dataSet[bestFeature][-1]][value]=createTree(splitDataSet(dataSet,bestFeature,value),ε)
return MyTree
利用构建好的决策树进行预测时,决策树的每个结点都在内部维护了特征及其相应的特征值,只需将待测样本的相应特征与该结点的特征值进行比较,决定样本是到那个子结点去继续比较,递归的执行这个过程知道叶子结点,待测样本的类型也就知道了。
C4.5算法
C4.5算法与ID3相似,局部进行 了改进,C4.5算法在决策树生成的过程中,用信息增益比来选择特征。
输入:训练数据集D,特征集A,阀值ε
输出:决策树T
1)若D中所有实例属于同一类
Ck
C
k
,则T是单节点树,并将类
Ck
C
k
作为该结点的类标记,返回T
2)若A=∅,则T为单节点树,并将D中实例树最多的类
Ck
C
k
作为该结点的类标记,返回T
3)否则,按照信息增益比的计算方法计算特征集A中的各个特征对D的信息增益比,选择信息增益比最大的特征
Ag
A
g
4)如果
Ag
A
g
的信息增益比小于阀值ε,则T是单节点树,并将D中实例数量最大的类
Ck
C
k
作为该结点的类标记,返回T
5)否则,对
Ag
A
g
的每一个可能值
ai
a
i
,依据
Ag=ai
A
g
=
a
i
将D分割为若干非空子集
Di
D
i
,将
Di
D
i
中实例数最大的作为标记,构建子节点,由结点和子节点构成树T,返回T
6 )对第i个子结点,以
Di
D
i
为训练集,以A -
Ag
A
g
为特征集,递归的调用步(1-5),得到子树
Ti
T
i
,返回
Ti
T
i
**注:ID3算法利用信息增益进行特征的选择,存在优先选择取值较多的特征的趋势,
C4.5算法利用信息增益比进行特征的选择,存在优先选择取值较少的特征的趋势。
实际中多采用一个启发式方法,向从所有特征选择出高于平均信息增益的特征,在从这些特征里选出信息增益率最高的特征。**