《机器学习实战》学习笔记第三章-决策树

本文详细介绍了决策树的构造过程,包括计算熵、划分数据集、选择最佳划分方式和递归构建决策树。同时,讨论了决策树的优点和缺点,以及适用的数据类型。通过实例展示了如何构建和使用决策树,以及如何存储决策树结构。
摘要由CSDN通过智能技术生成

决策树构造

目录

决策树构造

构建决策树

计算数据集的熵

划分数据集

选择数据集最好划分方式

递归构建决策树

画决策树图

使用算法

构建分类器

存储决策树

实例:预测隐形眼镜类型

建立一个树状模型,每个节点筛选出不同结果

优点:直观,好理解、计算复杂度不高、对中间缺失值不敏感、可以处理不相关特征数据、可以解释数据内在含义

缺点:1.对于树最大深度这个预制参数很敏感:决策树深度太大,可能OVERFIT;深度太小,可能UNDERFIT。2.计算效率不高,在数据量很大时,数据维度很高时计算很慢

使用数据范围:数值型和标称型

决策树的一般流程:

1.收集数据

2.准备数据:ID3算法只适用于标称型数据,数值型数据必须离散化

3.分析数据:任何方法,构造树完成之后,应检查图形是否符合预期

4.训练算法:构造树的数据结构

5.测试算法:使用经验树计算错误率

ID3算法的核心是根据信息增益来选择进行划分的特征,然后递归地构建决策树

创建分支的代码是递归函数

判断如何划分数据集(节点如何选择)的标准是最大熵增益(信息增益):原节点的熵与某一层节点的所有熵之和 之差

构建决策树

计算数据集的熵

from math import log 

def calcShannonEnt(dataSet):
    numEntries = len(dataSet) #数据集中实例的数量
    labelCounts={}
    for featVec in dataSet:
        currentLabel = featVec[-1] #key为最后一列的label值
        if currentLabel not in labelCounts.keys():
            labelCounts[currentLabel]=0
        labelCounts[currentLabel]+=1
    shannonEnt = 0.0
    for key in labelCounts:
        prob = float(labelCounts[key])/numEntries #当前key出现的概率
        shannonEnt -= prob*log(prob,2)
    return shannonEnt

创一个小数据集验证熵的计算

def createDataSet():
    dataSet = [[1,1,'yes'],[1,1,'yes'],[1,0,'no'],[0,1,'no'],[0,1,'no']]
    labels = ['no','flippers']
    return dataSet,labels
myDat,labels=createDataSet()
mm = calcShannonEnt(myDat)
print(mm)

划分数据集

def splitDataSet(dataSet,axis,value): #(myDat,0,1)
    retDataSet = []
    for featVec in dataSet:#[1,1,'yes']
        if featVec[axis] == value: #1=1 
            reducedFeatVec = featVec[:axis] #无
            reducedFeatVec.extend(featVec[axis+1:])#列表后加1,'yes'
            retDataSet.append(reducedFeatVec)#加一个[1,'yes']
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值