解读python如何实现决策树算法

  

<强>数据描述

  

每条数据项储存在列表中,最后一列储存结果
  

  

多条数据项形成数据集

        data=https://www.yisu.com/zixun/[[d1、d2、d3…dn,结果),   (d1、d2、d3…dn,结果),   。   。   (d1、d2、d3…dn,结果]]      

决策树数据结构

        类DecisionNode:   “决策树节点   '''      def __init__(自我,坳=1,价值=https://www.yisu.com/zixun/None,结果=None,结核?None, fb=None):“初始化决策树节点      参数:   上校——按数据集的坳列划分数据集   价值——以价值作为划分坳列的参照   结果,只有叶子节点有,代表最终划分出的子数据集结果统计信息。{的结果”:结果出现次数}   rb, fb -代表左右子树   '''   self.col=坳   self.value=https://www.yisu.com/zixun/value   self.results=结果   self.tb=结核   self.fb=fb      

决策树分类的最终结果是将数据项划分出了若干子集,其中每个子集的结果都一样,所以这里采用{结“果”:结果出现次数}的方式表达每个子集

        def pideset(行、列值):   “依据数据集行的列列的值,判断其与参考值值的关系对数据集进行拆分   返回两个数据集   '''   split_function=没有   #价值是数值类型   如果isinstance(价值,int)或isinstance(价值,浮动):   #定义λ函数当行(列)祝辞=价值时返回现实   split_function=λ行:行(列)祝辞=价值   #价值是字符类型   其他:   #定义λ函数当行(列)==值时返回现实   split_function=λ行:行(列)==价值   #将数据集拆分成两个   如果split_function set2=中的(一行一行的行(行)]   关于我校=(一行一行的行如果不是split_function(行)]   #返回两个数据集   返回(set2,中的)      def uniquecounts(行):   “计算数据集行中有几种最终结果,计算结果出现次数,返回一个字典   '''   结果={}   一行的行:   r=行(len(行)1)   如果r不是结果:结果[r]=0   结果[r] +=1   返回结果      def giniimpurity(行):   “返回行数据集的基尼不纯度   '''   总=len(行)   数量=uniquecounts(行)   小鬼=0   k1的数量:   p1=(计数(k1))/总浮动   k2的数量:   如果k1==k2:继续   p2=(计数(k2))/总浮动   小鬼+=p1 * p2   返回小鬼      def熵(行):   “返回行数据集的熵   '''   从数学导入日志   log2=λx:日志(x)/日志(2)   结果=uniquecounts(行)   ent=0.0   在results.keys r ():   p=浮动(结果[r])/len(行)   ent=ent-p * log2 (p)   返回ent      def build_tree(行,scoref=熵):   “‘构造决策树   '''   如果len(行)==0:返回DecisionNode ()   current_score=scoref(行)      #最佳信息增益   best_gain=0.0   #   best_criteria=没有   #最佳划分   best_sets=没有      column_count=len(行[0])1   #遍历数据集的列,确定分割顺序   column_count坳的范围(0):   column_values={}   #构造字典   一行的行:   column_values行(col)=1   在column_values.keys价值():   (set2,中的)=pideset(行、坳值)   p=浮动(len (set2)中的)/len(行)   #计算信息增益   获得=current_score-p * scoref (set2)中的- (1 - p) * scoref ()   如果gain> best_gain和len (set2)中的祝辞0和len()在0:   best_gain=获得   best_criteria=(坳,值)   best_sets=(set2,中的)   #如果划分的两个数据集熵小于原数据集,进一步划分它们   如果best_gain> 0:   trueBranch=build_tree (best_sets [0])   falseBranch=build_tree (best_sets [1])   返回DecisionNode (col=best_criteria [0], value=https://www.yisu.com/zixun/best_criteria [1],   结核?trueBranch fb=falseBranch)   #如果划分的两个数据集熵不小于原数据集,停止划分   其他:   返回DecisionNode(结果=uniquecounts(行))      def print_tree(树,缩进="):   如果tree.results !=没有:   print (str (tree.results))   其他:   print (str (tree.col) +“:”+ str (tree.value) + & # 63;')   打印(缩进+ T→,结束=")   print_tree(树。结核病,缩进+ ')   打印(缩进+ F→,结束=")   print_tree(树。fb,缩进+ ')         def getwidth(树):   如果树。结核?=没有和树。fb==没有:返回1   返回getwidth (tree.tb) + getwidth (tree.fb)      def getdepth(树):   如果树。结核?=没有和树。fb==没有:返回0   返回马克斯(getdepth (tree.tb) getdepth (tree.fb)) + 1         def drawtree(树,jpeg=皌ree.jpg”):   w=getwidth(树)* 100   h=getdepth(树)* 100 + 120      img=Image.new (RGB, (w h), (255255255))   画=ImageDraw.Draw (img)      drawnode(画树,w/2, 20)   img.save (jpeg, jpeg)      def drawnode(画树,x, y):   如果tree.results==没有:   #每个分支的宽度   w1=getwidth (tree.fb) * 100   w2=getwidth (tree.tb) * 100      #判断这个节点所需的总空间   左=x - (w1 + w2)/2   右=x + (w1 + w2)/2      #画条件的字符串   y-10 draw.text ((* 20), str (tree.col) +“:”+ str (tree.value) (0, 0, 0))      #画树枝的链接   draw.line ((x, y,左+ w1/2 y + 100),填补=(255,0,0))   right-w2/2 draw.line ((x, y, y + 100),填补=(255,0,0))      #画出分支节点   drawnode(画,tree.fb,左+ w1/2 y + 100)   drawnode(画,tree.tb right-w2/2 y + 100)   其他:   txt=' \ n '。加入([' % s: % d % v v的tree.results.items ()))   draw.text ((txt×20, y) (0, 0, 0))

解读python如何实现决策树算法