【机器学习】决策树的创建、使用决策树进行分类

目录

一、决策树的创建

1.决策树概念

2.决策树的基本流程

3.决策树的目的

二、使用决策树进行分类

1.划分选择

2.信息增益

3.增益率

4.基尼指数


一、决策树的创建

1.决策树概念

机器学习中,决策树是一个预测模型;他代表的是对象属性与对象值之间的一种映射关系。树中每个节点表示某个对象,而每个分叉路径则代表的某个可能的属性值,而每个叶结点则对应从根节点到该叶节点所经历的路径所表示的对象的值。

分类决策树模型是一种描述对实例进行分类的树形结构。决策树由 结点 有向边 组成。结点有两种类型: 内部结点 叶节点 。内部结点表示一个特征或属性,叶节点表示一个类。
【机器学习】决策树的创建、使用决策树进行分类_第1张图片

2.决策树的基本流程

【机器学习】决策树的创建、使用决策树进行分类_第2张图片

3.决策树的目的

决策树学习的目的是为了产生一棵 泛化能力强 处理未见示例能力强的决策树

二、使用决策树进行分类

1.划分选择

决策树学习的关键在于 如何选择最优划分属性 。一般而言,随着划分过程不断进行,我们希望决策树的分支结点所包含的样本 尽可能属于同一类别,即结点的“纯度”(purity)越来越高。
经典的属性划分方法:
–信息增益: ID 3
–增益率:C 4.5
–基尼指数:CART

2.信息增益

离散属性 a V 个可能的取值 { a 1 , a 2 , ..., a V } ,用 a 来进行划分,则会产生V 个分支结点,其中第 v 个分支结点包含了 D 中所有在属性 a 上取值为 a v 的样本,记为 D v 。则可计算出用属性 a 对样本集 D 进行划分所获得的“信息增益” :
【机器学习】决策树的创建、使用决策树进行分类_第3张图片
一般而言, 信息增益越大 ,则意味着使用属性 a 来进行划分所获得的“ 纯度提升 ”越大。
实现代码:
def chooseBestFeatureToSplit(dataSet):
    #特征数量,-1是因为最后一列是类别标签
    numFeatures = len(dataSet[0]) - 1
    #计算数据集的原始香农熵
    baseEntropy = calcShannonEnt1(dataSet)
    bestInfoGain = 0.0                       #信息增益赋初值0
    bestFeature = -1                         #最优特征的索引值
    for i in range(numFeatures):
        #获取dataSet的第i个所有特征存到featList中
        featList = [example[i] for example in dataSet]
        #print(featList)  #每个特征的15项特征值列表
        #创建set集合{},元素不可重复
        uniqueVals = set(featList)
        newEntropy = 0.0
        for value in uniqueVals:
            #subDataSet划分后的子集
            subDataSet = splitDataSet(dataSet,i,value)
            #计算子集的概率=子集个数/整个训练样本数
            prob = len(subDataSet)/float(len(dataSet))
            #计算香农熵
            newEntropy += prob * calcShannonEnt(subDataSet)
        #计算信息增益
        infoGain = baseEntropy - newEntropy
        #print("第%d个特征的增益为%.3f" %(i,infoGain))
        #C4.5算法:计算增益比(信息增益率)
        #infoGain2 = (baseEntropy - newEntropy)/baseEntropy
        if (infoGain >bestInfoGain):
            bestInfoGain = infoGain      #更新信息增益,找到最大的信息增益
            bestFeature = i              #记录信息增益最大的特征的索引值
    return bestFeature                   #返回信息增益最大的特征的索引值

3.增益率

可定义增益率:
 
其中
 
称为属性 a 的“固有值” [Quinlan, 1993] 属性 a 的可能取值数目越多(即V 越大),则 IV( a ) 的值通常就越大。
实现代码:
def calcShannonEnt1(dataSet, method = 'none'):
    numEntries = len(dataSet)
    labelCount = {}
    for feature in dataSet:
        if method =='prob': #当参数为prob时转而计算增益率
            label =  feature
        else:
            label = feature[-1]
        if label not in labelCount.keys():
            labelCount[label]=1
        else:
            labelCount[label]+=1
    shannonEnt = 0.0
    for key in labelCount:
        numLabels = labelCount[key]
        prob = numLabels/numEntries
        shannonEnt -= prob*(log(prob,2))
    return shannonEnt
#增益率
def chooseBestFeatureToSplit2(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]
        newEntropyProb = calcShannonEnt1(featList, method='prob') #计算内部增益率
        uniqueVals = set(featList)
        newEntropy = 0.0
        for value in uniqueVals:
            # 通过不同的特征值划分数据子集
            subDataSet = splitDataSet(dataSet, i, value)
            prob = len(subDataSet)/float(len(dataSet))
            newEntropy += prob *calcGini(subDataSet)
        newEntropy  = newEntropy*newEntropyProb
        infoGain = baseEntropy - newEntropy #计算每个信息值的信息增益
        if(infoGain > bestInfoGain):
            bestInfoGain = infoGain
            bestFeature = i
    return bestFeature #返回信息增益的最佳索引

4.基尼指数

【机器学习】决策树的创建、使用决策树进行分类_第4张图片
在候选属性集合 A 中,选择那个使得 划分后 基尼指数最小的属性作为最有划分属性。
实现代码:
#基尼指数
def calcGini(dataset):
    feature = [example[-1] for example in dataset]
    uniqueFeat = set(feature)
    sumProb =0.0
    for feat in uniqueFeat:
        prob = feature.count(feat)/len(uniqueFeat)
        sumProb += prob*prob
    sumProb = 1-sumProb
    return sumProb
def chooseBestFeatureToSplit3(dataSet): #使用基尼系数进行划分数据集
    numFeatures = len(dataSet[0]) -1 #最后一个位置的特征不算
    bestInfoGain = np.Inf
    bestFeature = 0.0
    for i in range(numFeatures):
        featList = [example[i] for example in dataSet]
        uniqueVals = set(featList)
        newEntropy = 0.0
        for value in uniqueVals:
            # 通过不同的特征值划分数据子集
            subDataSet = splitDataSet(dataSet, i, value)
            prob = len(subDataSet)/float(len(dataSet))
            newEntropy += prob *calcGini(subDataSet)
        infoGain = newEntropy
        if(infoGain < bestInfoGain): # 选择最小的基尼系数作为划分依据
            bestInfoGain = infoGain
            bestFeature = i
    return bestFeature #返回决策属性的最佳索引

你可能感兴趣的:(决策树,人工智能)