没有合适的资源?快使用搜索试试~ 我知道了~
决策树模型在鸢尾花数据集上的实现,包括完整代码和可视化以及讲解,准确率很高,亲测可用!
资源推荐
资源详情
资源评论
山东大学 软件 学院
机器学习基础 课程实验报告
学号:
姓名:
班级:
实验题目:决策树模型在鸢尾花数据集上的实现
实验学时:4
实验日期: 2023.5.2
硬件环境:
设备名称 DESKTOP-ODCL7ST
处理器 Intel(R) Core(TM) i7-10510U CPU @ 1.80GHz 2.30 GHz
机带 RAM 8.00 GB (7.82 GB 可用)
设备 ID E0D5A142-FDA1-4645-B185-5081A430C33E
产品 ID 00342-35536-76153-AAOEM
系统类型 64 位操作系统, 基于 x64 的处理器
笔和触控 没有可用于此显示器的笔或触控输入
软件环境:
PyCharm2022.2.2
实验步骤与内容:
一、决策树学习基本过程
基本流程:遵循”分而治之“策略。
1)开始:构建根节点,将所有训练数据都放在根节点,选择一个最优特征,按
着这一特征将训练数据集分割成子集,使得各个子集有一个在当前条件下最好的
分类。
2)如果这些子集已经能够被基本正确分类,那么构建叶节点,并将这些子集分
到所对应的叶节点去。
3)如果还有子集不能够被正确的分类,那么就对这些子集选择新的最优特征,
继续对其进行分割,构建相应的节点,如果递归进行,直至所有训练数据子集被
基本正确的分类,或者没有合适的特征为止。
4)每个子集都被分到叶节点上,即都有了明确的类,这样就生成了一颗决策树。
划分选择
决策树的关键:如何选择最优划分属性。
信息增益
在划分数据集前后
“
纯度
”
发生的变化称为信息增益,获得信息增益最高的特征就
是最好的选择(信息增益越大,则意味着使用属性 a 来进行划分所获得的“纯度
提升”越大),集合纯度的度量方式称为信息熵,或者简称熵。
ID3 决策树学习算法就是以信息增益为准则来选择划分属性。
增益率
信息增益准则的缺点:对可取值数目较多的属性有所偏好。
为了减少这种偏好,提出“增益率”来选择最优划分属性(C4.5 决策树算法)。
基尼指数
基尼指数反映了从数据集 D 中随机抽取两个样本,其类别标记不一致的概率。因
此,基尼指数越小,则数据集 D 的纯度越高。将基尼指数最小的属性作为最优划
分属性(CART 决策树)
剪枝处理
剪枝(pruning):从已经生成的树上裁掉一些子树或叶节点,并将其根节点或
父节点作为新的叶子节点,从而简化分类树模型。
剪枝是决策树学习算法对付“过拟合”的主要手段。过拟合产生的原因在于在学习
时过多的考虑如何提高对训练数据的正确分类,从而构建出过于复杂的决策树,
解决方法是考虑决策树的复杂度,对已经生成的树进行简化。
那么怎么来判断是否带来泛化性能的提升那?最简单的就是留出法,即预留一部
分数据作为验证集来进行性能评估。
预剪枝
预剪枝是指在决策树的生成过程中,对每个节点在划分前先进行评估,若当前的
划分不能带来泛化性能的提升,则停止划分,并将当前节点标记为叶节点。
后剪枝
后剪枝是指先从训练集生成一颗完整的决策树,然后自底向上对非叶节点进行考
察,若将该节点对应的子树替换为叶节点,能带来泛化性能的提升,则将该子树
替换为叶节点。
连续值处理
采用二分法对连续属性进行处理。
需注意的是,与离散属性不同,若当前节点划分属性为连续属性,该属性还可作
为其后代节点的划分属性(例如:在父节点上使用了“密度≤0.381”,不会禁止在
子节点上使用“密度≤0.294”)。
二、实验步骤
1. 数据集处理
按照 9:1 比例分割训练集和测试集,采用随机采样方式。具体代码如下:
def split_dataset(data: pd.DataFrame):
"""
分割训练集和测试集
:param data: iris dataset
:return: trainSet, testSet
"""
#
随机采样
test_index = random.sample(range(150), 15)
print("
测试集索引包括:
")
print(test_index)
testSet = data.iloc[test_index]
train_index = list(range(150))
for index in test_index:
train_index.remove(index)
trainSet = data.iloc[train_index]
return trainSet, testSet
2. 计算信息熵
根据信息熵的计算公式,计算样本集合 dataSet 的信息熵。具体代码如下:
def infoEntropy(dataSet):
"""
计算信息熵
:param dataSet:
数据集
:return:
信息熵
"""
sampleNum = len(dataSet) #
样本总数
labelCounts = {} #
标签字典
for labelName in dataSet:
currentLabel = labelName[-1] #
提取标签信息
if currentLabel not in labelCounts.keys(): #
如果标签没有放入统计次数的字典,添加进去
labelCounts[currentLabel] = 0
labelCounts[currentLabel] += 1 # label
计数
infoEnt = 0.0 #
信息熵
for key in labelCounts:
p = float(labelCounts[key]) / sampleNum #
计算概率
infoEnt -= p * log(p, 2)
return infoEnt #
返回信息熵
3. 计算信息增益
因为鸢尾花数据集的属性都是连续属性,所以要用连续属性离散化技术,这里我
使用的是二分法处理连续属性。
(1)二分法处理连续属性
要先对当前属性下的各个值去重后排序,再求相邻两个值的中间值,作为候选划
剩余11页未读,继续阅读
资源评论
JaneZ0206
- 粉丝: 7
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功