决策树模型算法研究与案例分析 (2)

天气状况有晴,云和雨;气温用华氏温度表示;相对湿度用百分比;还有有无风。当然还有顾客是不是在这些日子光顾俱乐部。最终他得到了14行5列的数据表格。


决策树模型算法研究与案例分析

构建决策树

决策树模型就被建起来用于解决问题。


决策树模型算法研究与案例分析

结果分析

决策树是一个有向无环图。根结点代表所有数据。分类树算法可以通过变量outlook,找出最好地解释非独立变量play(打高尔夫的人)的方法。变量outlook的范畴被划分为以下三个组:晴天,多云天和雨天。

我们得出第一个结论:如果天气是多云,人们总是选择玩高尔夫,而只有少数很着迷的甚至在雨天也会玩。

接下来我们把晴天组的分为两部分,我们发现顾客不喜欢湿度高于70%的天气。最终我们还发现,如果雨天还有风的话,就不会有人打了。

这就通过分类树给出了一个解决方案。小王(老板)在晴天,潮湿的天气或者刮风的雨天解雇了大部分员工,因为这种天气不会有人打高尔夫。而其他的天气会有很多人打高尔夫,因此可以雇用一些临时员工来工作。

决策树算法实现与分析 案例: 判定鱼类和非鱼类

案例需求描述

我们采集海洋生物数据信息,选择其中5条如下表所示,从诸多特征中选择2个最主要特征,以及判定是否属于鱼类(此处我们选择二分类法即只考虑鱼类和非鱼类)。
根据这些信息如何创建一个决策树进行分类并可视化展示?

收集数据

部分数据采集信息

序号 不浮出水面是否可以生存 是否有脚蹼 属于鱼类
1        
2        
3        
4        
5        

我们将自然语言数据转化为计算机输入数据,代码实现如下:

'''创建数据集,返回数据集和标签''' 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

运行查看数据集的特征向量和分类标签:

# 1 打印数据集和标签 dataset,label=createDataSet() print(dataset) print(label)

运行结果:

[[1, 1, 'yes'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']] ['no surfacing', 'flippers']

准备数据

由于我们输入的数据已经是数据预处理后的数据,这一步不需要进行。

分析数据

我们得到数据之后,到底是按照第一个特征即(不浮出水面是否可以生存)还是第二个特征即(是否有脚蹼)进行数据划分呢?这里面就需要找到一种量化的方法判断特征的选择。在介绍具体数据划分方法之前,我们首先明白划分数据集的最大原则是:将无序的数据变得更加有序

1948 年,香农引入信息熵,将其定义为离散随机事件的出现概率。一个系统越有序,信息熵就越低;反之,一个系统越混乱,信息熵就越高。所以说,信息熵可以被认为是系统有序化程度的一个度量。

这里就要用的信息熵的概念,熵越高表示混合数据越多,度量数据集无序程度。我们看下信息熵的数学描述(具体请自行查找熵相关知识):

决策树模型算法研究与案例分析

计算数据集的香农熵(信息期望值)

根据公式比较容易理解的实现方法1如下:

'''计算数据集的香农熵(信息期望值):熵越高表示混合数据越多,度量数据集无序程度''' def calcShannonEnt(dataSet): numEntries = len(dataSet) # 计算数据集中实例总数 labelCounts = {} # 创建字典,计算分类标签label出现的次数 for featVec in dataSet: currentLabel = featVec[-1] # 记录当前实例的标签 if currentLabel not in labelCounts.keys():# 为所有可能的分类创建字典 labelCounts[currentLabel] = 0 labelCounts[currentLabel] += 1 # print(featVec, labelCounts) # 打印特征向量和字典的键值对 # 对于label标签的占比,求出label标签的香农熵 shannonEnt = 0.0 for key in labelCounts: prob = float(labelCounts[key])/numEntries # 计算类别出现的概率。 shannonEnt -= prob * log(prob, 2) # 计算香农熵,以 2 为底求对数 print(Decimal(shannonEnt).quantize(Decimal('0.00000'))) return shannonEnt

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyysjy.html