机器学习 python实例完成—决策树

决策树学习是应用最广泛的归纳推理算法之一,是一种逼近离散值目标函数的方法,在这种方法中学习到的函数被表示为一棵决策树。决策树可以使用不熟悉的数据集合,并从中提取出一系列规则,机器学习算法最终将使用这些从数据集中创造的规则。决策树的优点为:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据。缺点为:可能产生过度匹配的问题。决策树适于处理离散型和连续型的数据。

在决策树中最重要的就是如何选取用于划分的特征

在算法中一般选用ID3,D3算法的核心问题是选取在树的每个节点要测试的特征或者属性,希望选择的是最有助于分类实例的属性。如何定量地衡量一个属性的价值呢?这里需要引入熵和信息增益的概念。熵是信息论中广泛使用的一个度量标准,刻画了任意样本集的纯度。

假设有10个训练样本,其中6个的分类标签为yes,4个的分类标签为no,那熵是多少呢?在该例子中,分类的数目为2(yes,no),yes的概率为0.6,no的概率为0.4,则熵为 :

其中value(A)是属性A所有可能值的集合,是S中属性A的值为v的子集,即。上述公式的第一项为原集合S的熵,第二项是用A分类S后熵的期望值,该项描述的期望熵就是每个子集的熵的加权和,权值为属于的样本占原始样本S的比例。所以Gain(S,
A)是由于知道属性A的值而导致的期望熵减少。

完整的代码:

# -*- coding: cp936 -*-
from numpy import *
import operator
from math import log
import operator

def createDataSet():
    dataSet = [[1,1,'yes'],
       [1,1,'yes'],
       [1,0,'no'],
       [0,1,'no'],
       [0,1,'no']]
    labels = ['no surfacing','flippers']
    return dataSet, labels

def calcShannonEnt(dataSet):
    numEntries = len(dataSet)
    labelCounts = {}  # a dictionary for feature
    for featVec in dataSet:
        currentLabel = featVec[-1]
        if currentLabel not in labelCounts.keys():
            labelCounts[currentLabel] = 0
        labelCounts[currentLabel] += 1
    shannonEnt = 0.0
    for key in labelCounts:
        #print(key)
        #print(labelCounts[key])
        prob = float(labelCounts[key])/numEntries
        #print(prob)
        shannonEnt -= prob * log(prob,2)
    return shannonEnt

#按照给定的特征划分数据集
#根据axis等于value的特征将数据提出
def splitDataSet(dataSet, axis, value):
    retDataSet = []
    for featVec in dataSet:
        if featVec[axis] == value:
            reducedFeatVec = featVec[:axis]
            reducedFeatVec.extend(featVec[axis+1:])
            retDataSet.append(reducedFeatVec)
    return retDataSet

#选取特征,划分数据集,计算得出最好的划分数据集的特征
def chooseBestFeatureToSplit(dataSet):
    numFeatures = len(dataSet[0]) - 1  #剩下的是特征的个数
    baseEntropy = calcShannonEnt(dataSet)#计算数据集的熵,放到baseEntropy中
    bestInfoGain = 0.0;bestFeature = -1  #初始化熵增益
    for i in range(numFeatures):
        featList = [example[i] for example in dataSet]  #featList存储对应特征所有可能得取值
        uniqueVals = set(featList)
        newEntropy = 0.0
        for value in uniqueVals:#下面是计算每种划分方式的信息熵,特征i个,每个特征value个值
            subDataSet = splitDataSet(dataSet, i ,value)
            prob = len(subDataSet)/float(len(dataSet))  #特征样本在总样本中的权重
            newEntropy = prob * calcShannonEnt(subDataSet)
        infoGain = baseEntropy - newEntropy  #计算i个特征的信息熵
        #print(i)
        #print(infoGain)
        if(infoGain > bestInfoGain):
            bestInfoGain = infoGain
            bestFeature = i
    return bestFeature  

#如上面是决策树所有的功能模块
#得到原始数据集之后基于最好的属性值进行划分,每一次划分之后传递到树分支的下一个节点
#递归结束的条件是程序遍历完成所有的数据集属性,或者是每一个分支下的所有实例都具有相同的分类
#如果所有实例具有相同的分类,则得到一个叶子节点或者终止快

#如果所有属性都已经被处理,但是类标签依然不是确定的,那么采用多数投票的方式
#返回出现次数最多的分类名称
def majorityCnt(classList):
    classCount = {}
    for vote in classList:
        if vote not in classCount.keys():classCount[vote] = 0
        classCount[vote] += 1
    sortedClassCount  = sorted(classCount.iteritems(),key=operator.itemgetter(1), reverse=True)
    return sortedClassCount[0][0]  

#创建决策树
def createTree(dataSet,labels):
    classList = [example[-1] for example in dataSet]#将最后一行的数据放到classList中,所有的类别的值
    if classList.count(classList[0]) == len(classList):  #类别完全相同不需要再划分
        return classList[0]
    if len(dataSet[0]) == 1:#这里为什么是1呢?就是说特征数为1的时候
        return majorityCnt(classList)#就返回这个特征就行了,因为就这一个特征
    bestFeat = chooseBestFeatureToSplit(dataSet)
    print('the bestFeatue in creating is :')
    print(bestFeat)
    bestFeatLabel = labels[bestFeat]#运行结果'no surfacing'
    myTree = {bestFeatLabel:{}}#嵌套字典,目前value是一个空字典
    del(labels[bestFeat])
    featValues = [example[bestFeat] for example in dataSet]#第0个特征对应的取值
    uniqueVals = set(featValues)
    for value in uniqueVals:  #根据当前特征值的取值进行下一级的划分
        subLabels = labels[:]
        myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet,bestFeat,value),subLabels)  

    return myTree

#对上面简单的数据进行小测试
def testTree1():
    myDat,labels=createDataSet()
    val = calcShannonEnt(myDat)
    print 'The classify accuracy is: %.2f%%' % val

    retDataSet1 = splitDataSet(myDat,0,1)
    print (myDat)
    print(retDataSet1)
    retDataSet0 = splitDataSet(myDat,0,0)
    print (myDat)
    print(retDataSet0)

    bestfeature = chooseBestFeatureToSplit(myDat)
    print('the bestFeatue is :')
    print(bestfeature)

    tree = createTree(myDat,labels)
    print(tree)

对应的结果是:

>>> import TREE
>>> TREE.testTree1()
The classify accuracy is: 0.97%
[[1, 1, 'yes'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']]
[[1, 'yes'], [1, 'yes'], [0, 'no']]
[[1, 1, 'yes'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']]
[[1, 'no'], [1, 'no']]
the bestFeatue is :
0
the bestFeatue in creating is :
0
the bestFeatue in creating is :
0
{'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}}

最好再增加使用决策树的分类函数

同时因为构建决策树是非常耗时间的,因为最好是将构建好的树通过 python 的 pickle 序列化对象,将对象保存在

磁盘上,等到需要用的时候再读出

def classify(inputTree,featLabels,testVec):
    firstStr = inputTree.keys()[0]
    secondDict = inputTree[firstStr]
    featIndex = featLabels.index(firstStr)
    key = testVec[featIndex]
    valueOfFeat = secondDict[key]
    if isinstance(valueOfFeat, dict):
        classLabel = classify(valueOfFeat, featLabels, testVec)
    else: classLabel = valueOfFeat
    return classLabel

def storeTree(inputTree,filename):
    import pickle
    fw = open(filename,'w')
    pickle.dump(inputTree,fw)
    fw.close()

def grabTree(filename):
    import pickle
    fr = open(filename)
    return pickle.load(fr)
时间: 2024-10-13 00:21:08

机器学习 python实例完成—决策树的相关文章

【机器学习算法-python实现】决策树-Decision tree(1) 信息熵划分数据集

(转载请注明出处:http://blog.csdn.net/buptgshengod) 1.背景 决策书算法是一种逼近离散数值的分类算法,思路比較简单,并且准确率较高.国际权威的学术组织,数据挖掘国际会议ICDM (the IEEE International Conference on Data Mining)在2006年12月评选出了数据挖掘领域的十大经典算法中,C4.5算法排名第一.C4.5算法是机器学习算法中的一种分类决策树算法,其核心算法是ID3算法. 算法的主要思想就是将数据集依照特

【机器学习算法-python实现】决策树-Decision tree(2) 决策树的实现

(转载请注明出处:http://blog.csdn.net/buptgshengod) 1.背景 接着上一节说,没看到请先看一下上一节关于数据集的划分数据集划分.如今我们得到了每一个特征值得信息熵增益,我们依照信息熵增益的从大到校的顺序,安排排列为二叉树的节点.数据集和二叉树的图见下. (二叉树的图是用python的matplotlib库画出来的) 数据集: 决策树: 2.代码实现部分 由于上一节,我们通过chooseBestFeatureToSplit函数已经能够确定当前数据集中的信息熵最大的

Python机器学习经典实例(高清中文版PDF+高清英文版PDF+源代码)

最新出版的Python机器学习经典实例.高清中文版和高清英文版对比学习, 带目录书签,可复制粘贴:讲解详细并配有源代码. 下载:https://pan.baidu.com/s/170qEhYJ4T4IlQwuwASRIfA 一块儿学习探讨,支持正版书籍. 在博客写python学习心得. 原文地址:http://blog.51cto.com/3215120/2300021

分享 《Python机器学习经典实例》(高清中文版PDF+高清英文版PDF+源代码)

下载:https://pan.baidu.com/s/147VG6ub74qi-4xPvpSMP4w <Python机器学习经典实例>(高清中文版PDF+高清英文版PDF+源代码) 最新出版的Python机器学习经典实例.高清中文版,270页,带目录书签,文字可复制粘贴.高清英文版,295页,带目录书签,文字可复制粘贴.配有源代码. 经典书籍,讲解详细:其中,高清中文版如图: 原文地址:http://blog.51cto.com/14050756/2318941

分享《Python机器学习经典实例》+PDF+源码+Prateek Joshi+陶俊杰

下载:https://pan.baidu.com/s/1UqX_Efi3c7-oaN40PXZwlw 更多资料分享:http://blog.51cto.com/14087171 <Python机器学习经典实例>(高清中文版PDF+高清英文版PDF+源代码) 最新出版的Python机器学习经典实例.高清中文版,270页,带目录书签,文字可复制粘贴.高清英文版,295页,带目录书签,文字可复制粘贴.配有源代码. 经典书籍,讲解详细:其中,高清中文版如图: 原文地址:http://blog.51ct

《Python机器学习经典实例》(中文+英文电子版PDF+源代码)

<Python机器学习经典实例>附 高清中英版PDF电子版+源代码)最新出版的Python机器学习经典实例.人工智能专家Prateek Joshi著 高清中文版,270页,带目录书签,文字可复制粘贴.高清英文版,295页,带目录书签,文字可复制粘贴.配有源代码. 经典书籍,讲解详细:常见的算法都有,常用的一些算法和应用,人脸识别,聚类,深度神经网络等,适合应用学习用火的Python语言.通过各种各样的机器学习算法来解决实际问题!书中介绍的主要问题如下. 探索分类分析算法并将其应用于收入等级评估

机器学习搭便车指南–决策树(1)

机器学习搭便车指南–决策树(1) 1. 决策树的基本概念 通常使用的分类回归树(class and regress tree)是一个二叉树.它的形式一般为:  决策树有两种节点: 中间节点和叶子节点. 每个中间节点有4个参数: a) 决策函数. 是一个特征的取值. 当特征小于等于这个值得时候决策路径走左边, 当特征大于这个值得时候决策树走右边. b) 不纯度值(impurity value). 是当前节点的不纯度值. 关于不纯度值得意义后面会讲到. c) 覆盖样本个数(n_samples). 是

机器学习分类实例——SVM(修改)/Decision Tree/Naive Bayes

机器学习分类实例--SVM(修改)/Decision Tree/Naive Bayes 20180427-28笔记.30总结 已经5月了,毕设告一段落了,该准备论文了.前天开会老师说,希望我以后做关于语义分析那一块内容,会议期间还讨论了学姐的知识图谱的知识推理内容,感觉也挺有趣的,但是感觉应该会比较复杂.有时间的话希望对这块了解一下.其实吧,具体怎么展示我还是不太清楚... 大概就是图表那个样子.我先做一个出来,让老师看看,两个礼拜写论文.24/25答辩,6月就可以去浪哈哈哈哈哈哈. 一.工作

使用docker安装部署Spark集群来训练CNN(含Python实例)

使用docker安装部署Spark集群来训练CNN(含Python实例) 本博客仅为作者记录笔记之用,不免有很多细节不对之处. 还望各位看官能够见谅,欢迎批评指正. 博客虽水,然亦博主之苦劳也. 如需转载,请附上本文链接,不甚感激! http://blog.csdn.net/cyh_24/article/details/49683221 实验室有4台神服务器,每台有8个tesla-GPU,然而平时做实验都只使用了其中的一个GPU,实在暴遣天物! 于是想用spark来把这些GPU都利用起来.听闻d