# 基于决策树的工业数据分类——数据智能

1 决策树

2 构建决策树

``` from math import log

###计算香农熵(为 float 类型）

def calShang(dataSet):

numEntries = len(dataSet)

labelCounts = {}##创建字典

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 creatDataSet():

dataSet = [[1,1,'yes'],

[1,1,'yes'],

[1,0,'no'],

[0,1,'no'],

[0,1,'no']]

labels = ['no surfacing','flippers']

return dataSet,labels ''' #测试

myData,labels = creatDataSet()

print("原数据为：",myData)

print("标签为：",labels)

shang = calShang(myData)

print("香农熵为：",shang) '''
```

``` ###划分数据集（以指定特征将数据进行划分）

def splitDataSet(dataSet,feature,value):##传入待划分的数据集、划分数据集的特征以及需 要返回的特征的值

newDataSet = []

for featVec in dataSet:

if featVec[feature] == value:

reducedFeatVec = featVec[:feature]             reducedFeatVec.extend(featVec[feature + 1:])             newDataSet.append(reducedFeatVec)

return newDataSet''' #测试

myData,labels = creatDataSet()

print("原数据为：",myData)

print("标签为：",labels)

split = splitDataSet(myData,0,1)

print("划分后的结果为:",split) '''
```

``` ##选择最好的划分方式(选取每个特征划分数据集，从中选取信息增益最大的作为最优 划分)在这里体现了信息增益的概念 def chooseBest(dataSet):

featNum = len(dataSet[0]) - 1

baseEntropy = calShang(dataSet)

bestInforGain = 0.0

bestFeat = -1##表示最好划分特征的下标

for i in range(featNum):

featList = [example[i] for example in dataSet] #列表

uniqueFeat = set(featList)##得到每个特征中所含的不同元素

newEntropy = 0.0

for value in uniqueFeat:

subDataSet = splitDataSet(dataSet,i,value)

prob = len(subDataSet) / len(dataSet)

newEntropy += prob * calShang(subDataSet)

inforGain = baseEntropy - newEntropy

if (inforGain > bestInforGain):

bestInforGain = inforGain

bestFeature = i#第 i 个特征是最有利于划分的特征

return bestFeature      ''' ##测试

myData,labels = creatDataSet()

best = chooseBest(myData) print(best) '''
```

3 递归构建决策树

```  ##递归构建决策树 import operator #返回出现次数最多的分类名称 def majorClass(classList):

classCount = {}

for vote in classList:

if vote not in classCount.keys():

classCount[vote] = 0

classCount[vote] += 1     #降序排序，可以指定 reverse = true

sortedClassCount = sorted(classcount.iteritems(),key = operator.itemgetter(1),reverse = true)

return sortedClassCount[0][0]

#创建树 def creatTree(dataSet,labels):

classList = [example[-1] for example in dataSet]

if classList.count(classList[0]) == len(classList):

return classList[0]

if len(dataSet[0]) == 1:

return majorClass(classList)

bestFeat = chooseBest(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] = creatTree(splitDataSet(dataSet,bestFeat,value),subLabels)

return myTree

''' #测试 myData,labels = creatDataSet() mytree = creatTree(myData,labels) print(mytree) '''
```

0 条评论

• ### 四足机器人：小而美的地面无人平台「AI产品/工程落地」

四足机器人可以说是地面机器人中的多旋翼无人机了，以其对恶劣地形的强适应性，越来越受到广泛的关注，虽然目前还是很小众，但凭借波士顿动力的SpotMini等爆款也是...

• ### 基于朴素贝叶斯的分类模型及代码示例 | 机器分类

贝叶斯分类器是一类分类算法的总称，贝叶斯分类均以贝叶斯定理为基础，朴素贝叶斯是贝叶斯分类中简单实用的一种，是基于贝叶斯定理与特征条件独立假设的分...

• ### 数据预处理技术研究 | 冰水数据智能专题 | 1st

数据预处理是数据挖掘的重要一环，要使挖掘方案挖掘出丰富的知识，就必须为它提供干净、准确、简洁的数据。然而实际应用系统中收集到的原始数据是“脏”的，不完全的、...

• ### javascript中优雅的处理async和await异常

无论是return了Promise， 还是内部调用了await， 就算什么也没做，它也返回promise; 一个函数，只要被标记了async，那么它就返回...

• ### JavaScript基础1

JavaScript写在<script></script>之间    <script type="text/javascript">表示在<script></s...

• ### 专栏 | 目标检测算法之YOLOv3及YOLOV3-Tiny

昨天稍微填上了YOLOv2损失函数的坑，然后我在知乎关注了一个有趣的问题，地址是：https://www.zhihu.com/question/35700517...

• ### JSONP原理及使用

首先提一下JSON这个概念，JSON是一种轻量级的数据传输格式，被广泛应用于当前Web应用中。JSON格式数据的编码和解析基本在所有主流语言中都被实现，所以现在...

• ### 目标检测算法之YOLOv3及YOLOv3-Tiny

昨天稍微填上了YOLOv2损失函数的坑，然后我在知乎关注了一个有趣的问题，地址是：https://www.zhihu.com/question/35700517...

• ### nodejs的setTimeout(fn,0)和setImmediate谁先执行的问题

nodejs的事件循环分为几个阶段(phase)。setTimeout是属于定时器阶段，setImmediate是属于check阶段。顺序上定时器阶段是比che...