学习日志---决策树算法ID3

ID3算法

#coding=utf-8

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‘]  
    #change to discrete values  
    return dataSet, labels  
  
#这里计算该样本的期望值
def calcShannonEnt(dataSet):  
    numEntries = len(dataSet)  
    labelCounts = {}  
    for featVec in dataSet: #the the number of unique elements and their occurance  
        currentLabel = featVec[-1]  
        if currentLabel not in labelCounts.keys(): labelCounts[currentLabel] = 0  
        labelCounts[currentLabel] += 1  
    shannonEnt = 0.0  
    for key in labelCounts:  
        prob = float(labelCounts[key])/numEntries  
        shannonEnt -= prob * log(prob,2) #log base 2  
    return shannonEnt  
     
#这里计算数据集中某列满足相同条件下的其他数值组成的矩阵,用于计算该特征值的期望值
def splitDataSet(dataSet, axis, value):  
    retDataSet = []  
    for featVec in dataSet:  
        if featVec[axis] == value:  
            reducedFeatVec = featVec[:axis]     #chop out axis used for splitting  
            reducedFeatVec.extend(featVec[axis+1:])  
            retDataSet.append(reducedFeatVec)  
    return retDataSet  
      
#针对上个函数算出的矩阵,计算出所有特征值的期望值,然后得出最大的信息增量
def chooseBestFeatureToSplit(dataSet):  
    numFeatures = len(dataSet[0]) - 1      #the last column is used for the labels  
    baseEntropy = calcShannonEnt(dataSet)  
    bestInfoGain = 0.0; bestFeature = -1  
    for i in range(numFeatures):        #iterate over all the features  
        featList = [example[i] for example in dataSet]#create a list of all the examples of this feature  
        uniqueVals = set(featList)       #get a set of unique values  
        newEntropy = 0.0  
        for value in uniqueVals: 
            #这里选取某一特征值得所有可能计算期望值 
            subDataSet = splitDataSet(dataSet, i, value)  
            prob = len(subDataSet)/float(len(dataSet))  
            newEntropy += prob * calcShannonEnt(subDataSet)       
        infoGain = baseEntropy - newEntropy     #calculate the info gain; ie reduction in entropy  
        if (infoGain > bestInfoGain):       #compare this to the best gain so far  
            bestInfoGain = infoGain         #if better than current best, set to best  
            bestFeature = i  
    return bestFeature                      #returns an integer  
  
  
#如果最后的结果有多个,投票机制取最大的
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):  
    #计算dataset里是否只有单值
    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)  
    bestFeatLabel = labels[bestFeat] 
    
    #根据这个特征值制定字典 
    myTree = {bestFeatLabel:{}}  
    
    #删除这个特征值
    del(labels[bestFeat]) 
     
    #找出这个特征值下有几个选择
    featValues = [example[bestFeat] for example in dataSet]  
    uniqueVals = set(featValues)  
    for value in uniqueVals:  
        subLabels = labels[:]  
        #针对每个选择,建立不同的分支     
        myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value),subLabels)  
    return myTree                              
      
#决策树分类器,inputtree是决策树,fearlabel是列种类,testVec是要分类的向量
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)

输入矩阵是一张表,最后一列是结果。

ID3算法是比较粗糙的算法,对标志性变量分类可以,但是无法分析数值型数据。

而且在选择特征值时,倾向于选择种类较多的特征值,因此需要改进。

时间: 2025-01-13 05:46:06

学习日志---决策树算法ID3的相关文章

数据挖掘 决策树算法 ID3 通俗演绎

决策树是对数据进行分类,以此达到预测的目的.该决策树方法先根据训练集数据形成决策树,如果该树不能对所有对象给出正确的分类,那么选择一些例外加入到训练集数据中,重复该过程一直到形成正确的决策集.决策树代表着决策集的树形结构. 决策树由决策结点.分支和叶子组成.决策树中最上面的结点为根结点,每个分支是一个新的决策结点,或者是树的叶子.每个决策结点代表一个问题或决策,通常对应于待分类对象的属性.每一个叶子结点代表一种可能的分类结果.沿决策树从上到下遍历的过程中,在每个结点都会遇到一个测试,对每个结点上

数据挖掘之决策树算法ID3算法的相关原理

ID3决策树:针对属性选择问题,是决策树算法中最为典型和最具影响力的决策树算法. ID3决策树算法使用信息增益度作为选择测试属性. 其中p(ai) 表示ai 发生的概率. 假设有n个互不相容的事件a1,a2,a3,-.,an,它们中有且仅有一个 发生,则其平均的信息量可如下度量: 对数底数可以为任何数,不同的取值对应了熵的不同单位. 通常取2,并规定当p(ai)=0时 =0 Entropy(S,A)=∑(|Sv|/|S|)* Entropy(Sv)公式2 以去不去打羽毛球为例子 A:属性:out

转载:scikit-learn学习之决策树算法

版权声明:<—— 本文为作者呕心沥血打造,若要转载,请注明出处@http://blog.csdn.net/gamer_gyt <—— 目录(?)[+] ====================================================================== 本系列博客主要参考 Scikit-Learn 官方网站上的每一个算法进行,并进行部分翻译,如有错误,请大家指正    ===========================================

《机器学习实战》基于信息论的三种决策树算法(ID3,C4.5,CART)

============================================================================================ <机器学习实战>系列博客是博主阅读<机器学习实战>这本书的笔记,包含对其中算法的理解和算法的Python代码实现 另外博主这里有机器学习实战这本书的所有算法源代码和算法所用到的源文件,有需要的留言 如需转载请注明出处,谢谢 ======================================

如何实现并应用决策树算法?

本文对决策树算法进行简单的总结和梳理,并对著名的决策树算法ID3(Iterative Dichotomiser 迭代二分器)进行实现,实现采用Python语言,一句老梗,“人生苦短,我用Python”,Python确实能够省很多语言方面的事,从而可以让我们专注于问题和解决问题的逻辑. 根据不同的数据,我实现了三个版本的ID3算法,复杂度逐步提升: 1.纯标称值无缺失数据集 2.连续值和标称值混合且无缺失数据集 3.连续值和标称值混合,有缺失数据集 第一个算法参考了<机器学习实战>的大部分代码,

Python机器学习(三)--决策树算法

一.决策树原理 决策树是用样本的属性作为结点,用属性的取值作为分支的树结构. 决策树的根结点是所有样本中信息量最大的属性.树的中间结点是该结点为根的子树所包含的样本子集中信息量最大的属性.决策树的叶结点是样本的类别值.决策树是一种知识表示形式,它是对所有样本数据的高度概括决策树能准确地识别所有样本的类别,也能有效地识别新样本的类别. 决策树算法ID3的基本思想: 首先找出最有判别力的属性,把样例分成多个子集,每个子集又选择最有判别力的属性进行划分,一直进行到所有子集仅包含同一类型的数据为止.最后

决策树算法学习笔记

决策树算法 决策树的基本思想与人自身的决策机制非常类似,都是基于树结构进行决策,即对于不论什么问题.我们都先抽出当中的几个主要特征.然后对这些特征一个一个的去考察,从而决定这个问题应该属于的类别.比如我们要去商场买电脑,我们一般要通过考察电脑的CPU.内存,硬盘.显存等这些特征来推断这台电脑是好电脑还是一般电脑.当我们做推断的时候.我们都是首先看这个电脑的CPU怎么样,是i3?i5?还是i7?假设是i7我们就有更大概率倾向于觉得这台电脑是好电脑.然后我们再依次考察内存,硬盘.显存等.终于根据这些

ID3决策树算法原理及C++实现(其中代码转自别人的博客)

分类是数据挖掘中十分重要的组成部分. 分类作为一种无监督学习方式被广泛的使用. 之前关于"数据挖掘中十大经典算法"中,基于ID3核心思想的分类算法 C4.5榜上有名.所以不难看出ID3在数据分类中是多么的重要了. ID3又称为决策树算法,虽然现在广义的决策树算法不止ID3一种,但是由 于ID3的重要性,习惯是还是把ID3和决策树算法等价起来. 另外无监督学习方式我还要多说两句.无监督学习方式包括决策树算法, 基于规则的分类,神经网络等.这些分类方式是初始分类已知,将样本分为 训练样本和

[转]机器学习——C4.5 决策树算法学习

1. 算法背景介绍 分类树(决策树)是一种十分常用的分类方法.它是一种监管学习,所谓监管学习说白了很简单,就是给定一堆样本,每个样本都有一组属性和一个类别,这些类别是事先确定的,那么通过学习得到一个分类器,这个分类器能够对新出现的对象给出正确的分类.这样的机器学习就被称之为监督学习.C4.5分类树就是决策树算法中最流行的一种.下面给出一个数据集作为算法例子的基础,比如有这么一个数据集,如下: 我们将以这个数据集作讨论的基础.进行分类的目的就是根据某一天的天气状态,如天气,温度,湿度,是否刮风,来