机器学习-决策树

决策树是一种机器学习的方法。决策树的生成算法有ID3,C4.5和C5.0等。决策树是一种树形结构,其中每个内部节点表示一个属性上的判断,每个分支代表一个判断结果的输出,最后每个叶节点代表一种分类结果。

算法 算法描述
ID3 其核心是在决策树的各级节点上,使用信息增益作为属性的选择标准,来帮助确定每个节点所应该采用的合适属性。
C4.5 C4.5决策树生产算法相对于ID3算法的重要改进是使用信息增益率来选择节点属性。C4.5算法既能够处理离散的描述属性,也可以处理连续的描述属性。
C5.0 是C4.5的修订版,适用于处理大数据集,采用Boosting方式提高模型准确率,根据能够带来的最大信息增益的字段拆分样本。
CART算法 CART决策树是一种十分有效的非参数分类和回归方法,通过构建树、修建树、评估树来构建一个二叉树。当终结点是连续变量时,该树为回归树;当终结点是分类变量时,该树为分类树。

本文采用ID3算法划分数据集。
1、信息增益
H = − ∑ i = 1 n p ( x i ) l o g 2 p ( x i ) H=-\sum_{i=1}^{n}p(xi){log_{2}}^{}p(xi) H=i=1np(xi)log2p(xi)
代码实现:

from math import log  #计算信息熵
def calcShannonEnt(dataSet):
    numEntries = len(dataSet)
    labelCounts={}
    for featVec in dataSet:        
    	currentLabel = featVec[-1]        
    	if currentLabel not in labelCounts.keys():  
        labelCounts[currentLabel]=0        
    	labelCounts[currentLabel]+=1    
    shannonEnt = 0.0    
    for key in labelCounts:       
    	prob = float(labelCounts[key])/numEnrtries 
    	shannonEnt -= prob*log(prob,2)       		   		    	      
    return shannonEnt

2、划分数据集

#按照给定特征划分数据集
def splitDataSet(dataSet. axis, value):    		
	retDataSet = []
   	for featVec in dataSet:        
   	if featVec[axis] == value:
   	        reducedFeatVec = featVec[:axis]
		reducedFearVec.extend(featVec[axis+1:])
		retDataSet.append(reducedFeatvec)                           	     
   	return retDataSet
#选择最好的数据集划分方式
def chooseBestFeatureToSplit(dataSet):
    numFeatures = len(dataSet[0])-1
    baseEntropy = calcShannonEnt(dataSet)
    bestInfoGain = 0.0; bestFeature = -1
    for i in range(numFeatures):
        featList = [example[i] for example in dataSet]
        uniqueVals = set(fearlist)
        newEntropy = 0.0
        for value in uniqueVals:
            subDataSet = splitDataSet(dataSet, i , value)
            prob = len(subDataSet)/float(len(dataSet))
            newEntropy += prob * calcShannonEnt(subDataSet)
        infoGain = baseEntropy - newEntropy
        if(infoGain>bestInfoGain):
            bestInfoGain = infoGain
            bestFeature = i
        return bestFeatuer

3、递归构建决策树

#创建树的函数代码
def creatTree(dataSet,labels):
    classList = [example[-1] for example in dataSet]
    if classList.count(classList[0]) == len(classList):
        return classList[0]
    if len(dataSet[0]) == 1:
        return majorityCnt(classList)
    bestFeat = chooseBestFeatureToSplit(dataSet)
    bestFeatLabel = labels[bestFeat]
    mtTree = {bestFeatLabel:{}}
    del(labels[bestFeat])
    featValues = [example[bestFeat] for example in dataSet]
    uniqueVals = set(featValues)
    for value in uniqueVals:
        subLabels = labels[:]
        myTree[bestFeatLabel][value] = creatTree(splitDataSet\(dataSet, bestFeat, value),subLabels)
    return myTree

你可能感兴趣的:(决策树,机器学习)