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

本文主要介绍一种非常流行的分类算法:决策树分类算法。

例子:一个网站上有多少用户会愿意为某些高级会员功能而支付费用。

步骤一:导入数据;

新建一个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‘]]

二:引入决策树:

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

一旦我们有了决策树,根据此进行决策的过程就会变得很简单了,只需要沿着树的路径一直向下,直到叶子节点就可以了。

请新建一个类,取名为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是待检验的判断条件所对应的列索引值

2.value对应于为了使结果为true,当前列必须匹配的值

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

4.results保存的是针对当前分支的结果,它是一个字典。除了叶子节点以外,在其他节点上该值都为None

三:对数进行训练

我们使用一种叫CART(分类回归树)的算法。为了构造决策树,算法首先创建一个根节点。然后通过评价表中的所有的观测变量,从中选择一个最合适的变量对数据进行拆分。

函数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
        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表达式的作用,不明白的可以查看:http://www.cnblogs.com/itdyb/p/5014052.html

>>> 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‘]])

四:选择最合适的拆分方案
首先,我们需要对数据集合中的每一项结果进行计数,代码如下:

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

上面函数的作用是找出不同的可能结果,并返回一个字典,其中包含了每一项结果的出现次数。

接下来我们考察基尼不纯度和熵。

对于基尼不纯度和熵值不了解的请参考《数据挖掘——概念与技术》中,或者百度(嘿嘿,公式比较麻烦,小弟就不写了)

1.基尼不纯度:是指将来自集合中的某些结果随机应用于集合中某一数据项的预期误差率。计算函数如下:

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

该函数利用集合中每一个项结果出现的次数除以集合的总行数来计算相应的概率,然后将这些概率的值的乘积累加起来。这样就会得到某一行数据被随机分配到错误结果的总概率。该值越小越好

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

计算熵的公式为H(x)=E[I(xi)]=E[log2 1/p(xi)]=-ξp(xi)log2 p(xi)(i=1,2,..n)

>>> treepredict.giniimpurity(treepredict.my_data)
0.6328125
>>> treepredict.entropy(treepredict.my_data)
1.5052408149441479

五:递归的方式构造树

信息增益:是指当前熵与两个新群组经过加权平均后的熵之间的差值。

def buildtree(rows,scoref=entropy):
  if len(rows)==0: return decisionnode()
  current_score=scoref(rows)

  # Set up some variables to track the best criteria
  best_gain=0.0
  best_criteria=None
  best_sets=None

  column_count=len(rows[0])-1
  for col in range(0,column_count):
    # Generate the list of different values in
    # this column
    column_values={}
    for row in rows:
       column_values[row[col]]=1
    # Now try dividing the rows up for each value
    # in this column
    for value in column_values.keys():
      (set1,set2)=divideset(rows,col,value)

      # Information gain
      p=float(len(set1))/len(rows)
      gain=current_score-p*scoref(set1)-(1-p)*scoref(set2)
      if gain>best_gain and len(set1)>0 and len(set2)>0:
        best_gain=gain
        best_criteria=(col,value)
        best_sets=(set1,set2)
  # Create the sub branches
  if best_gain>0:
    trueBranch=buildtree(best_sets[0])
    falseBranch=buildtree(best_sets[1])
    return decisionnode(col=best_criteria[0],value=best_criteria[1],
                        tb=trueBranch,fb=falseBranch)
  else:
    return decisionnode(results=uniquecounts(rows))

关于决策树的显示,预测,修剪在(下)中。

参考自《集体智慧编程》

时间: 2024-10-02 07:07:16

集体智慧编程——决策树建模(上)的相关文章

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

一.决策树的显示: 前面我们已经得到了一棵决策树,下一步也许我们该进行数的浏览了.下面这段函数就是一个以纯文本的方式显示决策树的方法,虽然输出不是很美观,但是对于显示节点不是太多的树而言,这也是一种简单的方式. def printtree(tree,indent=''): if tree.results!=None: print str(tree.results) else: print str(tree.col)+':'+str(tree.value)+'?' print indent+'T-

集体智慧编程中相关章节对应论文数

准备开题报告了,先要熟悉一下领域范围,<集体智慧编程>参考一下论点.简单的思路是看一下哪个话题最热门,用google学术来衡量一下论文数,虽然不够精确但是足以反应一点什么. 当然是选择最近比较热门的,同时参考一下国内的论文数目情况. 关键字 总的 2014 国内总数 2014 推荐 2,480,000 42,600 223,124 2728 协同过滤 194,000 4,350 11,239 112 聚类 2,550,000 54,600 141,003 1598 搜索与排名 2,120,00

集体智慧编程(一)推荐系统之欧里几德距离

在网上购物,听歌,看电影的网站上,网站都会根据我们的购物记录,听歌记录或着是观看记录给我们推荐一些商品,音乐或者是电影.那这些推荐系统是怎么实现的呢?首先,推荐一个东西,得是购物者所感兴趣的,那么怎么判断购物者对该物品感兴趣呢?那么,就得根据购物者的记录来判断了,假定购物者所购买的物品都是他所感兴趣的.那么跟该购物者的物品相似的物品就是可以推荐的,这种推荐是基于相似条目的.另外,可以相似的人会大都会有相同的爱好,因此可以根据购物者的该买记录找出相似的购物者,并把相似购物者购买的物品推荐出来,这就

集体智慧编程--勘误表(1-4章)

最近在工作之余的时间在阅读集体智慧编程这本书,在随书码字的过程中遇到的一些问题,就在这里记录一下: (注:下面的页码针对于英文的非影印版) chapter1 标题: 没什么说的,浏览下就好. chapter2 提供推荐: 1.书上的源码是基于python 2.x,而在3.x中print是被当作一个函数处理,所以要自己加上括号; 2.在P42利用del.icio.us提供的rss订阅源构建数据集时,这本书发布时间较长的原因,python api pydelicious的 很多接口已经发生了改变,这

读书笔记:集体智慧编程(1)

概述: 协作性过滤,是一种目前广泛运用于电子商务.交友网站.在线广告等互联网领域的一项技术.其主要作用是为指定用户在广大的用户群中找到品味相同或者相似的人,从而帮助网站针对性的推荐产品给特定的用户,与此同时,用户本人也可以从一堆纷繁复杂的信息中,迅速找到自己喜欢的.感兴趣的那部分信息. 其主要有两种实现方法,一种是基于用户的(user-based),即通过分析用户间的相似性,生成最近的邻居,将邻居中“得分”最高的项目推荐给用户:另一种是基于物品的(item-based),即通过分析用户群体对物品

集体智慧编程_第二章(提供推荐)_1

前言:最近正在拜读Toby Segaran先生写的集体智慧编程,首先感谢Toby Segaran先生将知识以书本的方式传播给大家,同时也感谢莫映和王开福先生对此书的翻译,谢谢各位的不辞辛苦.首先在写随笔之前,跟各位分享一下我的编程环境:win7系统,python版本是2.7.10,开发环境我选择的是pycharm程序.本书的第一章为集体智慧导言,主要介绍的何为集体智慧和机器学习的相关概念和其局限性,以及与机器学习相关的例子和应用场景.下面开始机器学习第二章--提供推荐的相关内容. 本章主要内容:

《集体智慧编程——导言》 有感

导言部分,截取一些概念.定义的东西如下: 什么是集体智慧 为了创造新的想法,而将一群人的行为.偏好或思想组合在一起: 什么是机器学习 机器学习是人工智能领域中与算法相关的一个子领域,它允许计算机不断的进行学习.大多数情况下,这相当于将一组数据传递给算法,并由算法推断出与这些数据的属性相关的信息——借助这些信息,算法就能够预测出未来有可能会出现的其他数据.这种预测是完全有可能的,因为几乎所有的非随机数据中,都会包含这样活那样的“模式”,这些模式的存在使机器得以据此进行规划.为了实现规划,机器会利用

集体智慧编程--勘误(5章~10章)

chapter5 随机优化技术: 1.randomoptimize中,返回值应为bestr 2.geneticoptimize中,mute函数应该将所有路径都返回一个编译结果,否则会在后续的dorm测试中 报出异常,应该修改为: 3.crosscount中,应该添加float类型的强制类型转换,否则得出的结果仍然有交叉线 4.drawnetwork应该保存到本地文件,之后才能打开 chapter 7 决策树建模: P167:如果使用从文件decision_tree_example.txt中加载数

集体智慧编程pdf下载

下载地址: http://gqylpy/di/305 本书以机器学习与计算统计为主题背景,专门讲述如何挖掘和分析Web上的数据和资源,如何分析用户体验.市场营销.个人品味等诸多信息,并得出有用的结论,通过复杂的算法来从Web网站获取.收集并分析用户的数据和反馈信息,以便创造新的用户价值和商业价值.全书内容翔实,包括协作过滤技术(实现关联产品推荐功能).集群数据分析(在大规模数据集中发掘相似的数据子集).搜索引核心技术(爬虫.索引.查询引擎.PageRank算法等).搜索海量信息并进行分析统计得出