机器学习之决策树

决策树:

复制代码
是一种有监督学习方法,从一系列有特征和标签的数据中总结出决策规则,并采用树状图的结构来呈现规则,用来解决分类和回归问题。
节点:
	根节点:没有进边,有出边。包含最初的,针对特征的提问
	中间节点:既有进边也有出边,进边只有一条,出边可以有很多条。都是针对特征的提问。
	叶子节点:有进边,没有出边,每个叶子节点都是一个类别标签
	子节点与父节点:在两个相连的节点中,更接近根节点的是父节点,应一个是子节点。

决策树解决的问题:

复制代码
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数才可以分支,否则不能分支

使用决策树

bash 复制代码
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)	

结果:

bash 复制代码
dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names'])
(178, 13) (178,)
0.7777777777777778

再次运行:

bash 复制代码
dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names'])
(178, 13) (178,)
0.8888888888888888

Process finished with exit code 0

我们会发现两次的运行结果不一样。

每次测评分数不一致的原因:

复制代码
决策树在构建树时,是靠及优化节点来追求一颗最优化的树,每次分支时,用的时一部分特征,选出不纯度相关指标最优作为分支用的节点,每次生成的树都不一样。

画出决策树:

复制代码
在anaconda的navigator种open terminal中执行:
	conda install graphviz
	pip install graphviz
	重启终端服务即可
	使用model.feature_importances_就会 展现每一个维度特征的重要性,model代表你创建的tree模型的名字

在程序中加入

bash 复制代码
feature_name = ['酒精','苹果酸','灰','灰的碱性','镁','总酚','类黄酮','非黄烷类酚类','花青色','颜色强度','色调','od280/od315稀释葡萄酒','脯氨酸']
print(*zip(feature_name,tree1.feature_importances_))

就会输出,每个变量的重要性

bash 复制代码
('酒精', 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就是将名字和变量做一个对应关系

相关推荐
虾壳云官方几秒前
openclaw 一键安装教程(2026年6月15最新)
运维·人工智能·windows·自动化·openclaw
不爱土豆唯爱马铃薯1 分钟前
AiPy 是什么?
人工智能
deephub2 分钟前
Flash-KMeans:快速且内存高效的精确 K-Means,可在单张 GPU 进行亿级数据的聚类
人工智能·机器学习·kmeans·聚类·rag
渡众机器人4 分钟前
第八届全球校园人工智能算法精英大赛-算法应用赛-空地协同侦排挑战赛规则
人工智能·算法
前端不太难5 分钟前
从 ChatBot 到 Agent:AI 应用的范式升级
人工智能
渡众机器人5 分钟前
智能体对抗挑战赛和空地协同侦排挑战赛的报名流程
人工智能·自动驾驶·无人机·智能体·报名流程
yongyoudayee7 分钟前
跳出“AI套壳“陷阱,销售易定义中国AI CRM新标杆
人工智能·paas
lisw0512 分钟前
【计算机科学技术】路由器(route):概念、历史、内容与战略!
机器学习·智能路由器·软件工程
小马哥crazymxm13 分钟前
Arxiv论文周选 (2026-W24)
论文阅读·人工智能·考研
Rain50913 分钟前
2.2 数据基础:数据库集成与 ORM(TypeORM / Prisma)
数据库·人工智能·ai·数据分析·node.js·自动化·ai编程