ITPub博客

首页 > 数据库 > 数据库开发技术 > 决策树代码代码——python源代码,看完你就完全懂了

决策树代码代码——python源代码,看完你就完全懂了

原创 数据库开发技术 作者:quincyqiang 时间:2021-05-21 09:14:00 0 删除 编辑

决策树在周志华的西瓜书里面已经介绍的很详细了(西瓜书P73-P79),那也是我看过讲的最清楚的决策树讲解了,我这里就不献丑了,这篇文章主要是分享决策树的代码。

在西瓜书中介绍了三种决策树,分别为ID3,C4.5和CART三种决策树,三种树除了分裂的计算方法不一样之外,其余的都一样,大家可以多看看书,如果有什么不清楚的可以看看我的代码,决策树的代码算是很简单的了,我有朋友面试的时候就被要求写决策树代码。话不多说了,下面开始吧。

本篇文章的数据来自于西瓜中的西瓜数据,也是我纯手打下来的。下面一起看看代码吧

import pandas as pd
import numpy as np
from math import log
dataset=pd.read_csv('西瓜数据集.csv',encoding='utf-8')

导入所需要的包,本人比较懒直接用Pandas库来实现了,用这个库的话很方便。

def calShanEnt(dataset,col):
    tarset=set(dataset[col])
    res=0
    for i in tarset:
        pi=np.sum(dataset[col] == i)/len(dataset)
        res=res-pi* log(pi, 2)
    return res

第一个函数,计算香农值。

def splitData(Data,fea,value):
    res=Data[Data[fea]==value].copy()
    res=res.drop(fea,axis=1)
    return res

第二个函数,分裂函数

def ID3(value_set,dataset,fea):
    baseEnt = calShanEnt(dataset, "target")
    newEnt = 0
    for v in value_set:
        newEnt += np.sum(dataset[fea] == v) / len(dataset) * calShanEnt(dataset[dataset[fea] == v],"target")
    return baseEnt-newEnt

ID3树的计算函数

def C4_5(value_set,dataset,fea):
    gain=ID3(value_set,dataset,fea)
    IVa=calShanEnt(dataset,fea)
    return gain/IVa

C4_5树的计算函数,从这个函数中可以很清楚的看出,ID3树和C4_5树分裂函数的区别。

def Gini(dataset,col):
    tarset = set(dataset[col])
    gini=1
    for i in tarset:
        gini=gini-(np.sum(dataset[col] == i)/len(dataset))**0.5
    return gini

def CART(value_set,dataset,fea):
    Gini_index = 0
    for v in value_set:
        Gini_index += np.sum(dataset[fea] == v) / len(dataset) * Gini(dataset[dataset[fea] == v],"target")
    return Gini_index

CART树的分裂计算函数,上面是Gini指数的计算,下面是计算从该特征分裂的收益。

def chooseBestFea(dataset):
    features=[i for i in dataset.columns if i!='target']
    bestFet=features[0]
    bestInfoGain=-1
    for fea in features:
        value_set=set(dataset[fea])
        # gain=ID3(value_set,dataset,fea)##这是调用ID3增益的函数
        # gain=C4_5(value_set,dataset,fea)
        gain=CART(value_set,dataset,fea)
        if gain>bestInfoGain:
            bestInfoGain=gain
            bestFet=fea
    return bestFet

分裂特征搜索,可以在这里设置使用哪个树(ID3,C4_5或者CART)进行建模

def creatTree(dataset):
    if len(dataset.columns)==1:
        return dataset['target'].value_counts().index[0]
    if len(set(dataset['target']))==1:
        return list(dataset['target'])[0]
    bestFea=chooseBestFea(dataset)
    myTree={bestFea:{}}
    for i in set(dataset[bestFea]):
        myTree[bestFea][i]=creatTree(splitData(dataset,bestFea,i))
    return myTree
T=creatTree(dataset)

以上就是建立一个决策树的主流程。本次关于决策树的代码分享到这里,关注challengeHub公众号回复决策树即可获得西瓜数据和完整的决策树代码。 

想了解更多算法,数据分析,数据挖掘等方面的知识,欢迎关注ChallengeHub公众号,添加微信进入微信交流群,或者进入QQ交流群。关注公众号或者进群可以直接获得上面的代码,而且也有很多机器学习的资料可以获取。

分享,点赞,在看,
都在这儿,点我不香吗?
扫描下方的二维码进入ChallengeHub粉丝群,也可以添加管理员微信拉您入群。
与爱好AI的朋友们共同成长
ChallengeHub粉丝群
管理员微信


推荐阅读:

隐形马尔可夫链代码


原文作者:ChallengeHub;如有侵权,请联系管理员删除。

下一篇: 当NLP遇见PySpark
请登录后发表评论 登录
全部评论

注册时间:2019-01-07

  • 博文量
    350
  • 访问量
    161006