决策树(decision tree)很流行的一个原因就是对机器学习算法的知识要求很低.

决策模块(decision block)
终止模块(terminating block):表示已经得出结论,可以终止运行
分支(branch)连接决策模块或终止模块.

有点:计算复杂度不高,易于理解,对中间值的缺失不敏感,可处理不相关特征数据.
缺点:可能会产生过度匹配问题.
使用数据类型:数值型和标称型

创建数据集

def createDataSet():dataSet = [[1, 1, 'yes'],[1, 1, 'yes'],[1, 0, 'no'],[0, 1, 'no'],[0, 1, 'no']]labels = ['no surfacing','flippers']#change to discrete valuesreturn dataSet, labels

计算信息熵
信息增益(information gain)
熵(entropy)
如果待分类的事物可能划分在多个分类中,则符号xixix_i的信息定义为
l(xi)=−log2p(xi)l(xi)=−log2p(xi)l(x_i) = -log_2p(x_i),注意这个是信息值
其中p(xi)p(xi)p(x_i)是选择该分类的概率.
为了计算熵,要计算所有类别所有可能值包含的信息期望值:
H=−∑Ni=0p(xi)log2p(xi)H=−∑i=0Np(xi)log2p(xi)H = -\sum_{i=0}^Np(x_i)log_2p(x_i),这个才是熵
其中n是分类的数目.

信息熵图1

import matplotlib.pyplot as plt
from math import log
x = [i/100 for i in range(1,101)]
y = [-log(i,2) for i in x]
plt.xlabel("p(x)")
plt.ylabel("l(x)")
plt.title("entropy")
plt.plot(x,y)


概率越小,信息量越大.比如明天我们这太阳从东边升起,这是概率为1的事情,所以信心量很小.

熵的计算的目标是目标变量,也就是说选择不同的特征,会对应不同的目标变量,而这些不同的目标变量会对应不同的熵

信息熵图2

import matplotlib.pyplot as plt
from math import log
from mpl_toolkits.mplot3d import Axes3Dx = [i/100 for i in range(1,100)]
y = [1-i for i in x]
z = [-i*log(i,2)-(1-i)*log((1-i),2) for i in x]fig = plt.figure()
ax = Axes3D(fig)
ax.scatter(x, y, z)


由上图可以看出在目标变量为2个种类时,当二者的出现概率都为0.5时

def calcShannonEnt(dataSet):numEntries = len(dataSet)  # 计算数据集的长度labelCounts = {}for featVec in dataSet: # 计算每个目标变量的出现的次数currentLabel = featVec[-1]  # 获得该样本的目标变量if currentLabel not in labelCounts.keys(): labelCounts[currentLabel] = 0  # 计算目标变量出现的次数labelCounts[currentLabel] += 1shannonEnt = 0.0for key in labelCounts:  # 计算信息熵prob = float(labelCounts[key])/numEntriesshannonEnt -= prob * log(prob,2) #log base 2return shannonEnt

熵越高,则混合的数据也越多.

按照给定特征划分数据集

def splitDataSet(dataSet, axis, value):"""分割数据集,去掉指定的axis:param dataSet: (list)数据集:param axis: (int)要去掉的列:param value: (int)在axis列符合条件的值:return: 切割之后的数据集"""retDataSet = []  # 创建新的列表,是为了不破坏原有的列表,因为list类型是引用类型for featVec in dataSet:if featVec[axis] == value:reducedFeatVec = featVec[:axis]     #截取该行之前的reducedFeatVec.extend(featVec[axis+1:])  # 添加该行之后的retDataSet.append(reducedFeatVec)return retDataSet

计算信息增益最大的的特征

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]  # 创建所有样本的第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 # 计算信息增益if (infoGain > bestInfoGain):       # 如果信息增益大于最优增益bestInfoGain = infoGain         # 更新bestFeature = ireturn bestFeature                      # 返回信息增益最大的特征

创建树

def majorityCnt(classList):classCount={}for vote in classList:if vote not in classCount.keys(): classCount[vote] = 0classCount[vote] += 1sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)return sortedClassCount[0][0]def createTree(dataSet,labels):"""递归创建树:param dataSet: (list)嵌套列表,数据集:param labels: (list)标签列表:return: (dict)返回嵌套字典"""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[:]  # 复制所有剩余的labelsmyTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value),subLabels)return myTree

叶节点(leaf node)
判断节点(decision node)

决策树分类器
就是查询嵌套词典

def classify(inputTree,featLabels,testVec):"""决策树模型分类器:param inputTree: (dict)一个嵌套字典,树模型:param featLabels: (list)特征标签:param testVec: (list)测试向量:return:"""firstStr = inputTree.keys()[0]  # 获得第一个节点keysecondDict = inputTree[firstStr]  #featIndex = featLabels.index(firstStr)key = testVec[featIndex]valueOfFeat = secondDict[key]if isinstance(valueOfFeat, dict): # 如果是字典就继续递归,如果不是则返回classLabel = classify(valueOfFeat, featLabels, testVec)else: classLabel = valueOfFeatreturn classLabel

机器学习实战(MachineLearinginAction) 第三章 决策树相关推荐

  1. 【机器学习实战】第3章 决策树(Decision Tree)

    第3章 决策树 <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/ ...

  2. 【机器学习实战】第3章 决策树(DecisionTree)

    第3章 决策树 <script type="text/javascript" src=" http://cdn.mathjax.org/mathjax/latest ...

  3. 《机器学习实战》第三章

    记 第三章学习分类任务--引入MNIST数据集,分类0-9十个数字. 1.载入数据集 from sklearn.datasets import fetch_openml mnist = fetch_o ...

  4. 《机器学习实战》第三章:决策树(3)测试、存储、实例

    1. CH2-kNN(1)         2. CH2-kNN(2) 3. CH2-kNN(3) 4. CH3-决策树(1)     5. CH3-决策树(2) 6. CH3-决策树(3) 7. C ...

  5. 《机器学习实战》——第3章 决策树

    3.1 决策树的构造 优点:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据. 缺点:可能会产生过度匹配的问题. 适用数据类型:数值型和标称型. 创建分支的伪代码函数 c ...

  6. 【阿旭机器学习实战】【13】决策树分类模型实战:泰坦尼克号生存预测

    [阿旭机器学习实战]系列文章主要介绍机器学习的各种算法模型及其实战案例,欢迎点赞,关注共同学习交流. 本文用机器学习中的决策树分类模型对泰坦尼克号生存项目进行预测. 关于决策树的详细介绍及原理参见前一 ...

  7. Python--Redis实战:第三章:Redis命令:第七节:其他命令

    上一篇文章:Python--Redis实战:第三章:Redis命令:第六节:发布与订阅 下一篇文章:Python--Redis实战:第四章:数据安全与性能保障:第1节:持久化选项 到目前为止,本章介绍 ...

  8. 周志华-机器学习西瓜书-第三章习题3.3 编程实现对率回归

    本文为周志华机器学习西瓜书第三章课后习题3.3答案,编程实现对率回归,数据集为书本第89页的数据 使用tensorflow实现过程 # coding=utf-8 import tensorflow a ...

  9. 小白学机器学习西瓜书-第三章对数几率回归

    小白学机器学习西瓜书-第三章对数几率回归 3.3 对数几率回归 3.3.1 对数几率函数 3.3.1 估计参数 上一部分我们介绍了线性回归,包括简单的二元回归和多元回归,这两个主要解决的是拟合预测的问 ...

最新文章

  1. exit()与_exit()的区别(转)
  2. 双系统如何删除Linux
  3. java学习论坛汇总
  4. Eclipse 报java.lang.OutOfMemoryError: PermGen space错
  5. 从能用到好用,GIS信创如何做到行稳致远?
  6. python语法学习—实现猜拳游戏
  7. Google再曝偷偷收集用户隐私,安卓苹果用户全都中招
  8. iOS底层探索之多线程(十)—GCD源码分析( 信号量dispatch_semaphore_t)
  9. angular的组件通信
  10. 用npm发布一个npm包
  11. Emacs学习笔记(二)
  12. 超级搜索术 总结篇2
  13. 想想五年后的你,什么工作值得你去拼命? 转~ 推迟满足感 成长比成功重要
  14. 28个在线游戏编程学习网站
  15. 什么是UML、UML类图
  16. 海外直播、聊天交友APP的开发及上架GooglePlay体验【Compose版】
  17. Mybatis源码研究序
  18. 崛起于Springboot2.X之集成规则引擎Drools(41)
  19. 线段树的建树 单点修改 区间查询
  20. NameNode处理上报block块逻辑分析

热门文章

  1. Python实现局域网内屏幕广播的技术要点分析
  2. html中如何实现选择存储路径的功能_Tomcat 路由请求的实现 Mapper
  3. grpc python异步实现_在grpcpython中处理异步流请求
  4. caffe 实例笔记 2 LeNet详细解读及实现
  5. 每个java小应用程序必须是,每个Java小应用程序必须定义为()。 A.Applet类或JApplet类的子类B.JFrame类的子类...
  6. delphi中webbrowse控件中模拟点击文本超链接_功能测试——控件测试
  7. isscalar matlab,大数的素性检测(用MATLAB仿真)
  8. zabbix无效监控项_使用zabbix模板监控tomcat-解决模板部分监控项不生效问题
  9. golang https 代理_代理,生活中随处可见,Go中如何进行 HTTPS 代理呢?
  10. mysql+视频文件转成流_视频文件自动转rtsp流