- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章python实现ID3决策树算法实例由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
ID3决策树是以信息增益作为决策标准的一种贪心决策树算法 。
。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
# -*- coding: utf-8 -*-
from
numpy
import
*
import
math
import
copy
import
cPickle as pickle
class
ID3DTree(
object
):
def
__init__(
self
):
# 构造方法
self
.tree
=
{}
# 生成树
self
.dataSet
=
[]
# 数据集
self
.labels
=
[]
# 标签集
# 数据导入函数
def
loadDataSet(
self
, path, labels):
recordList
=
[]
fp
=
open
(path,
"rb"
)
# 读取文件内容
content
=
fp.read()
fp.close()
rowList
=
content.splitlines()
# 按行转换为一维表
recordList
=
[row.split(
"\t"
)
for
row
in
rowList
if
row.strip()]
# strip()函数删除空格、Tab等
self
.dataSet
=
recordList
self
.labels
=
labels
# 执行决策树函数
def
train(
self
):
labels
=
copy.deepcopy(
self
.labels)
self
.tree
=
self
.buildTree(
self
.dataSet, labels)
# 构件决策树:穿件决策树主程序
def
buildTree(
self
, dataSet, lables):
cateList
=
[data[
-
1
]
for
data
in
dataSet]
# 抽取源数据集中的决策标签列
# 程序终止条件1:如果classList只有一种决策标签,停止划分,返回这个决策标签
if
cateList.count(cateList[
0
])
=
=
len
(cateList):
return
cateList[
0
]
# 程序终止条件2:如果数据集的第一个决策标签只有一个,返回这个标签
if
len
(dataSet[
0
])
=
=
1
:
return
self
.maxCate(cateList)
# 核心部分
bestFeat
=
self
.getBestFeat(dataSet)
# 返回数据集的最优特征轴
bestFeatLabel
=
lables[bestFeat]
tree
=
{bestFeatLabel: {}}
del
(lables[bestFeat])
# 抽取最优特征轴的列向量
uniqueVals
=
set
([data[bestFeat]
for
data
in
dataSet])
# 去重
for
value
in
uniqueVals:
# 决策树递归生长
subLables
=
lables[:]
# 将删除后的特征类别集建立子类别集
# 按最优特征列和值分隔数据集
splitDataset
=
self
.splitDataSet(dataSet, bestFeat, value)
subTree
=
self
.buildTree(splitDataset, subLables)
# 构建子树
tree[bestFeatLabel][value]
=
subTree
return
tree
# 计算出现次数最多的类别标签
def
maxCate(
self
, cateList):
items
=
dict
([(cateList.count(i), i)
for
i
in
cateList])
return
items[
max
(items.keys())]
# 计算最优特征
def
getBestFeat(
self
, dataSet):
# 计算特征向量维,其中最后一列用于类别标签
numFeatures
=
len
(dataSet[
0
])
-
1
# 特征向量维数=行向量维数-1
baseEntropy
=
self
.computeEntropy(dataSet)
# 基础熵
bestInfoGain
=
0.0
# 初始化最优的信息增益
bestFeature
=
-
1
# 初始化最优的特征轴
# 外循环:遍历数据集各列,计算最优特征轴
# i为数据集列索引:取值范围0~(numFeatures-1)
for
i
in
xrange
(numFeatures):
uniqueVals
=
set
([data[i]
for
data
in
dataSet])
# 去重
newEntropy
=
0.0
for
value
in
uniqueVals:
subDataSet
=
self
.splitDataSet(dataSet, i, value)
prob
=
len
(subDataSet)
/
float
(
len
(dataSet))
newEntropy
+
=
prob
*
self
.computeEntropy(subDataSet)
infoGain
=
baseEntropy
-
newEntropy
if
(infoGain > bestInfoGain):
# 信息增益大于0
bestInfoGain
=
infoGain
# 用当前信息增益值替代之前的最优增益值
bestFeature
=
i
# 重置最优特征为当前列
return
bestFeature
# 计算信息熵
# @staticmethod
def
computeEntropy(
self
, dataSet):
dataLen
=
float
(
len
(dataSet))
cateList
=
[data[
-
1
]
for
data
in
dataSet]
# 从数据集中得到类别标签
# 得到类别为key、 出现次数value的字典
items
=
dict
([(i, cateList.count(i))
for
i
in
cateList])
infoEntropy
=
0.0
for
key
in
items:
# 香农熵: = -p*log2(p) --infoEntropy = -prob * log(prob, 2)
prob
=
float
(items[key])
/
dataLen
infoEntropy
-
=
prob
*
math.log(prob,
2
)
return
infoEntropy
# 划分数据集: 分割数据集; 删除特征轴所在的数据列,返回剩余的数据集
# dataSet : 数据集; axis: 特征轴; value: 特征轴的取值
def
splitDataSet(
self
, dataSet, axis, value):
rtnList
=
[]
for
featVec
in
dataSet:
if
featVec[axis]
=
=
value:
rFeatVec
=
featVec[:axis]
# list操作:提取0~(axis-1)的元素
rFeatVec.extend(featVec[axis
+
1
:])
rtnList.append(rFeatVec)
return
rtnList
# 存取树到文件
def
storetree(
self
, inputTree, filename):
fw
=
open
(filename,
'w'
)
pickle.dump(inputTree, fw)
fw.close()
# 从文件抓取树
def
grabTree(
self
, filename):
fr
=
open
(filename)
return
pickle.load(fr)
|
调用代码 。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# -*- coding: utf-8 -*-
from
numpy
import
*
from
ID3DTree
import
*
dtree
=
ID3DTree()
# ["age", "revenue", "student", "credit"]对应年龄、收入、学生、信誉4个特征
dtree.loadDataSet(
"dataset.dat"
, [
"age"
,
"revenue"
,
"student"
,
"credit"
])
dtree.train()
dtree.storetree(dtree.tree,
"data.tree"
)
mytree
=
dtree.grabTree(
"data.tree"
)
print
mytree
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:https://blog.csdn.net/yjIvan/article/details/71194383 。
最后此篇关于python实现ID3决策树算法实例的文章就讲到这里了,如果你想了解更多关于python实现ID3决策树算法实例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
是否有显示测试用例数量以提供决策/条件覆盖率的工具? 例如: if(x>0) if(x0) 3 个案例足以覆盖决策/条件。 if(x>0) if(x0) 4 个案例足以覆盖决策/条件。 这是真的吗?
我正在尝试找到一种优雅的方式来实现易于维护的决策算法,因为决策的条件可能经常变化。 我将尝试更具体地举一个例子: 假设我正在尝试管理一家餐厅厨房的 cooking 厨师团队。 每个厨师都知道如何 co
我需要一个 Android Activity ,它应该显示一个字段,如带有图像的标题和其下方的几个动态生成的项目(我认为是 1 到 100)。如果我不想让 headsection 滚动,我会使用 Li
我正在编写函数以从值列表中提供最大值(value)。我的问题是如果所有值都相同怎么办?例如, 30,29,34,45 简单。最大值为 45。现在, 20,20,20,20 这里的最大值是20吗?或者没
我需要知道哪个检索事件日志的速度更快,但我在比较中找不到:假设需要查找的所有列都有btree索引,需要查找的json对象中的所有键都有GIN索引。 case 1: ActivityID (in
我需要在我的 iPhone 应用程序中显示一个表格: neither the number of cells nor the contents are known at compile time, b
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
这是针对在 MinGW/Windows 上使用 SDL 的小型游戏项目。 我正在研究一个物理引擎,我的想法是拥有一个Physics::Object,所有物理对象都应该派生自它,并且它会在全局 Phys
我有一个小的 LINQ 查询来填充下拉控件(WinForms Telerik 应用程序),其中的数据行显示两个值(ITNBR 和描述): var query = from i in db.ItemMa
我正在尝试使用 antlr 3 为我的语法生成词法分析器和解析器。有人可以解释这个错误是什么意思吗? error(211): T.g:14:6: [fatal] rule stmt has non-L
partykit包很好地表示了决策树。我遇到的唯一问题是标签很长然后它们重叠。是否可以移动这些标签以防止它(见下图中的蓝色箭头)? library("rpart") library("partykit
所以我环顾四周,似乎找不到合适的解决方案来解决我的问题。 问题 在我的布局中,我希望能够根据数据库中的内容选择在运行时是否存在导航项: 当前布局(导航栏) @Html.Acti
我目前正在创建一个机器学习 jupyter 笔记本作为一个小项目,并希望显示我的决策树。但是,我能找到的所有选项都是导出图形然后加载图片,这相当复杂。 所以想问问有没有办法不用导出加载图形,直接显示我
grammar AdifyMapReducePredicate; PREDICATE : PREDICATE_BRANCH | EXPRESSION ; PREDICA
我是一名优秀的程序员,十分优秀!