- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
周志华《机器学习》课后习题解析(第四章):决策树
作者 | 我是韩⼩琦
4.1 试证明对于不含冲突数据(即特征向量完全相同但标记不同)的训练集,必存在与训练集⼀致(即训练误差为 0) 的决策树。
答:
从原书p74的图4.2的决策树学习的基本算法可以看出,⽣成⼀个叶节点有三种情况:
1、节点下样本 全属于同⼀类样本 ,则将当前节点作为 类叶节点。
2、属性集 ,或者样本在当前属性集上取值相同。即特征⽤完了(当只剩最后⼀个特征时,进⼀步分裂,只能将各取值设⽴叶节点,标记
为样本最多的类别。),或者的样本在 上取值都相同(感觉这⾥貌似和第 ⼀条重复了)。这时取 中最多的类作为此节点的类别标记。
3、在某⼀节点上的属性值 ,样本为空,即没有样本在属性 上取值为 。同样取 中最多的类作为此节点的类别标记。
在这道题中,⽬标是找出和训练集⼀致的决策树,所以不必考虑第3点,从1、2情况来看出决策树中树枝停⽌“⽣长”⽣成叶节点只会在样
本属于同⼀类或者所有特征值都⽤完的时候,那么可能导致叶节点标记与实际训练集不同时只会发⽣在特征值都⽤完的情况(同⼀节点中的
样本,其路径上的特征值都是完全相同的),⽽由于训练集中没有冲突数据,那每个节点上训练误差都为0。
4.2 试析使⽤最⼩训练误差作为决策树划分选择准则的缺陷。
答:
这道题暂时没想出答案。在⽹上找了其他的答案,都是认为会造成过拟合,没给出具体证明。⽽我的理解决策树本⾝就是容易过拟合的,就
算使⽤信息增益或者基尼指数等,依旧容易过拟合,⾄于使⽤ “最⼩训练误差”会不会“更容易”过拟合暂时没理解明 ⽩。
待填坑。
4.3 试编程实现基于信息熵进⾏划分选择的决策树算法,并为表 4.3 中数据⽣成⼀棵决策树。
答:
因为数据集的原因,数据量⽐较⼩,在选择划分属性的时候会出现特征的信息增益或者信息增益率相同的情况。所有⽣成的决策树和书中可
能不⼀致。并且在⽣成叶节点时,会出现两类数量⼀直的情况,这时候叶节点就随机设置⼀个分类了。
代码实现了以信息增益、增益率、基尼指数划分准则。下⾯⼀道题(4.4)也是⽤相同的代码。另外画图的代码是主要参考 《机器学习实
战》决策树那⼀章画图源码。
有些地⽅代码有点乱,⽐如进⾏剪枝的部分就有⼤量重复代码;并且预剪枝部分可以在⽣成决策树的时候实现,减少计算量。以后有机会再
优化⼀下。
代码在:
pruning.py
import pandas as pd
import numpy as np
def post_pruning(X_train, y_train, X_val, y_val, tree_=None):
if tree_.is_leaf:
return tree_
if X_val.empty: # 验证集为空集时,不再剪枝
return tree_
most_common_in_train = pd.value_counts(y_train).index[0]
current_accuracy = np.mean(y_val == most_common_in_train) # 当前节点下验证集样本准确率
if tree_.is_continuous:
if tree_.is_continuous:
up_part_train = X_train.loc[:, tree_.feature_name] = tree_.split_value
down_part_train = X_train.loc[:, tree_.feature_name] tree_.split_value
up_part_val = X_val.loc[:, tree_.feature_name] = tree_.split_value
down_part_val = X_val.loc[:, tree_.feature_name] tree_.split_value
up_subtree = post_pruning(X_train[up_part_train], y_train[up_part_train], X_val[up_part_val],
y_val[up_part_val],
tree_.subtree[= {:.3f}.format(tree_.split_value)])
原创力文档


文档评论(0)