机器学习实战之一---简单讲解决策树


前言:本文基于《机器学习实战》一书,采用python语言,对于机器学习当中的常用算法进行说明。

 

 

一、 综述

定义:首先来对决策树进行一个定义,决策树是一棵通过事物的特征来进行判断分支后得到该事物所需要的预测的属性的树。

流程:提取特征à计算信息增益à构建决策树à使用决策树进行预测

关键:树的构造,通过信息增益()得到分支点和分支的方式。

优点:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据。

缺点:可能会产生过度匹配问题(过拟合)

适用数据类型:数值型和标称型。

以下是一棵决策树的简单例子,通过邮件的一些特征,来判断一个邮件的类型。

1


 

二、 特征提取

此处的特征指的就是用以构造决策树的实体集的特征,此处给出一个用以构造决策树的例子。

cheep

quality

buy

1

1

Yes

1

1

Yes

1

0

No

0

1

No

0

1

No

1

简单的对表1中的数据进行一个说明,表1表征了小明在购物时基于一个商品便宜(cheep)与否(1/0)以及质量(quality)好坏(1/0)做出的购买选择。

 

此处的特征可以用一个python函数来创建:

def createDataSet():
    dataSet = [ #数据集对应表格
        [1, 1, 'yes'],
        [1, 1, 'yes'],
        [1, 0, 'no'],
        [0, 1, 'no'],
        [0, 1, 'no']
    ]
    labels = ['cheep', 'quality']#标签对应价格与质量
    return dataSet, labels

 

 

三、 计算信息增益

1、信息增益的介绍

信息增益是决策树在构造过程中节点的位置即特征判断的先后顺序的主要依据,计算信息增益可以帮助我们在多个特征当中选取选取对获得预测值帮助最大的特征,然后以此来对树当中的节点顺序进行划分。

结合二当中给出的例子,一件商品有价格便宜与否以及质量好坏两个特征,我们需要做的是把这两个特征作为节点放到树中,然后通过便不便宜以及质量好不好来对是否购买这件商品做出决策。而这里就存在一个问题,先判断价格还是先判断质量,这里就可以通过信息增益来做出一个决断。在每一次构造树的时候进行一次信息增益值的计算,然后将信息增益值最大的特征作为优先进行分支的节点。

计算信息增益的公式如下:


       其中p(xi)为事件发生的概率。

 

2、信息增益的python实现

       既然得到了信息增益的计算公式,那么这里就用python写一个函数来实现它,数据集采取二当中的例子。

以下函数实现了信息增益的计算:

def calcShannonEnt(dataSet):#入参是一个数据集
    numEntries = len(dataSet)#首先取得数据集中的数据个数
    labelCounts = {}#标签的集
    for featVec in dataSet: #得到每一个数据的标记值
        currentLabel = featVec[-1#取得最后一列的标记值
        if currentLabel not in labelCounts.keys(): #如果该标记没有被存到标记集合当中
            labelCounts[currentLabel] = 0 #计算该标记的哈希值记录到标记集当中并赋值为0
        labelCounts[currentLabel] += 1 #对该标记的数量加一
    shannonEnt = 0.0 #初始信息增益为0
    for key in labelCounts: #依次遍历每一个标记
        prob = float(labelCounts[key])/numEntries #得到该标记的概率值
        shannonEnt -= prob * log(prob,2) #求得信息增益
    return shannonEnt

 

       知道了怎么计算信息增益,就可以通过信息增益来对节点的顺序进行选择,进一步构造出一棵决策树。

四、 构造决策树

总的来说,构造决策树是一个递归的过程,首先通过计算信息增益取出一个特征作为判断的节点,然后将取出该特征的剩余数据集继续循环提取特征。

 

1、首先给出一个函数,该函数的作用是提取给定特征值为给定值的所有数据的数据集。

def splitDataSet(dataSet, axis, value):#按照指定特征划分数据集,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

 

2、然后是一个在给定数据集当中计算出信息增益最大的特征的函数,以此来筛选特征:

def chooseBestFeatureToSplit(dataSet): #获取数据集中的最佳分支特征
    numFeatures = len(dataSet[0]) - 1 #获取特征数量
    baseEntropy = calcShannonEnt(dataSet) #计算基础熵
    bestInfoGain = 0.0 #设置基础最佳信息增益为0
    bestFeature = -1 #最佳特征索引
    for i in range(numFeatures): #依次遍历每一个特征
        featList = [example[i] for example in dataSet] #获取属于该特征的一列数据
        uniqueVals = set(featList) #将数据列转换为set,过滤重复值
        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
        if(infoGain > bestInfoGain): #求得信息增益最大的特征
            bestInfoGain = infoGain
            bestFeature = i
    return bestFeature

 

3、可以筛选特征之后,就可以进行递归的构造决策树了:

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) #选出特征最为划分依据
    bestFeatLabel = labels[bestFeat]
    myTree = {bestFeatLabel:{}} # 将该特征放到树的节点当中
    del(labels[bestFeat]) #在标签集当中去掉该标签
    featValues = [example[bestFeat] for example in dataSet] #取出属于该特征的所有可能取值
    uniqueVals = set(featValues) #转换为set过滤重复值
    for value in uniqueVals: #通过该特征的不同取值对决策树进行分支
        subLabels = labels[:] #提取出剩余的标签集
        myTree[bestFeatLabel][value] = createTree(splitDataSet\
            (dataSet, bestFeat, value), subLabels) #递归构造决策树
    return myTree

 

五、使用决策树。

此处使用依然是一个函数来使用我们定义好的决策树:

 

def classify(inputTree, featLabels, testVec): #三个参数分别是输入的决策树,特征集,进行预测的数据
    firstStr = list(inputTree.keys())[0] #首先取出第一个分支特征
    secondDict = inputTree[firstStr] #
    featIndex = featLabels.index(firstStr)
    for key in secondDict.keys():#根据该特征节点进行划分
        if testVec[featIndex] == key: #如果待预测的数据的值
            if type(secondDict[key]).__name__=='dict': #如果是字典,则递归决策
                classLabel = classify(secondDict[key], featLabels, testVec)
            else: #不然就直接得出预测结论
                classLabel = secondDict[key]
    return classLabel 

 

 

 

六、总结

决策树是一种相对基础而简单的预测算法,其中还有一些相关的剪枝和图的绘制等没有在本文中提到的知识,此处是对决策树进行一个最简单的介绍,如有不足,请多指教。

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python3机器学习实战是一本介绍Python语言在机器学习领域应用的优秀教程。本书主要从机器学习的应用层面出发,对Python3语言在数据预处理、特征工程、模型训练和评估等方面进行系统和深入的探讨,旨在帮助读者掌握如何使用Python3语言进行机器学习。 本书首先简要介绍了机器学习Python3语言和数据预处理的基础知识以及相关的工具和库。接着,针对数据预处理和特征工程这两个问题,本书详细介绍了数据清洗、数据转换、特征选择和特征提取等一系列关键技术,帮助读者理解如何从原始数据中提取出有用的信息。 随后,本书进一步介绍了机器学习的主要算法和模型,如线性回归、逻辑回归、支持向量机、决策树、随机森林、K近邻、贝叶斯分类器等。每个算法和模型都有详细的理论介绍和Python代码实现示例,读者可以通过实战项目掌握模型的训练和预测过程。 最后,本书还对模型评估和调优进行了介绍,打破了初学者在机器学习中容易犯的常见错误,让读者能够掌握如何评估和选择最佳的机器学习模型。 总之,Python3机器学习实战是一本深入浅出、实用性强的机器学习入门指南,适合有Python基础的读者阅读和学习。 ### 回答2: Python3机器学习实战是一本介绍Python3机器学习技术的书籍。它通过实际案例的方式,让读者了解Python3中常用的机器学习技术,以及如何使用它们来解决真实世界中的问题。 本书的作者将Python3中的机器学习技术分为三个部分:监督学习、无监督学习和深度学习。在第一部分中,读者将学习如何使用监督学习技术(如分类、回归和集成方法)来构建预测模型。第二部分中,作者介绍了无监督学习技术,例如聚类和降维方法,以寻找数据中的结构。在第三部分中,作者则讲解Python3中的一些深度学习技术和库,例如Keras和TensorFlow,以及如何使用它们来构建神经网络和深度学习模型。 本书的优点在于,它不仅提供了大量的示例代码和数据集,还深入讲解了每个算法的原理和应用。此外,作者还介绍了一些机器学习中常见的问题和应对方法,例如过拟合、欠拟合以及特征提取等等。通过本书的学习,读者能够了解如何使用Python3来解决机器学习中常见的问题,使自己在这个领域中的技术和能力不断提高。 ### 回答3: Python3机器学习实战指的是使用Python3语言来实际操作和实践机器学习算法,以达到掌握机器学习相关知识和技能的目的。Python3是一种广泛应用于机器学习和深度学习领域的编程语言,具有易学易用、生态丰富、高效稳定等优点,成为了机器学习领域使用最广泛的语言之一。 Python3机器学习实战的步骤一般包括数据准备、数据分析、模型选择、模型训练和评估等环节。其中,数据准备是保证机器学习实战成功的基础,它包括数据收集、数据清洗、数据预处理等步骤。数据分析阶段则需要对数据进行可视化分析、统计分析等操作,对数据有深刻的理解并发现潜在的数据模式。模型选择是根据任务类型和需求选择合适的机器学习算法和模型,包括基于监督学习、非监督学习和强化学习的各类算法和模型。模型训练和评估则是通过训练样本数据训练模型,并根据测试集数据和交叉验证等方法评估模型的性能和表现,最终得到一个高质量的机器学习模型。 Python3机器学习实战对于从事机器学习技术研究和应用开发的人员来说,具有非常重要的意义。通过实战操作,可以加深对机器学习理论和方法的理解,掌握机器学习算法和模型的应用技能,提升自己的机器学习实践能力。同时,在实际应用中,python3机器学习实战也可以帮助我们解决很多实际问题,如图像识别、自然语言处理、推荐系统等领域的开发需求。总之,Python3机器学习实战对于提高机器学习技术水平和推动其在各个领域中的应用具有重要的推动作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值