《机器学习实战》第三章学习笔记(更新中)

(每段代码都来自书本,可能根据版本不同作了细微修改,注释部分主要包括个人对代码的理解以及部分测试代码和控制台输出的展示)

第三章主要讲述的内容是决策树的源码和利用Matplotlib绘制树形图

决策树的核心是利用递归一级一级进行分类:

def createBranch()
If so return 类标签;
Else 
 寻找划分数据集的最好特征(香农熵)
 划分数据集
 创建分支节点
 for 每个划分的子集:   
     调用函数createBranch()并增加返回结果到分支节点中
 return 分支节点

分类的依据是香农熵的计算,其表示的是信息增益的大小,代码及注释如下

def calcShannonEnt(dataset):
    numEntries = len(dataset)
    labelCounts = {}
    #()代表tuple元祖数据类型,元祖是一种不可变序列
    #[]代表list列表数据类型,列表是一种可变序列
    #{}代表字典数据类型,键值对
    for featVec in dataset:
        currentLabel = featVec[-1]#取最后一个元素
        if currentLabel not in labelCounts.keys():#keys是字典的所有键,这一部分是计数的,
            labelCounts[currentLabel] = 0#这一步已经创建了一个字典里面的键,=后面是赋值
        labelCounts[currentLabel] += 1
    #循环执行后labelCounts{'yes':2,'no':3}
    shannonEnt = 0.0
    for key in labelCounts:
        prob = float(labelCounts[key])/numEntries
        shannonEnt -= prob * log(prob,2)
    return shannonEnt

分类的数据集可以随意给定,书中的作为参考。注意给定的时候要有所有数据的分类信息、标签。

def createDataset():
    dataSet = [[1,1,'yes'],
               [1,1,'yes'],
               [1,0,'no'],
               [0,1,'no'],
               [0,1,'no']]
    labels = ['no surfacing','flippers']
    return dataSet,labels

下面首先是划分数据集的代码,按照想要划分的依据对已知数据集划分

def splitDataSet(dataSet,axis,value):#划分数据集,三个参数分别是待划分的数据集、划分数据集的特征、需要返回的特征的值
    retDatSet = []#list类型
    for featVec in dataSet:
        if featVec[axis] == value:
            reducedFeatVec = featVec[:axis]
            reducedFeatVec.extend(featVec[axis+1:])#extend是把括号里面的一个一个加进去
            retDatSet.append(reducedFeatVec)#append是把括号里面的当成一个元素加进去
    return retDatSet
#测试代码如下
# myData,labels = createDataset()
# test = splitDataSet(myData,0,1)
# print(test)
#控制台输出:[[1, 'yes'], [1, 'yes'], [0, 'no']],返回的是0号特征为1的所有数据的信息

由于数据集有很多种类的特征,所以涉及到特征的选择,哪些特征是最“容易区分的”(即信息熵最大)

def chooseBestFeatureToSplit(dataSet):
    numFeatures = len(dataSet[0]) - 1#特征数量
    baseEntropy = calcShannonEnt(dataSet)#返回的是信息熵的值,计算的是整个数据集的原始香农熵
    bestInfoGain = 0.0;bestFeature = -1
    for i in range(numFeatures):#遍历数据集中所有特征
        featList = [example[i] for example in dataSet]#取dataset里面每个元素的第一个
        uniqueVals = set(featList)#根据括号里面的东西创建一个无序不重复元素集
        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#总体来说是判断哪一个特征的信息熵更大,返回最大信息变化的坐标
#测试代码
# myData,labels = createDataset()
# test = chooseBestFeatureToSplit(myData)
# print(test)
#控制台输出:0,表示0号特征应当作为划分特征

上文介绍了决策树的划分原理,下文按决策流程介绍构建决策树的代码

首先要明白决策树的执行流程:按照前文划分的决策节点一级一级深入,直到遍历到叶子节点,最终每个叶子节点的所有数据分类相同

def majorityCnt(classList):
    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]#利用operator操作键值排序字典,并返回出现次数最多的分类名称
def createTree(dataSet,labels):
    classList = [example[-1] for example in dataSet]#-1表示最后一个元素,这里用的是一个小循环,取出了所有数据的最后一个标签,即['yes','yes','no','no','no']
    if classList.count(classList[0]) == len(classList):#count() 方法用于统计字符串里某个字符或子字符串出现的次数
        return classList[0]#如果list里面都是一样的东西
    if len(dataSet[0]) == 1:
        return majorityCnt(classList)#如果dataset里面只有一个数据
    bestFeat = chooseBestFeatureToSplit(dataSet)#返回的是信息熵最大特征的坐标
    bestFeatLabel = labels[bestFeat]#最适合分类的label名
    myTree = {bestFeatLabel:{}}#字典是一对:key, value的键值对
    del(labels[bestFeat])#del用于list列表操作,删除一个或者连续几个元素,这里删除了分类的label
    featValues = [example[bestFeat] for example in dataSet]#bestfeat是0,返回dataset里面第一个的值
    uniqueVals = set(featValues)#创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等
    for value in uniqueVals:
        subLabels = labels[:]
        myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet,bestFeat,value),subLabels)#递归调用createTree函数,去除了信息熵最大的特征,用其他的特征继续输入这个函数,进行二级分类
        #用字典的嵌套,字典里面的每一个值是一个字典
    return myTree
#最后达到的目的是创建了字典型的树
#测试代码
# myDat,labels = createDataset()
# myTree = createTree(myDat,labels)
# print(myTree)
#控制台输出:{'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}},是嵌套字典的形式

接下来书中介绍了将绘制树形图的过程,放到后文介绍,下面介绍使用决策树对输入数据进行分类。

在执行数据分类时, 需要输入的参数有决策树以及用于构造树的标签向量用于分类的测试向量。然后,程序比较测试数据与决策树上的数值,递归执行该过程直到进入叶子节点;最后将测试数据定义为叶子节点所属的类型。决策树分类函数代码如下

def classify(inputTree,featLabels,testVec):#输入的参数分别是,原有的决策树、决策标签和用于分类的数据
    firstStr = list(inputTree.keys())[0]
    secondDict = inputTree[firstStr]
    featIndex = featLabels.index(firstStr)#index() 方法检测字符串中是否包含子字符串 str
    for key in secondDict.keys():
        if testVec[featIndex] == key:#testVec是list类型的
            if type(secondDict[key]).__name__=='dict':
                classLabel = classify(secondDict[key],featLabels,testVec)#递归调用
            else:
                classLabel = secondDict[key]
    return classLabel#返回的是分类的信息,yes或者no,判断海洋生物是不是鱼类
#第一节点名为no surfacing,它有两个子节点:一个是名字为0的叶子节点,类标签为no;另一个是名为flippers的判断节点,此处进入递归调用,flippers节点有两个子节点。
#测试代码
# myDat,labels = createDataset()
# myTree = treePlotter.retriveTree(0)
# test = classify(myTree,labels,[1,0])
# test1 = classify(myTree,labels,[1,1])
# print(test,test1)
# 控制台输出:no yes

这里有一个需要注意的点,list(inputTree.keys())[0]和书中的inputTree.keys()[0]不同,因为书中是py2,.keys返回的是list类型的数据,但是py3中返回的就是dict_keys类型,需要进行数据转换。

介绍完数据处理,接下来就是数据存储

def storeTree(inputTree,filename):
    import pickle
    fw = open(filename,'wb')
    pickle.dump(inputTree,fw)
    fw.close()
    
def grabTree(filename):
    import pickle
    fr = open(filename)
    return pickle.load(fr)
#测试代码
storeTree(myTree,'classifierStorage.txt')
grabTree('classifierStorage.txt')

store代码可以正常运行,但是生成的txt文件是乱码,目前还没找到原因。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答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机器学习实战对于提高机器学习技术水平和推动其在各个领域的应用具有重要的推动作用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值