机器学习之决策树学习笔记

来源:互联网 发布:淘宝化妆品店铺简介 编辑:程序博客网 时间:2024/06/04 19:16

机器学习之决策树学习笔记

什么是决策树?决策树是根据数据特征(属性)进行不断分类最终得到结论的一种机器学习方法。

point1:数据特征的选择的依据是属性的信息增益(部分?)

point2:不断分类表明决策树是一个递归过程

一、信息熵与信息增益

         决策树学习的关键是如何选择最优划分属性,随着划分过程不断进行,希望使得决策树的分支节点包含样本尽可能属于同一类别,即纯度越来越高。

         信息熵是度量样本集合纯度最常用的一个指标(可以理解为信息的混乱程度,信息熵越大,则纯度越低)

信息增益是某种特征/属性对分类的影响程度:对于某属性a来说,它的可能取值有V个(例如在水果的颜色属性可能有红色,绿色等等),如果采用属性a进行划分,那么就会产生V个分支节点;不同节点的样本数不同,而样本越多的分支节点的影响越大,则给节点赋予权重,信息增益越大,则意味着用该属性进行划分得到纯度提升越大。

二、代码解析

PART1       计算信息熵

         通过信息熵的公式我们知道,在计算信息熵的过程中,我们要计算:1、样本类型的总数,要注意这个样本类型是最终分类的样本类型,而不是样本特征的总数。2、计算比例,这个比例是在根节点D中的各个类型的比例。3、进行总和计算。知道这三点,那么对代码就很好理解了

代码如下:
from math import log
def calcShannonEnt (dataset):
    numEntries = len(dataset) #计算数据集中实例总数
   
labelCounts= {}          #创建空字典,用于下步统计不同类别的数量 
   
for featVec in dataset:  
        currentlable = featVec[-1] #提取类别标签键值
       
ifcurrentlable not in labelCounts.keys():
            labelCounts[currentlable] = 0   #当键值不存在时扩展字典
       
labelCounts[currentlable]+= 1      #累加计数
   
shannonEnt= 0.0
    for key in labelCounts:                
        prob = float(labelCounts[key])/numEntries   #计算比例
       
shannonEnt-= prob*log(prob,2)              #带入公式计算信息熵
   
returnshannonEnt

 

PART2 按特征划分数据集

 

def splotDataSet(dataset,axis,value):#输入数据集,划分特征,所需划分的特征值
   
retdataset= []
    for featvec in dataset:
        if featvec[axis] ==value:  #判断该特征是否符合所需划分的特征值
           
reducefeatvec= featvec[:axis]
           reducefeatvec.extend(featvec[axis+1:])
           retdataset.append(reducefeatvec) 
            #以上三段代码通过对数据集进行切片操作使得最终输出的数据集是符合特征值,去除该特征的数据集
   
returnretdataset

 

为什么要按特征划分数据集,在后面的计算最优数据集中需要对每种划分的特征进行信息增益的对比,已选出最优划分特征。

 

PART3 选择最好的数据集

def choosebestfeatureTOsplit(dataset):
    numfeature = len(dataset)-1 #计算特征数
   
baseentropy= calcShannonEnt(dataset)   #计算数据集信息熵
   
bestinfogain= 0.0;bestfeature = -1     #初始化参数
   
for i in range(numfeature):            
        featlist = [example[i] for examplein dataset] #截取特征值
       
uniquevals= set(featlist)  #创建集合,集合中仅有唯一的特征值
       
newentropy= 0.0
        for value in uniquevals:    #这俩循环意思就是对每个特征按选择的特征值进行计算信息增益
           
subdataset= splotDataSet(dataset,i,value) #截取划分后的数据集
           
prob= len(subdataset)/float(len(dataset)) #计算划分后的比例
           
newentropy+= prob*calcShannonEnt(subdataset)
        infogain = baseentropy -newentropy#累加计算某一特征的信息增益
       
if(infogain > bestfeature):
            bestinfogain= infogain
            bestfeature = i #判断最优信息增益,输出该特征
   
returnbestfeature

 

 

author :Cheshire Cat