设为首页 加入收藏

TOP

机器学习实践之决策树算法学习(三)
2017-12-23 06:06:48 】 浏览:409
Tags:机器 学习 实践 决策树 算法

  创建树的函数

    def createTree(dataSet, labels):  
        classList = [example[-1] for example in dataSet]  
        # 如果数据集的最后一列的第一个值出现的次数=整个集合的数量,也就说只有一个类别,就只直接返回结果就行  
        # 第一个停止条件:所有的类标签完全相同,则直接返回该类标签。  
        # count() 函数是统计括号中的值在list中出现的次数  
        if classList.count(classList[0]) == len(classList):  
            return classList[0]  
        # 如果数据集只有1列,那么最初出现label次数最多的一类,作为结果  
        # 第二个停止条件:使用完了所有特征,仍然不能将数据集划分成仅包含唯一类别的分组。  
        if len(dataSet[0]) == 1:  
            return majorityCnt(classList)  
      
        # 选择最优的列,得到最优列对应的label含义  
        bestFeat = chooseBestFeatureToSplit(dataSet)  
        # 获取label的名称  
        bestFeatLabel = labels[bestFeat]  
        # 初始化myTree  
        myTree = {bestFeatLabel: {}}  
        # 注:labels列表是可变对象,在PYTHON函数中作为参数时传址引用,能够被全局修改  
        # 所以这行代码导致函数外的同名变量被删除了元素,造成例句无法执行,提示'no surfacing' is not in list  
        del(labels[bestFeat])  
        # 取出最优列,然后它的branch做分类  
        featValues = [example[bestFeat] for example in dataSet]  
        uniqueva ls = set(featValues)  
        for value in uniqueva ls:  
            # 求出剩余的标签label  
            subLabels = labels[:]  
            # 遍历当前选择特征包含的所有属性值,在每个数据集划分上递归调用函数createTree()  
            myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value), subLabels)  
            # print 'myTree', value, myTree  
        return myTree  

   测试算法:使用决策树执行分类

 

    def classify(inputTree, featLabels, testVec):  
        """classify(给输入的节点,进行分类) 
     
        Args: 
            inputTree  决策树模型 
            featLabels Feature标签对应的名称 
            testVec    测试输入的数据 
        Returns: 
            classLabel 分类的结果值,需要映射label才能知道名称 
        """  
        # 获取tree的根节点对于的key值  
        firstStr = inputTree.keys()[0]  
        # 通过key得到根节点对应的value  
        secondDict = inputTree[firstStr]  
        # 判断根节点名称获取根节点在label中的先后顺序,这样就知道输入的testVec怎么开始对照树来做分类  
        featIndex = featLabels.index(firstStr)  
        # 测试数据,找到根节点对应的label位置,也就知道从输入的数据的第几位来开始分类  
        key = testVec[featIndex]  
        valueOfFeat = secondDict[key]  
        print '+++', firstStr, 'xxx', secondDict, '---', key, '>>>', valueOfFeat  
        # 判断分枝是否结束: 判断valueOfFeat是否是dict类型  
        if isinstance(valueOfFeat, dict):  
            classLabel = classify(valueOfFeat, featLabels, testVec)  
        else:  
            classLabel = valueOfFeat  
        return classLabel  

 

 

三  项目案例2: 使用决策树预测隐形眼镜类型

项目概述

隐形眼镜类型包括硬材质、软材质以及不适合佩戴隐形眼镜。我们需要使用决策树预测患者需要佩戴的隐形眼镜类型。
开发流程

(1)收集数据: 提供的文本文件。
(2)解析数据: 解析 tab 键分隔的数据行
(3)分析数据: 快速检查数据,确保正确地解析数据内容,使用 createPlot() 函数绘制最终的树形图。
(4)训练算法: 使用 createTree() 函数。
(5)测试算法: 编写测试函数验证决策树可以正确分类给定的数据实例。
(6)使用算法: 存储树的数据结构,以便下次使用时无需重新构造树。

收集数据:提供的文本文件

文本文件数据格式如下:

  

young   myope   no  reduced no lenses  
pre myope   no  reduced no lenses  
presbyopic  myope   no  reduced no lenses 

 

  解析数据:解析 tab 键分隔的数据行

    lecses = [inst.strip().split('\t') for inst in fr.readlines()]  
    lensesLabels = ['age', 'prescript', 'astigmatic', 'tearRate']  

 

分析数据:快速检查数据,确保正确地解析数据内容,使用 createPlot() 函数绘制最终的树形图。

treePlotter.createPlot(lensesTree)  

 
训练算法:使用 createTree() 函数

 

    >>> lensesTree = trees.createTree(lenses, lensesLabels)  
    >>> lensesTree  

 

 
得到

 

    {'tearRate': {'reduced': 'no lenses', 'normal': {'astigmatic':{'yes':  
    {'prescript':{'hyper':{'age':{'pre':'no lenses', 'presbyopic':  
    'no lenses', 'young':'hard'}}, 'myope':'hard'}}, 'no':{'age':{'pre':  
    'soft', 'presbyopic':{'prescript': {'hyper':'soft', 'myope':  
    'no lenses'}}, 'young':'soft'}}}}}  

 

 

五 小结

其实决策树跟带终止块的流程图类似,所以这里的终止块就是分类结果.当我们进行数据处理时,首先要对集合中数据的不一致性进行测量评估,也就是计算香农熵,下一步才可以寻找最有方案划分数据,最终实现所有具有相同类型的数据都划分到同一个数据子集里面.在构建数据树时,我们一般采用递归方把数据

首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇ShuffleNet总结 下一篇python用户管理系统

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目