《机器学习实战》学习笔记---决策树

作为一名机器学习小白,将自己的学习经历写下来,一方面为了总结和回顾,另一方面希望能得到各路大神的批评指正,若能给他人带来便利就更好不过了。

  1. 优缺点:
    (1)计算法复杂度不高,结果易于理解,对中间值的缺失不敏感,可以处理不相关特信息征数据
    (2)可能会产生过度匹配问题
  2. 算法工作原理:
    《机器学习实战》学习笔记---决策树_第1张图片
  3. Python实现
    (1)辅助函数—计算数据熵值calShang():
    熵定义为信息的期望值。若待分类的事物可能被划分到多个分类中,则符号 xi 的信息定义为:

    l(xi)=log2p(xi)
    其中 p(xi) 是选择该分类的概率。
    所有类别所有可能值包含的信息期望值为:
    H=i=1np(xi)log2p(xi)

    在Python 2.7中函数定义如下:

    def calShang(data)       #函数输入参数为数据列表
     ......
    return Shang              #返回数据熵值

    (2)辅助函数—抽取数据函数splitData(data,axis,value):
    获取数据划分方式为value时的数据列表,函数输入参数:data—待划分数据;axis—为特征变量对应位置
    函数返回在该划分方式下划分后的数据列表
    (3)辅助函数—寻找划分数据的最佳方式seleOptSplit(data):

    def seleOptSplit(data):
    numFeat=len(data[0])-1                       #统计特征变量个数
    bestShang=calShang(data)                     #计算原始数据的熵值
    for i in range(numFeat):                     #遍历每个特征变量
        Shang=0.0                                #初始化熵值
        featList=[feat[i] for feat in data]      #生成特征变量i下的特征值
        featSet=set(featList)                    #抽取不同特征值
        for value in featSet:                    #遍历特征值
            splDat=splitData(data,i,value)       #依据特征变量i和特征值value划分数据
            prob=len(splDat)/float(len(data))    #计算比例系数
            Shang+=prob*calShang(splDat)         #计算此状态下的熵值
        if Shang#寻找最优熵值
            bestShang=Shang
            bestfeat=i                           #返回最优特征变量
    return bestfeat                              #函数返回数据最优划方式

    (4)终止条件1—当遍历到最后一个还没有分类结果时,将返回出现次数最多的类别mostNumFeat(featList)函数:
    函数首先统计各类别出现次数,再排序,返回次数最多的类别
    (5)构造树:buildTree(data,label):
    第1步:首先获取数据的类别列表,存放于classList中;
    第2步:判断终止条件1、2,若满足则返回相应类别;
    第3步:获取最优划分方式bestFeat和其对应类别标签bestLabel,将其作为节点,调用seleOptSplit()函数;
    第4步:构造树,即将树看作一个字典Tree={bestLabel:{}},删除bestFeat,此后在划分特征为bestLabel的数据
    循环第1~4步,直到满足终止条件。
    Python代码如下:

    def buildTree(data,label):
    classList = [value[-1] for value in data]             #获取类型列表
    if len(classList) == classList.count(classList[0]):   #终止条件1:类型相同
        return classList[0]
    if len(data) == 1:                                    #终止条件2:遍历完所有数据
        return mostNumFeat(classList)
    bestFeat=seleOptSplit(data)                           #选择最优划分方式
    bestLabel=label[bestFeat]                             #获得最优划分方式标签
    Tree={bestLabel:{}}                                   #构造树
    del label[bestFeat]                                   #删除已分类标签
    featList=[value[bestFeat] for value in data]          #获取特征列表
    featSet=set(featList)
    for value in featSet:
        subData=splitData(data,bestFeat,value)
        newLabel=label[:]
        Tree[bestLabel][value]=buildTree(subData,newLabel)#递归
    return Tree

参考:
1、《Machine Learning in Action》 译名:《机器学习实战》 作者:Peter Harrington 译者:李锐 李鹏 曲亚东 王斌
出版社:人民邮电出版社

你可能感兴趣的:(机器学习实战)