统计学习方法学习笔记-决策树(三)之Python实现一棵决策树(基于C4.5算法)

在之前的决策树模型详解(一)之如何进行特征选择
以及决策树模型详解(二)之如何生成决策树以及剪枝 我们已经学习完了决策树算法的三个步骤 特征选择 决策树生成 决策树剪枝
在这篇文章中,就要给大家展示一下基于C4.5生成算法如何来构建一棵决策树,以及如何对决策树进行剪枝

决策树的一个分支

class Edge: #代表树的一个分支
    def __init__(self,  child, value):
        self.child=child #这个边连接的结点
        self.value=value #这个边的值

决策树的一个结点

class Node:
    def __init__(self,data,edges,feature,value):
# data表示这个结点包含的数据,childs表示该结点的孩子结点(因为基于C4.5算法的决策树并不是一棵二叉树,feature表示该结点是以哪个特征来划分子结点的,value是分类值 只有叶结点才有取值
     self.data=data
     self.edges=edges
     self.feature=feature
     self.value=value

决策树模型

class Decision_Tree:#基于C4.5算法的决策树
    def __init__(self,Train,features,label,a,b,feature_name):#features是当前可用特征集初始时是所有特征
        self.train=Train
        self.features=features
        self.label=label#标签所在列
        self.b=b#信息增益比的阈值
        self.a=a #损失函数的参数
        self.T = 0  # 一共有多少叶子结点
        self.CT = 0
        self.feature_name = feature_name
        self.root=self.create_tree(Train)
    def information_entropy(self,data,label):#计算data数据集的信息熵 label表示以哪一列作为求信息熵的基准
        labels=self.class_num(data,label)
        #print(labels)
        ie=0
        for k,v in labels.items():#计算信息熵
            p=v/data.shape[0]
            if p!=0:
              ie+= -p*math.log2(p)
        return ie # 返回信息熵
    def conditional_entropy(self,data,feature): #计算条件熵  feature表示条件熵中的特征的列值 label表示标签的列值
        fv=self.class_num(data,feature)
        datas={
   }# 根据feature的不同取值划分出多个数据块 存放在datas中
        ce=0
        for k,v in fv.items():
            d=data[(data[:, feature] == k),: ] #把feature那一列取值为k的数据放在一起
            datas[k]=d
        for k,v in datas.items():
            p=fv[k]/data.shape[0]
            ie=self.information_entropy(v,self.label)
            ce+=p*ie
        return ce #返回条件熵 ief 是数据集data 关于特征feature的值的熵
    def information_gain(self,data,feature):# 计算某个特征的信息增益比
        ie=self.information_entropy(data,self.label)
        ce=self.conditional_entropy(data,feature)
        ief=self.information_entropy(data,feature)
        # print(ie)
        # print(ce)
        ig=ie-ce
        # if ief !=0:
        #   return  ig / ief
        # else:
        return ig

    def processing_continuous_values(self,data,feature):#对连续值进行处理
        data = data
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值