zoukankan      html  css  js  c++  java
  • 【机器学习算法-python实现】决策树-Decision tree(2) 决策树的实现

    (转载请注明出处:http://blog.csdn.net/buptgshengod)

    1.背景

         接着上一节说,没看到请先看一下上一节关于数据集的划分数据集划分。如今我们得到了每一个特征值得信息熵增益,我们依照信息熵增益的从大到校的顺序,安排排列为二叉树的节点。数据集和二叉树的图见下。
    (二叉树的图是用python的matplotlib库画出来的)

    数据集:
      

    决策树:




    2.代码实现部分

         由于上一节,我们通过chooseBestFeatureToSplit函数已经能够确定当前数据集中的信息熵最大的那个特征值。我们将最大的那个作为决策树的父节点,这样递归下去就能够了。

    主要函数:详见凝视
    def createTree(dataSet,labels):
        #把全部目标指数放在这个list里
        classList = [example[-1] for example in dataSet]
        #以下两个if是递归停止条件,各自是list中都是同样的指标或者指标就剩一个。
        if classList.count(classList[0]) == len(classList): 
            return classList[0]
        if len(dataSet[0]) == 1: 
            return majorityCnt(classList)
        #获得信息熵增益最大的特征值
        bestFeat = chooseBestFeatureToSplit(dataSet)
        bestFeatLabel = labels[bestFeat]   
        #将决策树存在字典中
        myTree = {bestFeatLabel:{}}
        #labels删除当前使用完的特征值的label
        del(labels[bestFeat])
        featValues = [example[bestFeat] for example in dataSet]
        uniqueVals = set(featValues)
        #递归输出决策树
        for value in uniqueVals:       
            subLabels = labels[:]       #copy all of labels, so trees don't mess up existing labels
           
            myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value),subLabels)
        return myTree
    

    打印出来的决策树:{'throat': {0: {'mustache': {0: 'women', 1: 'man'}}, 1: 'man'}}


    以下就是怎样是用建立好的决策树。我们建立函数
    inputTree:是输入的决策树对象
    featLabels:是我们要预測的特征值得label,如:['throat','mustache']
    testVec:是要预測的特征值向量,如[0,0]
    def classify(inputTree,featLabels,testVec):
        #存储决策树第一个节点
        firstStr = inputTree.keys()[0]
        #将第一个节点的值存到secondDict字典中
        secondDict = inputTree[firstStr]
        #建立索引,知道相应到第几种特征值
        featIndex = featLabels.index(firstStr)
        key = testVec[featIndex]
        valueOfFeat = secondDict[key]
        #对照,推断当前的键值是否是一个dict类型,假设是就递归,不是就输出当前键值为结果
        if isinstance(valueOfFeat, dict): 
            classLabel = classify(valueOfFeat, featLabels, testVec)
        else: classLabel = valueOfFeat
        return classLabel

    測验:当我们输入classify(mtree,['throat','mustache'],[0,0])时,显示结果是women,表明没有喉结和胡子是女人。


    3.源代码下载


  • 相关阅读:
    快排算法的一点思考
    imglab .xml 标签格式转coco .json格式
    Ubuntu18.04 编译 sparse-ncnet
    Detectron2 keypoint_rcnn 网络c++版本部署
    技术部斗争
    我的程序人生
    关于ddd落地体验
    DevOps关于制定适合自身生产环境的redis集群
    从前端到后端的跨域攻击与防御
    DKIM对发送邮件的好处及使用方法
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/3760752.html
Copyright © 2011-2022 走看看