机器学习_决策树Python代码详解

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

决策树缺点:可能会产生过度匹配问题。

决策树的一般步骤:

(1)代码中def 1,计算给定数据集的香农熵:

其中n为类别数,D为数据集,每行为一个样本,p表示当前样本集合D中第k类样本所占的比例,Ent(D)越小,D的纯度越高,即表示D中样本大部分属于同一类;反之,D的纯度越低,即数据集D中的类别数比较多。

(2)代码中def 2,选择最好的数据集划分方式,即选择信息增益最大的属性:

其中

这里V表示属性a的可能的取值数,Dv表示属性a上取值为av的样本。

(3)代码中 def 3,按照给定特征划分数据集:选取最优属性后,再从属性的各个取值中选取最优的属性,以此类推。

(4)代码中def 5,递归构造数,数的结束标志为:a、类别完全相同则停止划分;b、代码中def 4,如果数据集已经处理了所有属性,但是类标签依然不是唯一的,此时采用多数表决法,即遍历完所有特征时返回出现次数最多的类别。

from math import log

# 计算数据集的信息熵,熵越小,说明数据集的纯度越高def calcShannonEnt(dataset):   # def 1    numEntries = len(dataset)   # 样本数,这里的dataSet是列表    labelCounts = {}  #定义一个字典,key为类别,值为类别数    for featVec in dataset:   # 统计各个类别的个数        currentLabel = featVec[-1]        if currentLabel not in labelCounts.keys():            labelCounts[currentLabel] = 0        labelCounts[currentLabel] += 1    shannonEnt = 0.0   # 信息熵    for key in labelCounts:        prob = float(labelCounts[key])/numEntries        shannonEnt -= prob * log(prob,2)    return shannonEnt  # 信息熵

# 选出最好的数据集划分方式,即找出具有最大信息增益的特征def chooseBestFeatureToSplit(dataSet):    #def 2    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]  #第i列特征的所有特征的取值        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  # 表示属性为value的信息增益        if (infoGain > bestInfoGain):            bestInfoGain = infoGain            bestFeature = i    return bestFeature  # 具有最大信息增益的特征

# 按照给定特征维数划分数据集,数据集中一行为一个样本# def 3def splitDataSet(dataSet,axis,value):   # axis可表示数据集的列,也就是特征为数,value表示特征的取值    retDataSet = []    for featVec in dataSet:        if featVec[axis] == value:            reducedFeatVec = featVec[:axis]    # 在数据集中去掉axis这一列            reducedFeatVec.extend(featVec[axis+1:])            retDataSet.append(reducedFeatVec)    return retDataSet  # 表示去掉在axis中特征值为value的样本后而得到的数据集

# 当处理了所有属性,但是类标签依然不是唯一的,此时采用多数表决法决定该叶子节点的分类def majorityCnt(classList):   # def 4    classCount = {}    for vote in classList:        if vote not in classCount.keys():            classCount[vote] = 0        classCount += 1    sortedClassCount = sorted(classCount.items(),key=lambda classCount: classCount[1],reverse = True)    return sortedClassCount[0][0]

# 创建树def createTree(dataSet,labels):   #  def 5    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)  #去掉重复的特征    for value in uniqueVals:        subLabels = labels[:]   # 减少后的特征名        myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet,bestFeat,value),subLabels)    return myTree

def createDateSet():    dataSet = [[1,1,‘yes‘],[1,1,‘yes‘],[1,0,‘no‘],[0,1,‘no‘],[0,1,‘no‘]]    labels = [‘no surfacing‘,‘flippers‘]   #属性名    return dataSet,labels

myData,myLabel = createDateSet()createTree(myData,myLabel)print(createTree(myData,myLabel))#print(chooseBestFeatureToSplit(myData))# print(splitDataSet(myData,0,1))# print(splitDataSet(myData,0,0))

原文地址:https://www.cnblogs.com/lijingblog/p/9742635.html

时间: 2024-07-30 21:39:51

机器学习_决策树Python代码详解的相关文章

python正则表达式详解

python正则表达式详解 正则表达式是一个很强大的字符串处理工具,几乎任何关于字符串的操作都可以使用正则表达式来完成,作为一个爬虫工作者,每天和字符串打交道,正则表达式更是不可或缺的技能,正则表达式的在不同的语言中使用方式可能不一样,不过只要学会了任意一门语言的正则表达式用法,其他语言中大部分也只是换了个函数的名称而已,本质都是一样的.下面,我来介绍一下python中的正则表达式是怎么使用的. 首先,python中的正则表达式大致分为以下几部分: 元字符 模式 函数 re 内置对象用法 分组用

Github-jcjohnson/torch-rnn代码详解

Github-jcjohnson/torch-rnn代码详解 [email protected] http://www.cnblogs.com/swje/ 作者:Zhouwan  2016-3-18 声明: 1)本文仅供学术交流,非商用.所以每一部分具体的参考资料并没有详细对应.如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除. 2)本人才疏学浅,整理总结的时候难免出错,还望各位前辈不吝指正,谢谢. 请联系:[email protected] 或[email protected] 本研

DeepLearning tutorial(3)MLP多层感知机原理简介+代码详解

DeepLearning tutorial(3)MLP多层感知机原理简介+代码详解 @author:wepon @blog:http://blog.csdn.net/u012162613/article/details/43221829 本文介绍多层感知机算法,特别是详细解读其代码实现,基于python theano,代码来自:Multilayer Perceptron,如果你想详细了解多层感知机算法,可以参考:UFLDL教程,或者参考本文第一部分的算法简介. 经详细注释的代码:放在我的gith

DeepLearning tutorial(4)CNN卷积神经网络原理简介+代码详解

DeepLearning tutorial(4)CNN卷积神经网络原理简介+代码详解 @author:wepon @blog:http://blog.csdn.net/u012162613/article/details/43225445 本文介绍多层感知机算法,特别是详细解读其代码实现,基于python theano,代码来自:Convolutional Neural Networks (LeNet).经详细注释的代码和原始代码:放在我的github地址上,可下载. 一.CNN卷积神经网络原理

DeepLearning tutorial(1)Softmax回归原理简介+代码详解

DeepLearning tutorial(1)Softmax回归原理简介+代码详解 @author:wepon @blog:http://blog.csdn.net/u012162613/article/details/43157801 本文介绍Softmax回归算法,特别是详细解读其代码实现,基于python theano,代码来自:Classifying MNIST digits using Logistic Regression,参考UFLDL. 一.Softmax回归简介 关于算法的详

迅为4412开发板Linux驱动教程——总线_设备_驱动注册流程详解

视频下载地址: 驱动注册:http://pan.baidu.com/s/1i34HcDB 设备注册:http://pan.baidu.com/s/1kTlGkcR 总线_设备_驱动注册流程详解 ? 注册流程图 ? 设备一般都需要先注册,才能注册驱动 – 现在越来越多的热拔插设备,反过来了.先注册驱动,设备来了再注册 设备 ? 本节使用的命令 – 查看总线的命令#ls /sys/bus/ – 查看设备号的命令#cat /proc/devices ? 设备都有主设备号和次设备号,否则255个设备号不

Python 递归函数 详解

Python 递归函数 详解   在函数内调用当前函数本身的函数就是递归函数   下面是一个递归函数的实例: 第一次接触递归函数的人,都会被它调用本身而搞得晕头转向,而且看上面的函数调用,得到的结果会是: 为什么会得出上面的结果呢?因为都把调用函数本身之后的代码给忘记了,就是else之后的python 代码. 实际此递归函数输出的是以下结果: 相信大家看到这里都有点蒙,小编也一样,我第一次看到这个递归函数时,只能理解到第一个结果.那是因为,大部分人在做事情的时候,中断第一件事,被安排去做第二件事

tiny_cnn代码详解(3)——层间继承关系

在上一篇博文中我们顺利将tiny_cnn的程序调试通过,在这篇博文中我们尝试从整体角度给出对tiny_cnn这个深度学习框架的解读,重点论述一下其各个层直接类封装的继承关系. 一.卷积神经网络快速入门 tiny_cnn作为卷积神经网络的一种实现形式,在探讨其框架结构之前,首先需要简要介绍一些卷积神经网络相关的知识.首先,给出经典卷积神经网络的网络结构: 这个是经典的LeNet-5的网络结构图,五层网络.最早用于支票上的手写数字识别,也是最早的商业化的深度学习模型.从上图中可以看出,卷积神经网络主

python线程详解

#线程状态 #线程同步(锁)#多线程的优势在于可以同时运行多个任务,至少感觉起来是这样,但是当线程需要共享数据时,可能存在数据不同步的问题. #threading模块#常用方法:'''threading.currentThread():返回当前的线程变量threading.enumerate():返回一个包含正在运行的线程的list,正在运行指:线程启动后,结束前,不包含启动前和终止后的线程threading.activeCount():返回正在运行的线程数量,与len(threading.en