<强>数据描述强>
每条数据项储存在列表中,最后一列储存结果
多条数据项形成数据集
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如何实现决策树算法