利用python实现决策树ID3算法

原创 2018年04月17日 19:33:05

通过长发的长短与粗细进行决策树的构造

如下数据:


用熵来表示信息的复杂度,熵越大,则信息越复杂。公式如下: 


信息增益(information gain),表示两个信息熵的差值

将数据集设为样本D,则熵为:

H(D)=-[3/8*log2(3/8)+5/8*log2(5/8)]=0.9544 

先以头发长短分计算出熵:

以头发长短分可分为长头发和短头发,所以:

H(D|A)=-4/8*(1/4*log2(1/4)+3/4*log2(3/4))-4/8*(2/4*log2(2/4)+2/4*log2(2/4))=0.9057

所以先以头发分的信息增益:

I(D,A)=H(D)-H(D|A)=0.0487

先以声音粗细分计算出熵:
以声音粗细分可分为粗声音和细声音,所以:
H(D|B)=-6/8*(3/6*log2(3/6)+3/6*log2(3/6))-2/8*(2/2*log2(2/2))=0.75

所以先以声音分的信息增益:

I(D,B)=H(D)-H(D|B)=0.2087


因为I(D,B)>I(D,A)

所以先按声音特征分类,信息增益更大,区分样本的能力更强,更具有代表性。 这就是ID3算法的核心思想。


通过python实现ID3算法:

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
from asn1crypto.cms import ClassList
from audioop import reverse
from math import log
import operator


def calcShannonEnt(dataSet):        #计算数据的熵
    numEntries = len(dataSet)
    labelCounts = {}
    for featVec in dataSet:
        currentLabel = featVec[-1]
        if currentLabel not in labelCounts.keys():
            labelCounts[currentLabel] = 0
        labelCounts[currentLabel] += 1
    shannonEnt = 0
    for key in labelCounts:
        prob = float(labelCounts[key]) / numEntries
        shannonEnt -= prob * log(prob, 2)
    return shannonEnt


def createDataSet1():        #创建数据集
    dataSet = [['长', '粗', '男'],
               ['短', '粗', '男'],
               ['短', '粗', '男'],
               ['长', '细', '女'],
               ['短', '细', '女'],
               ['短', '粗', '女'],
               ['长', '粗', '女'],
               ['长', '粗', '女']]
    labels = ['头发', '声音']
    return dataSet, labels


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)
    bestInfoGain = 0
    bestFeature = -1
    for i in range(numFeatures):
        featList = [example[i]for example in dataSet]
        uniqueVals = set(featList)
        newEntropy = 0
        for value in uniqueVals:
            subDataSet = splitDataSet(dataSet, i, value)
            prob = len(subDataSet) / float(len(dataSet))
            newEntropy += prob * calcShannonEnt(subDataSet)
        infoGain = baseEntropy - newEntropy
        if(infoGain > bestInfoGain):        #如果按某特征分类后熵值减少最大,则此特征为最优分类
            bestInfoGain = infoGain
            bestFeature = i
    return bestFeature


def majorityCnt(classList):        #按分类后的类别数量排序,例:最后分为2男1女,则判定为男
    classCount = {}
    for vote in classList:
        if vote not in classCount.keys():
            classCount[vote] = 0
        classCount[vote] += 1
    sortedClassCount = sorted(
        classCount.items(), key=operator.itemgetter(1), reverse=True)
    return sortedClassCount[0][0]


def createTree(dataSet, labels):            #决策树的创建 
    classList = [example[-1] for example in dataSet]
    if classList.count(classList[0]) == len(classList):
        return classList[0]
    if len(dataSet[0]) == 1:
        return majorityCnt(classList)
    bestFeat = chooseBestFeatureToSplit(dataSet)       #选择最优特征
    bestFeatLable = labels[bestFeat]
    myTree = {bestFeatLable: {}}       #分类结果以字典形式保存 
    del(labels[bestFeat])
    featValues = [example[bestFeat]for example in dataSet]
    uniqueVals = set(featValues)
    for value in uniqueVals:
        subLabels = labels[:]
        myTree[bestFeatLable][value] = createTree(splitDataSet
                                                  (dataSet, bestFeat, value), subLabels)
    return myTree


if __name__ == "__main__":
    dataSet, labels = createDataSet1()
    print(createTree(dataSet, labels))      #输出模型结果 

输出结果为:


画出来的样子就是:


第3周:决策树模型(CART)、基于树的集成学习算法(随机森林、GBDT)-人工智能工程师直通车

本课程共分为三个阶段。从机器学习到深度学习,再到项目实战,循序渐进,层层深入。除了系统讲解成为一名人工智能工程师所需的理论知识外,每节课还会配有实战案例,通过练习巩固所学知识,学以致用解决实际问题。第三个阶段包含四个大型工业级综合实战案例,采用大量真实数据集,完美模拟工作场景。学完后,大家绝对可以胜任人工智能领域相关工作。
  • 2017年11月13日 11:26

决策树之ID3算法实现(python)

决策树之ID3算法实现(python) 分类: python 算法2013-09-27 11:40 107人阅读 评论(0) 收藏 举报 算法decision treemach...
  • pi9nc
  • pi9nc
  • 2013-09-30 15:32:51
  • 16097

机器学习算法的Python实现 (2):ID3决策树

本文数据参照 机器学习-周志华 一书中的决策树一章。可作为此章课后习题3的答案 代码则参照《机器学习实战》一书的内容,并做了一些修改。 本文使用的Python库包括 numpypandasma...
  • wzmsltw
  • wzmsltw
  • 2016-04-01 22:42:39
  • 10200

【决策树】熵及ID3算法Python示例

1、决策树学习 有如下数据集: 序号 天气 是否周末 是否有促销 销量 1 坏 是 是 高 2 坏 是 是 高 3 坏 ...
  • u014157632
  • u014157632
  • 2017-03-01 22:50:27
  • 1203

决策树分类ID3算法的Python实现

生成决策树是从数据中生成分类器的一个特别有效的方法。决策树从一组无次序、无规则的事例中推理出分类规则。 ID3算法 ID3算法采用自顶向下的递归方法构造决策树,从单表训练样本的单个节点...
  • sinat_33982461
  • sinat_33982461
  • 2016-10-20 21:05:56
  • 529

Python实现决策树ID3算法

  • 2017年03月23日 19:38
  • 6KB
  • 下载

Python实现决策树算法 C4.5和ID3算法

本文以python语言实现了C4.5和ID3算法,默认为C4.5算法,若要使用ID3算法,将函数 entropy()最后的返回值改变一下即可,即注释掉C4.5那行代码,启用ID3那行代码即可。 将源...
  • seekerhit
  • seekerhit
  • 2016-03-15 23:22:12
  • 984

决策树ID3算法及其Python实现

决策树是一个有向无环图,由节点和有向边组成,根节点代表所有的样例,内部节点表示样例的一个属性,叶节点代表一个类。我们先来看WikiPedia上给出的例子,从而对决策树有一个直观理解。 这个图里,我们...
  • chai_zheng
  • chai_zheng
  • 2017-10-13 15:15:53
  • 409

决策树之id3算法

决策树的id3算法是之前学机器学习的一个作业,今天拿出来复习了一遍,想了想,贴到博客里共享吧 先把id3算法的过程贴出来 ID3(Examples, Target_attributes, At...
  • cxf7394373
  • cxf7394373
  • 2011-08-06 22:48:54
  • 5709

python实现决策树C4.5算法(在ID3基础上改进)

一、概率 C4.5主要是在ID3的基础上改进,ID3选择(属性)树节点是选择信息增益值最大的属性作为节点。而C4.5引入了新概念“信息增益率”,C4.5是选择信息增益率最大的属性作为树节点。 二、...
  • chenxiqilin
  • chenxiqilin
  • 2015-12-24 17:22:40
  • 5134
收藏助手
不良信息举报
您举报文章:利用python实现决策树ID3算法
举报原因:
原因补充:

(最多只允许输入30个字)