决策树

本文介绍了决策树的基本原理,包括信息熵和信息增益的概念,详细阐述了如何使用Python实现决策树的训练和测试,以及如何利用matplotlib进行决策树的可视化,增强了决策树的可解释性。
摘要由CSDN通过智能技术生成

决策树原理:

决策树核心概念
信息熵 & 信息增益
熵: 熵(entropy)指的是体系的混乱的程度,在不同的学科中也有引申出的更为具体的定义,是各领域十分重要的参量。

信息熵(香农熵): 是一种信息的度量方式,表示信息的混乱程度,也就是说:信息越有序,信息熵越低。例如:火柴有序放在火柴盒里,熵值很低,相反,熵值很高。
在这里插入图片描述
信息增益: 在划分数据集前后信息发生的变化称为信息增益
在这里插入图片描述
我们学习的ID3决策树学习算法就是以信息增益为准则来选择划分属性。

输入训练集数据

这个数据集的路径写在了函数内,可以将文件路径和labels写在自定义函数外。

def getdataSet():
    filename=open(r'C:\Users\op1691\Desktop\个人文件\学习文档\machinelearninginaction\Ch03\lenses.txt')
    dt=pd.read_csv(filename,sep='\t')
    train_dt=np.array(dt)
    dt_list=train_dt.tolist()
    labels=['age','prescript','astigmatic','tearRate']
    return dt_list,labels

计算数据集信息熵

from math import log
import operator
import gc
import pandas as pd
import numpy as np
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])/numEntries
        shannonEnt -= prob * log(prob,2) #log base 2    
    return shannonEnt #自定义函数返回信息熵

划分数据集

def splitDateSet(dataSet,axis,value):#实现数据集划分,参数:待划分数据集、划分数据集的特征、特征值的返回值
    retDataSet=[]#空列表
    for featVec in dataSet:#
        if featVec[axis]==value:#判断特征值等于特征的返回值
            reducedFeatVec=featVec[:axis]#截取某特征之前的特征数据
            reducedFeatVec.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(featList) #对某特征值进行去重,获得某特征的唯一元素取值
        newEntropy=0.0
        for value in uniqueVals
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值