集体智慧编程——决策树建模(上)

来源:http://www.sh-fengwen.com 作者:美高梅游戏平台网站 人气:93 发布时间:2019-09-05
摘要:常用的维系工具,譬如手提式有线电话机,QQ是和曾经认知的敌人沟通的工具。今后面世了一大批判自诩的约炮神器,非诚勿扰挺赏心悦指标,屌丝御宅女的主题素材操碎了爸妈的心,

常用的维系工具,譬如手提式有线电话机,QQ是和曾经认知的敌人沟通的工具。今后面世了一大批判自诩的约炮神器,非诚勿扰挺赏心悦指标,屌丝御宅女的主题素材操碎了爸妈的心,世纪佳缘都上市了,看来我们对想认知不认得的人有伟大的满腔热情。笔者也闻讯非诚勿扰携手成功后最终走到一块儿的并相当少,这一个主意毕竟靠不可信?要是小编去参与非诚勿扰,作者会不会执手成功?这之中是或不是有一对规律可循,趁着明日被毁容不能够出门,我就来学习一下决策树。

正文主要介绍一种非常火的归类算法:决策树分类算法。

高级中学先生平时让大家填一些表,各类本性和IQ检查测试。这么些考试里相当多是十几道难点,每道标题选用“是”也许“否”,那正是决策树的为主原型了。十几道标题也正是十二种要注重的成分,每道题指标抉择便是决策树的三个核定,假若难点一选项了“是”,那就跳到标题2,假若接纳“否”,那就跳到难点3,决策树也等于那个样子,这么些因素的判别调节和测验是不是成立,创造了就走创制的道岔,不树立就走不树立的分段,那样下去,决策树就像以树状方式排列的一密密麻麻if-else语句。

事例:一个网址上有多少客户会愿意为某个高档会员功效而付出费用。

[python]
if (因素A成立): 
    if (因素B1成立): 
        ... 
            if (因素N11成立): 
                你能够到场非诚勿扰 
            else: 
                你不得以参预非诚勿扰 
    else: 
        ... 
            if (因素N12成立): 
                你能够参预非诚勿扰 
            else: 
                你不得以插手非诚勿扰 
else: 
    if (因素B2成立): 
        ... 
            if (因素N21成立): 
                你能够参预非诚勿扰 
            else: 
                你不得以加入非诚勿扰 
    else: 
        ... 
            if (因素N22成立): 
                你能够出席非诚勿扰 
            else: 
                你不可能插足非诚勿扰 

步骤一:导入数据;

if (因素A成立):
    if (因素B1成立):
        ...
            if (因素N11成立):
                你能够参加非诚勿扰
            else:
                你不得以参与非诚勿扰
    else:
        ...
            if (因素N12成立):
                你可以出席非诚勿扰
            else:
                你不得以参预非诚勿扰
else:
    if (因素B2成立):
        ...
            if (因素N21成立):
                你能够参预非诚勿扰
            else:
                你不能参加非诚勿扰
    else:
        ...
            if (因素N22成立):
                你能够插足非诚勿扰
            else:
                你不得以插足非诚勿扰

新建一个treepredict.py的问价,将下边数据写入。数据的现实新闻分级是:来源网址,地方,是不是读过FAQ,浏览网页数,选取服务类型。

大家的指标正是依附已知的多寡,创设出那棵树。

my_data=[['slashdot','USA','yes',18,'None'],
        ['google','France','yes',23,'Premium'],
        ['digg','USA','yes',24,'Basic'],
        ['kiwitobes','France','yes',23,'Basic'],
        ['google','UK','no',21,'Premium'],
        ['(direct)','New Zealand','no',12,'None'],
        ['(direct)','UK','no',21,'Basic'],
        ['google','USA','no',24,'Premium'],
        ['slashdot','France','yes',19,'None'],
        ['digg','USA','no',18,'None'],
        ['google','UK','no',18,'None'],
        ['kiwitobes','UK','no',19,'None'],
        ['digg','New Zealand','yes',12,'Basic'],
        ['slashdot','UK','no',21,'None'],
        ['google','UK','yes',18,'Basic'],
        ['kiwitobes','France','yes',19,'Basic']]

概念理清楚了,作者来一点一点兑现这么些算法。

二:引进决策树:

[python] 
my_data=[['beijing','yes','yes',28,'yes'], 
        ['hebei','no','no',23,'no'], 
        ['henan','yes','no',24,'yes'], 
        ['hubei','no','yes',28,'no'], 
        ['hunan','yes','yes',39,'no']] 

决策树是一种相比较简单的机械学习方法。它是对被侦查对象数据进行分类的一种十二分直观的方法,当决策树经过练习后,看上去就像是以树叶形状排序的if-then语句。

my_data=[['beijing','yes','yes',28,'yes'],
        ['hebei','no','no',23,'no'],
        ['henan','yes','no',24,'yes'],
        ['hubei','no','yes',28,'no'],
        ['hunan','yes','yes',39,'no']]
上边是本身捏造的的多寡,下边依据那五条数据来营造决策树。客户A,东京人,有房有车,二十十岁,携手成功;顾客B,江西人,没房没车,贰十一岁,执手战败;客户C,台湾人,有房没车,二十四周岁,执手成功;客户D,青海人,没房有车,二十二岁,携手退步;顾客E,湖北人,有车有房,四十周岁,携手失利。

倘诺我们有了决策树,依照此举行表决的经过就会变得很粗略了,只必要沿着树的路径一贯向下,直到叶子节点就足以了。

第一步:定义节点结构;第二步:对输入数据分组;第三步:选拔拆分数据的评头品足模型;第四步:构造决策树;第五步:用决策树进行判定;第六步:剪枝;第七步:数据相当不够管理。

请新建二个类,取名称为decisionnode,他表示树上的每个节点:

 

class decisionnode:
        def __init__(self,col=-1,value=None,results=None,tb=None,fb=None):
            self.col=col
            self.value=value
            self.results=results
            self.tb=tb
            self.fb=fb

第一步:定义节点结构:

每一个节点都有5个实例变量,那5个实例变量在伊始化的时候棉被服装置。

种种节点必需表明本人意味着的不胜考查因素,二个创立恐怕不树立的判别规范,三个对准条件建设构造后的要实行下一个节点,一个对准条件不树立后要一口咬定的下贰个节点。借使是末级叶子节点,还索要三个结实节点,来指明要不要列席非诚勿扰。

1.col是待查实的论断标准所对应的列索引值

[python]
class decisionnode: 
  def __init__(self,col=-1,value=None,results=None,tb=None,fb=None): 
    self.col=col 
    self.value=value 
    self.results=results 
    self.tb=tb 
    self.fb=fb 

2.value对应于为了使结果为true,当前列必得同盟的值

class decisionnode:
  def __init__(self,col=-1,value=None,results=None,tb=None,fb=None):
    self.col=col
    self.value=value
    self.results=results
    self.tb=tb
    self.fb=fb个中,col代表的要察看的成分是输入数据的那一列;valus便是剖断标准;results是卡牌节点保存最终判别结果的变量;tb,fb分别是准则value创立指向的分支和条件value不创立指向的支行。

3。tb,fb也是decisionnode,他们分别对应于结果为true或然false时,树上相对于这段时间节点的子树上的节点

 

4.results保留的是针对性近来支行的结果,它是贰个字典。除了叶子节点以外,在别的节点上该值都为None

其次步:分组输入数据:

三:对数进行陶冶

大家着想因素有八个,祖籍,房,车和年龄。祖籍是字符型,年龄是整数型,是或不是有车有房是布尔型;假使大家依据是或不是有房分组,能够将顾客分为[A,C,E]和 [B,D],假设依据是还是不是有车分组,能够将客商分为[A,D,E]和 [B,C];若是依照年龄是不是高于等于39分组,可分为 [E]和[A,B,C,D];依照年龄是不是凌驾等于28分组,可分为[A,D,E]和 [B,C]; 依据是还是不是是法国巴黎人,分为[A]和[B,C,D,E]...

  大家应用一种叫CART(分类回归树)的算法。为了社团决策树,算法首先创立贰个根节点。然后经过评价表中的具有的观察变量,从中接纳三个最合适的变量对数码开展拆分。

[python]
def divideset(rows,column,value): 
   split_function=None 
   if isinstance(value,int) or isinstance(value,float): 
      split_function=lambda row:row[column]>=value 
   else: 
      split_function=lambda row:row[column]==value 
    
   # Divide the rows into two sets and return them  
   set1=[row for row in rows if split_function(row)] 
   set2=[row for row in rows if not split_function(row)] 
   return (set1,set2) 

函数divideset的法力是依靠列表中的某一栏的多寡将列表进行拆分成四个数据集。该函数接受四个列表,四个提醒表中列所在地方的数字,和三个用于对列实行拆分的仿照效法值作为参数。算法会重临多个列表:第三个列表是满足条件的数据,第贰个是不满足的。

def divideset(rows,column,value):
   split_function=None
   if isinstance(value,int) or isinstance(value,float):
      split_function=lambda row:row[column]>=value
   else:
      split_function=lambda row:row[column]==value
  
   # Divide the rows into two sets and return them
   set1=[row for row in rows if split_function(row)]
   set2=[row for row in rows if not split_function(row)]
   return (set1,set2)divideset函数,依照第column列的值是还是不是等于value,也许超越等于value来对输入rows数据,结果分为两组,一组符合条件,一组不符合条件

def divideset(rows,column,value):
        split_function=None
        if isinstance(value,int) or isinstance(value,float):
                split_function=lambda row:row[column]>=value
        else:
                split_function=lambda row:row[column]==value
        set1=[row for row in rows if split_function(row)]
        set2=[row for row in rows if not split_function(row)]
        return (set1,set2)

 

留神上述代码中lambda表明式的意义,不清楚的能够查阅:

其三步:拆分数据的评说模型:

 

其次步对数据依照因素的值来分组,每一步依据哪个因素的哪些取值来分组对比好呢?是是不是有房恐怕年纪不可能太大啊?有未有可判断的凭仗?有!大家要做的,正是搜索十分的因素,使依据该因素divideset后变化的两组数据集的混杂程度尽或者的小。

>>> import treepredict
>>> treepredict.divideset(treepredict.my_data,2,'yes')
([['slashdot', 'USA', 'yes', 18, 'None'], ['google', 'France', 'yes', 23, 'Premium'], ['digg', 'USA', 'yes', 24, 'Basic'], ['kiwitobes', 'France', 'yes', 23, 'Basic'], ['slashdot', 'France', 'yes', 19, 'None'], ['digg', 'New Zealand', 'yes', 12, 'Basic'], ['google', 'UK', 'yes', 18, 'Basic'], ['kiwitobes', 'France', 'yes', 19, 'Basic']],
 [['google', 'UK', 'no', 21, 'Premium'], ['(direct)', 'New Zealand', 'no', 12, 'None'], ['(direct)', 'UK', 'no', 21, 'Basic'], ['google', 'USA', 'no', 24, 'Premium'], ['digg', 'USA', 'no', 18, 'None'], ['google', 'UK', 'no', 18, 'None'], ['kiwitobes', 'UK', 'no', 19, 'None'], ['slashdot', 'UK', 'no', 21, 'None']])

先定义个一个小工具函数,这几个函数重回rows里各类只怕结果和结果的面世的次数;

四:选取最合适的拆分方案
率先,我们需求对数码集结中的每一种结果开展计数,代码如下:

[python] 
def uniquecounts(rows): 
   results={} 
   for row in rows: 
      # The result is the last column  
      r=row[len(row)-1] 
      if r not in results: results[r]=0 
      results[r]+=1 
   return results 

def uniquecounts(rows):
        results={}
        for row in rows:
                r=row[len(row)-1]  #last row  result
                #print r
                if r not in results:results[r]=0
                results[r]+=1
        return results

def uniquecounts(rows):
   results={}
   for row in rows:
      # The result is the last column
      r=row[len(row)-1]
      if r not in results: results[r]=0
      results[r]+=1
   return results 基尼不纯度:现在自集结中某种结果随机应用于聚聚焦某一数目项的预想测量误差率:

地点函数的成效是找寻不一致的大概结果,并赶回三个字典,个中富含了各样结果的面世次数。

[python] 
def giniimpurity(rows): 
  total=len(rows) 
  counts=uniquecounts(rows) 
  imp=0 
  for k1 in counts: 
    p1=float(counts[k1])/total 
    for k2 in counts: 
      if k1==k2: continue 
      p2=float(counts[k2])/total 
      imp+=p1*p2 
  return imp 

接下去我们着重基尼不纯度和熵。

def giniimpurity(rows):
  total=len(rows)
  counts=uniquecounts(rows)
  imp=0
  for k1 in counts:
    p1=float(counts[k1])/total
    for k2 in counts:
      if k1==k2: continue
      p2=float(counts[k2])/total
      imp+=p1*p2
  return imp
该函数利用集结中每一类结果出现的次数除以集合的根据地数来计量相应的概率,然后将富有那么些可能率值的乘积存加起来。那样就收获某一行数据被随机分到错误结果的总可能率。这一概率的值越高,就注解对数据的拆分越不精粹。

对此基尼不纯度和熵值不打听的请参照他事他说加以考察《数据开采——概念与手艺》中,大概百度(嘿嘿,公式相比较麻烦,四弟就不写了)

熵:代表聚焦的严节程度,也便是汇集的掺和程度:

1.基尼不纯度:是指以后自会集中的有些结果随机应用于聚聚集某一数据项的预想舍入误差率。总计函数如下:

[python] 
def entropy(rows): 
   from math import log 
   log2=lambda x:log(x)/log(2)   
   results=uniquecounts(rows) 
   # Now calculate the entropy  
   ent=0.0 
   for r in results.keys(): 
      p=float(results[r])/len(rows) 
      ent=ent-p*log2(p) 
   return ent 

def giniimpurity(rows):
        total=len(rows)
        counts=uniquecounts(rows)
        #print tatal,counts
        imp=0
        for k1 in counts:
                p1=float(counts[k1])/total
                #print p1
                for k2 in counts:
                        if k1==k2:continue
                        p2=float(counts[k2])/total
                        #print p2
                        imp+=p1*p2
                        #print imp
        return imp

def entropy(rows):
   from math import log
   log2=lambda x:log(x)/log(2) 
   results=uniquecounts(rows)
   # Now calculate the entropy
   ent=0.0
   for r in results.keys():
      p=float(results[r])/len(rows)
      ent=ent-p*log2(p)
   return ent这是测量结果里面距离程度的推断方法,借使具备结果都同样,举例遵照某种方式分组后的客户都有车,那么熵就是0。群组越是混乱,熵就越高。

该函数利用群集中每三个项结果出现的次数除以集结的总店数来测算相应的可能率,然后将那一个可能率的值的乘积存加起来。这样就能够拿走某一行数据被任性分配到不当结果的总概率。该值越小越好

 

2.熵:代表聚焦的冬辰程度——基本上就也就是聚集的插花程度。函数如下:

第四步:营造决策树:

def entropy(rows):
        from math import log
        log2=lambda x:log(x)/log(2)
        results=uniquecounts(rows)
        ent=0.0
        for r in results.keys():
                p=float(results[r])/len(rows)
                ent=ent-p*log2(p)
        return ent

本文由美高梅游戏平台网站发布于美高梅游戏平台网站,转载请注明出处:集体智慧编程——决策树建模(上)

关键词:

最火资讯