第121天:机器学习之决策树

简介: 第121天:机器学习之决策树

决策树(Decision Tree)


决策树是一种分类回归算法,决策树采用的是树形结构。每一个内部节点表示对于特征属性的判断,每一个分支就代表对这个特征属性判断的输出,每一个叶节点就是对决策结果的分类。


举个例子:在贷款买房、买车时,为了防止不良贷款,银行一般会看借款人的银行流水是否合格,如:月收入是否达标、时间是否合规、流水是否是造假。


image.png



决策树是一种常用的分类方法,是监督学习的一种,需要给出一些数据集样本,这些样本中包括了特征属性、决策分类的结果。通过这些数据集样本能够得到一个决策树,通过决策树得出新样本的分类结果。


决策树的优点是计算的复杂度不高、输出结果容易理解、对中间值的缺省不敏感。缺点是可能产生过度匹配的问题。


特征属性


在构造决策树时,需要解决的第一个问题就是,在数据集样本中,每个样本都有许多特征属性,每个特征属性对决策结果的影响都有大有小。为了找到那些决定性的特征,必须对每个特征进行评估、选择。对每个特征属性进行评估、选择就是对数据集的划分,一个数据集将被分为多个数据子集。


在选择特征属性时通常使用的方法为:信息增益。


信息增益


在选择特征属性之前和之后数据集发生的变化称之为信息增益。只要知道如何计算信息增益,就可以知道哪个特征属性就是最好的选择。


集合信息的度量方式被称为:香浓熵或者简称为熵。熵:信息的期望值,集合的无序程度,熵越大表示集合越无序,熵越小表示集合越有序。


如果待分类的数据集中可能会划分出多个分类,则符号 x~i~ 的信息定义为

其中 p(x~i~) 是这个分类的概率。


通过下面的公式可以得到所有类别的信息期望值,n 是分类的数目:


image.png


ID3.5 算法


ID3.5 算法的核心思想是在决策树各个结点上选择最优的信息增益得出特征属性,递归地构建决策树,直到没有特征选择为止。最后得到一个决策树。


举个例子使用 ID3.5 算法计算熵与信息增益,下表是简单的银行流水是否达标

申请人序号 月收入是否达标 时间是否合规 流水是否造假 银行流水是否达标
1
2
3
4
5
6
7


使用 ID3.5 算法计算上表中熵的值,把【是】用 1 表示,【否】用 0 表示,最后是否达标用 y/n 表示


from math import  log
def createDataSet():    '''    创建数据集    '''
    dataSet = [[1, 1, 0, 'y'],               [1, 1, 0, 'y'],               [1, 0, 0, 'n'],               [0, 1, 0, 'n'],               [0, 0, 1, 'n'],               [1, 0, 1, 'n'],               [1, 1, 1, 'n']]    labels = ['Salary', 'Time', 'Bank flow']    return dataSet,labels
def calcEntropy(dataSet):    '''    计算熵    :param dataSet: 数据集    :return: 熵值    '''
    numEntries = len(dataSet)    labelCounts = {}    for line in dataSet:        currentLabel = line[-1]        if currentLabel not in labelCounts.keys():            labelCounts[currentLabel] = 0        labelCounts[currentLabel] += 1    entropy = 0.0    for key in labelCounts:        prob = float(labelCounts[key]) / numEntries        entropy -= prob * log(prob, 2)    return entropy
mydata = createDataSet()
entropy = calcEntropy(mydata)
print('熵值为:', entropy)


示例结果


熵值为:0.863120568566631


熵值越大表示集合越无序,熵越小表示集合越有序。


下面使用 Python 代码计算出示例中的最优特征


def splitDataSet(dataSet,axis,value):    '''    划分数据集    :param dataSet: 按照给定特征划分数据集    :param axis: 划分数据集的特征    :param value: 需要返回的特征的值    :return: 经验熵    '''    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):    '''    计算数据集的熵    :param dataSet: 数据集    :return: 最优的特征值的索引    '''
    # 特征个数    numFeatures = len(dataSet[0]) - 1    # 数据集的熵    baseEntropy = calcEntropy(dataSet)    # 最优信息增益    bestInfoGain = 0.0    # 最优特征的索引值    bestFeature = -1        for i in range(numFeatures):        # 获取数据集的第 i 个所有特征        featList = [example[i] for example in dataSet]        #创建 set集合{},元素不可重复        uniqueVals = set(featList)        # 经验条件熵        newEntropy = 0.0        #计算信息增益        for value in uniqueVals:            # 数据集划分后的子集            subDataSet = splitDataSet(dataSet, i, value)            # 计算子集的概率            prob = len(subDataSet) / float(len(dataSet))            # 根据公式计算经验条件熵            newEntropy += prob * calcEntropy((subDataSet))        # 信息增益        infoGain = baseEntropy - newEntropy        # 打印每个特征的信息增益        print("第%d个特征属性的信息增益为%.3f" % (i, infoGain))                if (infoGain > bestInfoGain):            bestInfoGain = infoGain            bestFeature = i    return bestFeature
mydata = createDataSet()
print("最优的索引值为:", str(chooseBestFeatureToSplit(mydata)))


示例结果


第0个特征属性的信息增益为0.170第1个特征属性的信息增益为0.292第2个特征属性的信息增益为0.292最优的索引值为:1


在计算出第二个最优特征属性后,可以继续使用递归方式计算第二个最优特征属性,直至得出所有可能的决策类别。


下面构建决策树


import operator
def majorityCnt(classList):    '''    类别数多的类别    :param classList: 类别    :return: 返回类别数多的类别    '''    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):    '''    构建决策树    :param dataSet: 数据集样本    :param labels: 特征属性    :return: 决策树    '''
    # 决策类别    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)    # 返回最优的特征属性    bestFeature = chooseBestFeatureToSplit(dataSet)    bestFeatLabel = labels[bestFeature]    myTree = {bestFeatLabel:{}}    del(labels[bestFeature])    # 最优特征值    featureValues = [example[bestFeature] for example in dataSet]    uniqueVals = set(featureValues)    for value in uniqueVals:        subLabels = labels[:]        myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeature, value), subLabels)    return myTree


示例结果


第0个特征属性的信息增益为0.170第1个特征属性的信息增益为0.292第2个特征属性的信息增益为0.292第0个特征属性的信息增益为0.311第1个特征属性的信息增益为0.311第0个特征属性的信息增益为0.918{'Time': {0: 'n', 1: {'Salary': {0: 'n', 1: {'Bank flow': {0: 'y', 1: 'n'}}}}}}


总结


简单的介绍了决策树和 ID3.5 算法,用了一个示例构造了一个简单的决策树,希望对大家有所帮助。


示例代码:https://github.com/JustDoPython/python-100-day/tree/master/day-121

目录
相关文章
|
3月前
|
机器学习/深度学习 存储 算法
决策树和随机森林在机器学习中的应用
在机器学习领域,决策树(Decision Tree)和随机森林(Random Forest)是两种非常流行且强大的分类和回归算法。它们通过模拟人类决策过程,将复杂的数据集分割成易于理解和处理的子集,从而实现对新数据的准确预测。
125 10
|
26天前
|
机器学习/深度学习 数据采集 算法
机器学习在医疗诊断中的前沿应用,包括神经网络、决策树和支持向量机等方法,及其在医学影像、疾病预测和基因数据分析中的具体应用
医疗诊断是医学的核心,其准确性和效率至关重要。本文探讨了机器学习在医疗诊断中的前沿应用,包括神经网络、决策树和支持向量机等方法,及其在医学影像、疾病预测和基因数据分析中的具体应用。文章还讨论了Python在构建机器学习模型中的作用,面临的挑战及应对策略,并展望了未来的发展趋势。
89 1
|
3月前
|
机器学习/深度学习 数据采集 监控
探索机器学习:从数据到决策
【9月更文挑战第18天】在这篇文章中,我们将一起踏上一段激动人心的旅程,穿越机器学习的世界。我们将探讨如何通过收集和处理数据,利用算法的力量来预测未来的趋势,并做出更加明智的决策。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和思考方式。
|
3月前
|
机器学习/深度学习 算法 Python
从菜鸟到大师:一棵决策树如何引领你的Python机器学习之旅
【9月更文挑战第9天】在数据科学领域,机器学习如同璀璨明珠,吸引无数探索者。尤其对于新手而言,纷繁复杂的算法常让人感到迷茫。本文将以决策树为切入点,带您从Python机器学习的新手逐步成长为高手。决策树以其直观易懂的特点成为入门利器。通过构建决策树分类器并应用到鸢尾花数据集上,我们展示了其基本用法及效果。掌握决策树后,还需深入理解其工作原理,调整参数,并探索集成学习方法,最终将所学应用于实际问题解决中,不断提升技能。愿这棵智慧之树助您成为独当一面的大师。
51 3
|
3月前
|
机器学习/深度学习 算法 Python
决策树下的智慧果实:Python机器学习实战,轻松摘取数据洞察的果实
【9月更文挑战第7天】当我们身处数据海洋,如何提炼出有价值的洞察?决策树作为一种直观且强大的机器学习算法,宛如智慧之树,引领我们在繁复的数据中找到答案。通过Python的scikit-learn库,我们可以轻松实现决策树模型,对数据进行分类或回归分析。本教程将带领大家从零开始,通过实际案例掌握决策树的原理与应用,探索数据中的秘密。
54 1
|
4月前
|
机器学习/深度学习 算法 数据挖掘
【白话机器学习】算法理论+实战之决策树
【白话机器学习】算法理论+实战之决策树
|
4月前
|
机器学习/深度学习 算法 自动驾驶
揭秘机器学习模型的决策之道
【8月更文挑战第22天】本文将深入浅出地探讨机器学习模型如何从数据中学习并做出预测。我们将一起探索模型背后的数学原理,了解它们是如何被训练以及如何对新数据进行预测的。文章旨在为初学者提供一个清晰的机器学习过程概述,并启发读者思考如何在自己的项目中应用这些技术。
|
4月前
|
机器学习/深度学习 算法 搜索推荐
基于机器学习的用户行为分析:深入洞察与精准决策
【8月更文挑战第3天】基于机器学习的用户行为分析为企业提供了深入了解用户需求、优化产品设计和制定精准营销策略的有力工具。随着人工智能和大数据技术的不断发展,用户行为分析将更加智能化和个性化。未来,我们可以期待更加高效、精准的机器学习算法和模型的出现,以及更多创新性的应用场景的拓展。同时,也需要关注数据隐私和安全性问题,确保用户数据的安全和合规使用。
|
4月前
|
机器学习/深度学习 数据可视化 算法
决策树VS世界:掌握Python机器学习中的这棵树,决策从此不再迷茫
【8月更文挑战第2天】在数据驱动时代,决策树作为一种直观且易于解释的机器学习方法,因其强大的分类与回归能力备受青睐。本文介绍决策树的基础概念:通过属性测试划分数据,优化选择以提高预测准确度。使用Python的scikit-learn库,我们演示了如何加载鸢尾花数据集,构建并训练决策树模型,评估其准确性,以及利用`plot_tree`函数可视化决策过程,从而更好地理解模型的工作原理。掌握这些技能,你将在面对复杂决策时更加自信。
34 2
|
4月前
|
机器学习/深度学习 算法 Python
决策树下的智慧果实:Python机器学习实战,轻松摘取数据洞察的果实
【8月更文挑战第3天】在数据的海洋中探寻真知,决策树犹如智慧之树,以其直观易懂的强大功能,引领我们逐步缩小决策范围,轻松获取数据洞察。本篇将带您踏上Python机器学习之旅,从理解决策树为何受青睐开始,通过scikit-learn库实现鸢尾花数据集分类,解析其决策机制,并掌握调参技巧,最终优化模型性能,共同摘取数据科学的甜美果实。
55 1
下一篇
DataWorks