已解决
机器学习之决策树
来自网友在路上 167867提问 提问时间:2023-11-07 16:09:03阅读次数: 67
最佳答案 问答题库678位专家为你答疑解惑
决策树:
是一种有监督学习方法,从一系列有特征和标签的数据中总结出决策规则,并采用树状图的结构来呈现规则,用来解决分类和回归问题。
节点:根节点:没有进边,有出边。包含最初的,针对特征的提问中间节点:既有进边也有出边,进边只有一条,出边可以有很多条。都是针对特征的提问。叶子节点:有进边,没有出边,每个叶子节点都是一个类别标签子节点与父节点:在两个相连的节点中,更接近根节点的是父节点,应一个是子节点。
决策树解决的问题:
1、如何从数据中找出最佳节点或者最佳分支?
2、如何让决策树停止生长,防止过拟合?决策树是基于训练集数据构建出来的,如果树长的越大分支越细致,则对训练数据的描述越清楚,但是不一定会很好的用于测试数据中
构建决策树:
根据数据构建很多决策树,再通过贪心算法实现局部最优来达到全局最优结果的算法。
不纯度:某一类标签占有的比例比较大,则说明改标签纯,否则就是不纯,样本呢越纯分配错误的几率越低
用信息熵计算不纯度。
如何用信息熵计算不纯度?先了解下什么叫做信息熵当我们需要判断64组小组比赛的冠军时,我们可以单个单个的猜,最多需要64次才能猜中,但是我们把数据分开,分为1-32和33-64,决断出哪一份会赢,然后再进行拆分,重复六次,最终确定赢得小组,这种代价被称为6比特,信息量得值会随着更多有用信息得出现而降低计算公式:即H(A)=\sum_ip(i)log\frac{1}{p(i)}。信息熵越大,猜对的概率越小,不确定越大,猜对的代价越大信息熵越小,猜对的概率越大,不确定越小,猜对的代价越小
如何衡量决策树里节点(特征)重要性?如何理解特征的重要性?重要性:如果一个节点减少分类的不确定性越明显,则该节点就越重要。使用信息增益衡量特征的重要性
信息增益:在根据某个他则会那个划分数据集之前滞后信息熵发生的变化或者差异叫做信息增益,知道如何计算信息增哟,获得计算增益最高的特征就是最好的选择信息增益作为决策树的划分依据
决策树需要用到的api是:from sklearn.tree import DecisionTreeClassifier 用来分类from sklearn.tree import DecisionTreeRegressor 用来回归
需要用到的对象以及参数:tree = DecisionTreeClassifier(criterion='entropy',random_state=2023)建立对象需要对里面的参数进行设置criterion,设置为'entropy'表示信息熵,默认是基尼系数,random_state自行设置,如果设置完,后面的准确率就不会发生变化,在特征维度比较多时,建议使用,splitter给定best表示决策树在分支时虽然随机,还是会优先选择更重要的特征进行分支,而random,在分支时会更加随机,会防止过拟合,剪枝参数:max_depth:限制树的最大深度,超过深度的数值全部剪掉,建议从3开始尝试min_samples_leaf和min_samples_splite,前者表示该节点后面的节点必须要多于或者等于min_samples_leaf的样本数,否则,不会延续到下一分支,而后者表示,当一个节点内的样本数必须大于或者等于min_samples_splite数才可以分支,否则不能分支
使用决策树
import sklearn.datasets as dataset
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import DecisionTreeRegressor
data = dataset.load_wine()
print(data.keys())
tree = DecisionTreeClassifier(criterion='entropy',splitter='best')
feature = data['data']
target = data['target']
print(feature.shape, target.shape)
x_train, x_test, y_train, y_test = train_test_split(feature, target,train_size=0.8, random_state=2023)
tree.fit(x_train,y_train)
score = tree.score(x_test,y_test)
print(score)
结果:
dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names'])
(178, 13) (178,)
0.7777777777777778
再次运行:
dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names'])
(178, 13) (178,)
0.8888888888888888Process finished with exit code 0
我们会发现两次的运行结果不一样。
每次测评分数不一致的原因:
决策树在构建树时,是靠及优化节点来追求一颗最优化的树,每次分支时,用的时一部分特征,选出不纯度相关指标最优作为分支用的节点,每次生成的树都不一样。
画出决策树:
在anaconda的navigator种open terminal中执行:conda install graphvizpip install graphviz重启终端服务即可使用model.feature_importances_就会 展现每一个维度特征的重要性,model代表你创建的tree模型的名字
在程序中加入
feature_name = ['酒精','苹果酸','灰','灰的碱性','镁','总酚','类黄酮','非黄烷类酚类','花青色','颜色强度','色调','od280/od315稀释葡萄酒','脯氨酸']
print(*zip(feature_name,tree1.feature_importances_))
就会输出,每个变量的重要性
('酒精', 0.0) ('苹果酸', 0.0) ('灰', 0.0) ('灰的碱性', 0.0) ('镁', 0.0) ('总酚', 0.02365073516699979) ('类黄酮', 0.0) ('非黄烷类酚类', 0.04131580954362543) ('花青色', 0.0) ('颜色强度', 0.0) ('色调', 0.029152437929677186) ('od280/od315稀释葡萄酒', 0.45064598674757594) ('脯氨酸', 0.4552350306121216)
其中zip就是将名字和变量做一个对应关系
查看全文
99%的人还看了
相似问题
- 〖大前端 - 基础入门三大核心之JS篇㊲〗- DOM改变元素节点的css样式、HTML属性
- Java 算法篇-链表的经典算法:判断回文链表、判断环链表与寻找环入口节点(“龟兔赛跑“算法实现)
- 代码随想录二刷 | 链表 | 删除链表的倒数第N个节点
- 节点导纳矩阵
- bhosts 显示节点 “unreach“ 状态
- 电子电器架构 —— 车载网关边缘节点总线转换
- 〖大前端 - 基础入门三大核心之JS篇㊳〗- DOM访问元素节点
- 第四天||24. 两两交换链表中的节点 ● 19.删除链表的倒数第N个节点 ● 面试题 02.07. 链表相交 ● 142.环形链表II
- CS224W5.1——消息传递和节点分类
- Vue报错解决Error in v-on handler: “Error: 无效的节点选择器:#div1“
猜你感兴趣
版权申明
本文"机器学习之决策树":http://eshow365.cn/6-34589-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!
- 上一篇: 广域网加速的作用:企业为什么需要广域网加速?
- 下一篇: 概率论和数理统计(一)概率的基本概念