机器学习实战:决策树-隐形眼镜类型

输出结果

model: {‘tearRate’: {‘reduced’: ‘no lenses’, ‘normal’: {‘astigmatic’: {‘yes’: {‘prescript’: {‘hyper’: {‘age’: {‘presbyopic’: ‘no lenses’, ‘young’: ‘hard’, ‘pre’: ‘no lenses’}}, ‘myope’: ‘hard’}}, ‘no’: {‘age’: {‘presbyopic’: {‘prescript’: {‘hyper’: ‘soft’, ‘myope’: ‘no lenses’}}, ‘young’: ‘soft’, ‘pre’: ‘soft’}}}}}}

predict: [‘young’, ‘hyper’, ‘yes’, ‘normal’] hard

在这里插入图片描述

代码

"""
@author: lishihang
@software: PyCharm
@file: id3_lenses.py
@time: 2018/11/28 21:12
"""
import math
from graphviz import Digraph


def getDataSet():
    """
    特征:不浮出水面能否活、是否有脚掌
    :return:
    """
    f=open("lenses.txt")

    lenses=[i.strip().split('\t') for i in f.readlines()]

    f.close()

    lensesLabels = ['age', 'prescript', 'astigmatic', 'tearRate']

    return lenses, lensesLabels


def calcEnt(dataSet):
    """
    计算给定数据集的信息熵
    :param dataSet:
    :return:
    """
    number = len(dataSet)
    labelCount = {}
    for fecVec in dataSet:
        label = fecVec[-1]
        labelCount[label] = labelCount.get(label, 0) + 1

    ent = 0
    for L, c in labelCount.items():
        prob = c / number
        ent -= prob * math.log2(prob)

    return ent


def splitDataSet(dataSet, column, value):
    """
    将列column中值为value的数据提出来,新数据不再包含column列表示的特征
    :param dataSet:
    :param column:
    :param value:
    :return:
    """
    retDataSet = []
    for feaVec in dataSet:
        if feaVec[column] == value:
            reducedFeaVec = feaVec[:column]
            reducedFeaVec.extend(feaVec[column + 1:])
            # reducedFeaVec+=feaVec[column + 1:]
            retDataSet.append(reducedFeaVec)

    return retDataSet


def chooseBestSplit(dataSet):
    """
    返回最好特征列值
    :param dataSet:
    :return:
    """
    numFea = len(dataSet[0]) - 1  # 特征列数,最后一列是标签
    Ent = calcEnt(dataSet)

    bestFea, bestInfoGain = -1, 0  # 最好的特征列和信息熵

    # 遍历每一列特征
    for i in range(numFea):
        uniqueVals=set([e[i] for e in dataSet])
        iEnt=0
        for value in uniqueVals:
            subDataSet=splitDataSet(dataSet,i,value)
            prob=len(subDataSet)/len(dataSet)
            iEnt+=prob*calcEnt(subDataSet)
        infoGain=Ent-iEnt
        if infoGain>bestInfoGain: # 寻找信息增益最大处
            bestInfoGain=infoGain
            bestFea=i

    return bestFea

def majorityCnt(classList):
    """
    返回列表中值的频数最高的值
    :param classList:
    :return:
    """
    assert isinstance(classList,list)

    res={i:classList.count(i) for i in set(classList)}

    res=sorted(res.items(),key=lambda x:x[0])

    return res[0][0]



def createTree(dataSet,labels):
    """
    创建决策树模型,递归
    :param dataSet:
    :param labels: 特征的名称
    :return:
    """
    classList=[e[-1] for e in dataSet] # 标签列

    # 停止条件1: 标签列全是一个值
    if classList.count(classList[0]) == len(classList):
        # len(set(classList))==1
        return classList[0]

    # 停止条件2: 所有特征都用完了,只剩下一个标签列
    if len(dataSet[0])==1:
        return majorityCnt(classList)

    # 选择最优的列,得到其含义
    bestFea=chooseBestSplit(dataSet)
    bestFeaLabel=labels[bestFea] # 取得标签值,并从标签列中移除

    myTree={bestFeaLabel:{}} # 树是一个字典

    for value in set([e[bestFea] for e in dataSet]):
        subLabels=labels[:bestFea]+labels[bestFea+1:]
        subDataSet=splitDataSet(dataSet,bestFea,value)
        myTree[bestFeaLabel][value]=createTree(subDataSet,subLabels)

    return myTree

def classifyTest(inputTree,feaLabels,testVec):
    """
    将决策树模型用于分类,递归
    :param inputTree: 决策树模型,一个嵌套的字典
    :param feaLabels: 特征的名称,运行过程中不变
    :param testVec: 测试数据
    :return:
    """
    assert isinstance(inputTree,dict) # 决策树模型是一个字典
    assert isinstance(feaLabels,list) # 特征名称是列表

    firstStr=list(inputTree.keys())[0] # 字典的第一个节点,决策(子)数的根

    index=feaLabels.index(firstStr) # 跟节点值对应的特征位置
    valueOfFea=inputTree[firstStr][testVec[index]] # testVec[index]为跟位置测试数据的值,valueOfFea是跟相邻的下一个节点

    if isinstance(valueOfFea,dict):
        classLabel=classifyTest(valueOfFea,feaLabels,testVec)
    else:
        classLabel=valueOfFea

    return classLabel

def plot_model(tree, name):

    g = Digraph("G", filename=name, format='png', strict=False)
    first_label = list(tree.keys())[0]
    g.node("0", first_label)
    _sub_plot(g, tree, "0")
    g.view()

root = "0"

def _sub_plot(g, tree, inc):
    global root

    first_label = list(tree.keys())[0]
    ts = tree[first_label]
    for i in ts.keys():
        if isinstance(tree[first_label][i], dict):
            root = str(int(root) + 1)
            g.node(root, list(tree[first_label][i].keys())[0])
            g.edge(inc, root, str(i))
            _sub_plot(g, tree[first_label][i], root)
        else:
            root = str(int(root) + 1)
            g.node(root, tree[first_label][i])
            g.edge(inc, root, str(i))

if __name__ == '__main__':

    # 创建数据
    dataSet, labels = getDataSet()

    # 构建决策树模型
    tree=createTree(dataSet,labels)
    print("model: ",tree)

    # 测试单个样本
    item=["young","hyper","yes","normal"]
    res=classifyTest(tree,labels,item)
    print("predict: ",item,res)

    plot_model(tree,"lenses_DT")

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 机器学习实战:基于scikit-learn和tensorflow是一本介绍机器学习算法和实现的书籍。其中,scikit-learn是一个Python的机器学习库,提供了许多经典的机器学习算法和工具,如分类、回归、聚类、降维等。而tensorflow则是一个由Google开发的深度学习框架,可以用于构建神经网络、卷积神经网络、循环神经网络等深度学习模型。本书通过实例演示,让读者了解机器学习的基本概念和方法,并学会如何使用scikit-learn和tensorflow实现机器学习算法。 ### 回答2: 机器学习实战:基于scikit-learn和tensorflow是一本非常实用的机器学习实战教程,对入门和进阶学习者都很友好。 首先,这本书用通俗易懂的语言介绍了机器学习的基本概念,如监督学习、非监督学习、聚类、分类等。随后,它详细解释了scikit-learn和tensorflow的基本原理,这是非常重要的,因为这两个框架是用Python编程实现机器学习所必需的。书中还提供了一些实际案例的例子,使读者能够亲身体验机器学习算法的工作原理和实际应用。 然后,作者深入讲解了各种机器学习算法,如朴素贝叶斯、k-近邻、支持向量机、决策树和逻辑回归等。这样读者就能了解每个算法的优缺点,以及选择何种算法解决不同的问题。此外,本书还讲述了如何使用Python语言构建机器学习模型,包括训练、测试和评估模型的过程。 最后,基于深度学习,这本书提供了一些tensorflow的实例,如卷积神经网络(Convolutional Neural Networks)和循环神经网络(Recurrent Neural Networks),帮助用户更有效的解决复杂问题。 总之,机器学习实战:基于scikit-learn和tensorflow是一个非常有用的教程,旨在帮助学习者从入门到进阶有效地学习机器学习,并在实践中运用各种机器学习算法。它不仅可以增强学生的知识储备,而且能够为专业人士提供实际应用的实例。 ### 回答3: 机器学习实战:基于scikit-learn和tensorflow是一本由Aurélien Géron撰写的实用机器学习指南。书中介绍了机器学习的基础概念、算法以及如何在实际中应用这些算法。书中所使用的主要库包括scikit-learn和tensorflow。这两个库分别代表了传统的机器学习方法和深度学习方法。 书中首先介绍了机器学习的基础概念和流程,包括数据预处理、特征工程、模型选择和评估等内容。然后详细介绍了常用的机器学习算法,包括线性回归、逻辑回归、决策树、随机森林、支持向量机、神经网络等。每个算法都配有清晰的代码实现和演示案例,让读者可以更好地理解算法的原理和应用场景。 在介绍完传统的机器学习算法后,书中又详细介绍了深度学习的基础概念和应用。深度学习已经成为目前最流行的机器学习方法之一,具有很强的表征能力和预测性能。书中介绍了如何使用tensorflow构建神经网络,包括前向传播、反向传播、dropout等技术。同时,书中还介绍了很多工具和技术,如keras、tensorboard、图像处理等,用于辅助深度学习的应用。 总体来说,机器学习实战:基于scikit-learn和tensorflow这本书对于入门机器学习的读者来说是很不错的选择。它非常详细地介绍了机器学习和深度学习的原理和应用,并提供了很多实际案例和代码实现,让读者可以更好地理解和掌握这些技术。同时,书中所使用的库也是相对比较流行的,在实际应用中具有较高的参考价值。如果你想学习机器学习和深度学习,这本书值得一读。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值