决策树(Decision Tree)算法 python简单实现
""
"""
import numpy as np
from math import log
import operator
import json
#生成海洋生物数据
def createData():
data = [[1,1,'yes'],
[1,1,'yes'],
[1,0,'no'],
[0,1,'no'],
[0,1,'no']]
labels=['不浮出水面可生存','脚蹼']
return data, labels
#生产西瓜数据
# =============================================================================
# 色泽: 浅白 青绿 乌黑
# 根蒂: 蜷缩 稍蜷 硬挺
# 敲声: 浊响 沉闷 清脆
# 纹理: 清晰 稍糊 模糊
# 脐部: 凹陷 稍凹 平坦
# 触感: 硬滑 软粘
# =============================================================================
def createWatermelonData():
data = [['青绿','蜷缩','浊响','清晰','凹陷','硬滑','好'],
['乌黑','蜷缩','沉闷','清晰','凹陷','硬滑','好'],
['乌黑','蜷缩','浊响','清晰','凹陷','硬滑','好'],
['青绿','蜷缩','沉闷','清晰','凹陷','硬滑','好'],
['浅白','蜷缩','浊响','清晰','凹陷','硬滑','好'],
['青绿','稍蜷','浊响','清晰','稍凹','软粘','好'],
['乌黑','稍蜷','浊响','稍糊','稍凹','软粘','好'],
['乌黑','稍蜷','浊响','清晰','稍凹','硬滑','好'],
['乌黑','稍蜷','沉闷','稍糊','稍凹','硬滑','坏'],
['青绿','硬挺','清脆','清晰','平坦','软粘','坏'],
['浅白','硬挺','清脆','模糊','平坦','硬滑','坏'],
['浅白','蜷缩','浊响','模糊','平坦','软粘','坏'],
['青绿','稍蜷','浊响','稍糊','凹陷','硬滑','坏'],
['浅白','稍蜷','沉闷','稍糊','凹陷','硬滑','坏'],
['乌黑','稍蜷','浊响','清晰','稍凹','软粘','坏'],
['浅白','蜷缩','浊响','模糊','平坦','硬滑','坏'],
['青绿','蜷缩','沉闷','模糊','稍凹','硬滑','坏']]
labels=['色泽','根蒂','敲声','纹理','脐部','触感']
return data, labels
#计算熵
def calcEnt(data):
num = len(data)
labelCounts = {}
for item in data:
label = item[-1]
if label not in labelCounts.keys():labelCounts[label] = 0
labelCounts[label] += 1
ent = 0
for key in labelCounts:
prob = labelCounts[key]*1.0/num
ent -= prob * log(prob,2)
return ent
#划分数据 根据某一特征axis 取出该特征某一特定值value的数据
def splitData(dataSet,axis,value):
retData=[]
for item in dataSet:
if item[axis]==value:
newItem = item[:axis]
newItem.extend(item[axis+1:])
retData.append(newItem)
return retData
#从特种中选择最好的方式 增益最高
def chooseBestFeature(dataSet):
numFeat = len(dataSet[0]) - 1
## 初始化 信息熵 最佳信息增益 最佳特征
baseEnt = calcEnt(dataSet)
bestGain = 0
bestFeat = -1
for i in range(numFeat):
##获取第i个特征的所有取值
uniFeats = set([item[i] for item in dataSet])
newEnt = 0
##计算按第i个特征分类的熵
for value in uniFeats:
##第i个特征值 外汇常见问题的概率
subData = splitData(dataSet,i,value)
prob = float(len(subData))/len(dataSet)
newEnt += prob * calcEnt(subData)
gain = baseEnt - newEnt
if gain>bestGain:
bestGain = gain
bestFeat = i
return bestFeat
## 返回类别最高的分类
def majorityCnt(classList):
classCount={}
for vote in classList:
if vote not in classCount.keys():
classCount[vote]=0
classCount[vote]+=1
sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
return sortedClassCount[0][0]
#建立表
def createTree(dataSet,labels):
classList = [item[-1] for item in dataSet]
##只包含一种分类 返回该分类
if len(set(classList))==1:
return classList[0]
if len(dataSet[0])==1:
return majorityCnt(classList)
bestFeat = chooseBestFeature(dataSet)
bestFeatLabel = labels[bestFeat]
##以最佳分类标签为节点 以字典形式保存
myTree={bestFeatLabel:{}}
del(labels[bestFeat])
uniFeats = set([item[bestFeat] for item in dataSet])
for value in uniFeats:
subLabels = labels[:]
##根据不同的value 继续建立子分支
myTree[bestFeatLabel][value] = createTree(splitData(dataSet,bestFeat,value),subLabels)
return myTree
data,labels = createWatermelonData()
ret=createTree(data,labels)
print(json.dumps(ret,sort_keys=True, indent=2,ensure_ascii=False))
{
"纹理": {
"模糊": "坏",
"清晰": {
"根蒂": {
"硬挺": "坏",
"稍蜷": {
"色泽": {
"乌黑": {
"触感": {
"硬滑": "好",
"软粘": "坏"
}
},
"青绿": "好"
}
},
"蜷缩": "好"
}
},
"稍糊": {
"触感": {
"硬滑": "坏",
"软粘": "好"
}
}
}
}
原文链接:https://blog.csdn.net/zkt286468541/article/details/103372686
决策树(Decision Tree)算法 python简单实现的更多相关文章
- 机器学习算法实践:决策树 (Decision Tree)(转载)
前言 最近打算系统学习下机器学习的基础算法,避免眼高手低,决定把常用的机器学习基础算法都实现一遍以便加深印象.本文为这系列博客的第一篇,关于决策树(Decision Tree)的算法实现,文中我将对决 ...
- 数据挖掘 决策树 Decision tree
数据挖掘-决策树 Decision tree 目录 数据挖掘-决策树 Decision tree 1. 决策树概述 1.1 决策树介绍 1.1.1 决策树定义 1.1.2 本质 1.1.3 决策树的组 ...
- GBDT(Gradient Boosting Decision Tree)算法&协同过滤算法
GBDT(Gradient Boosting Decision Tree)算法参考:http://blog.csdn.net/dark_scope/article/details/24863289 理 ...
- (ZT)算法杂货铺——分类算法之决策树(Decision tree)
https://www.cnblogs.com/leoo2sk/archive/2010/09/19/decision-tree.html 3.1.摘要 在前面两篇文章中,分别介绍和讨论了朴素贝叶斯分 ...
- 决策树decision tree原理介绍_python sklearn建模_乳腺癌细胞分类器(推荐AAA)
sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...
- 用于分类的决策树(Decision Tree)-ID3 C4.5
决策树(Decision Tree)是一种基本的分类与回归方法(ID3.C4.5和基于 Gini 的 CART 可用于分类,CART还可用于回归).决策树在分类过程中,表示的是基于特征对实例进行划分, ...
- 机器学习方法(四):决策树Decision Tree原理与实现技巧
欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.技术.应用感兴趣的同学加入. 前面三篇写了线性回归,lass ...
- 决策树Decision Tree 及实现
Decision Tree 及实现 标签: 决策树熵信息增益分类有监督 2014-03-17 12:12 15010人阅读 评论(41) 收藏 举报 分类: Data Mining(25) Pyt ...
- 机器学习-决策树 Decision Tree
咱们正式进入了机器学习的模型的部分,虽然现在最火的的机器学习方面的库是Tensorflow, 但是这里还是先简单介绍一下另一个数据处理方面很火的库叫做sklearn.其实咱们在前面已经介绍了一点点sk ...
随机推荐
- vue-cli脚手架工具新老版本安装对比
1.老版本 Shift+鼠标右键 选择打开命令窗口 1.创建项目之前,需先确保本机已经安装node 在命令窗口中执行node -v npm -v 2.一般情况下用npm安装东西比较慢,可以使用淘宝 ...
- Java中Calendar类的常用方法(对时间进行计算的类)
例子: /**** * 传入具体日期 ,返回具体日期增加一个月. * @param date 日期(2017-04-13) * @return 2017-05-13 * @throws ParseEx ...
- C盘Administrator中 .m2/repository里面是什么
${user.home}/.m2/repository文件夹是maven默认的本地仓库地址maven仓库分为远程仓库和本地仓库,当你在pom里配置依赖项目后,maven首先会从本地仓库查找该项目,如果 ...
- Spark核心原理初探
一.运行架构概览 Spark架构是主从模型,分为两层,一层管理集群资源,另一层管理具体的作业,两层是解耦的.第一层可以使用yarn等实现. Master是管理者进程,Worker是被管理者进程,每个W ...
- 【InnoDB】体系结构
一.概述: innodb的整个体系架构就是由多个内存块组成的缓冲池及多个后台线程构成.缓冲池缓存磁盘数据(解决cpu速度和磁盘速度的严重不匹配问题),后台进程保证缓存池和磁盘数据的一致性(读取.刷新) ...
- 木棍加工(dp,两个参数的导弹拦截问题)
题目描述 一堆木头棍子共有n根,每根棍子的长度和宽度都是已知的.棍子可以被一台机器一个接一个地加工.机器处理一根棍子之前需要准备时间.准备时间是这样定义的: 第一根棍子的准备时间为1分钟: ...
- CDN技术之--集群服务与负载均衡
Web集群是由多个同时运行同一个web应用的服务器组成,在外界看来就像一个服务器一样,这多台服务器共同来为客户提供更高性能的服务.集群更标准的定义是:一组相互独立的服务器在网络中表现为单一的系统,并以 ...
- es6 常用的语法
1.es6 模块化 你import 和 export export default 为默认到处,而export能导出多个方法或变量. 2. es6——class与普通构造函数的区别 class的继承方 ...
- SqlServer2008跨服务器操作
--创建链接服务器 exec sp_addlinkedserver @server= 'SQL2' --链接服务器名 , @srvproduct= '' --OLE DB 数据源的产品名称:如果为 S ...
- PostgreSQL的约束
约束类型:检查约束.非空约束.唯一约束.主键.外键 1. 检查约束 设置某个字段里的数值必须满足约束表达式的条件. 例:限制人的年龄在0~120之间,语句如下: create table perso ...