机器学习---决策树模型

本文介绍了决策树的学习过程,强调了特征选择的重要性,并使用信息熵和基尼系数衡量特征纯度。通过实例展示了如何使用sklearn库构建决策树模型,探讨了设置最大深度对模型精度的影响。实验结果显示,调整最大深度可以优化模型性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

机器学习—决策树模型

1. 通俗解释:

对于一个根据特征向量来对样本进行分类的问题,首先挑出一个最有价值的特征,对该特征进行提问,如样本的颜色是什么?然后根据样本的不同回答,如红色,蓝色等,将数据集划分成子集,对每一个子集重复上面的操作,即在剩下的特征集合中在找一个对最终分类任务最有用的特征,根据特征的不同取值在划分成更小的子集直到最终子集内的样本都属于或者几乎属于同一类。此时认为模型已经训练好(这的模型实际上指的就是这些提问组成的决策规则),保留这些提问(划分子集的依据)。当有新样本预测时,通过进行一级一级的提问,得到最终的类别。

2. 任务类型:

决策树用来处理有监督的分类问题。但是决策树与线性回归,SVM等不同,它处理的数据的特征往往也是类别的变量,而不是连续值。当然,决策树也可以处理连续变量的问题,但其实际上用的是同样的思路,可以理解成对连续变量进行提问,如值是否大于5,根据回答是与否将数据集划分成子集,继续提问,所以一般来说,决策树较为适合处理特征向量中类别变量比较多的任务,以及对模型的可解释性要求较高的任务。

3. 决策树关键问题:

最关键的问题:特征的优选。在遍历所有特征时需要根据以该特征划分得到子集的纯度为这些特征打分,从而选取最优特征。利用数学工具信息熵和基尼系数来度量和表征一个分布的混乱程度

4. 信息增益原则(信息熵和基尼系数):

信息增益原则是用信息量的变化来度量按照某个特征划分后,子集的纯度的增加程度。具体参考该链接

5. 代码实现:

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier, export_graphviz
from sklearn.model_selection import train_test_split
import  graphviz
import os
iris=load_iris()
#得到数据与类别标签
iris_data=iris.data
iris_target=iris.target
#类别标签名称
iris_target_names=iris.target_names
#用来训练的特正名称
iris_feat_names=iris.feature_names
#输出类别的特征名称,以及数据集的简单描述
print(iris_feat_names)
print(iris_target_names)
#对数据集进行划分,将30%的数据作为测试集,其余作为训练集
X_train,X_test,y_train,y_test=train_test_split(iris_data,iris_target,test_size=0.3,random_state=2021)
print('训练集与测试集数量与特征信息',X_train.shape,X_test.shape,y_train.shape,y_test.shape)
#建立决策树模型,采用信息增益原则,在最优值处划分,最大深度不设定
print('信息熵,不设定深度')
clf=DecisionTreeClassifier(criterion='entropy',splitter='best',max_depth=None,random_state=2021)
clf.fit(X_train,y_train)
#计算训练集和测试集精度
train_acc=sum(clf.predict(X_train)==y_train)/len(y_train)
test_acc=sum(clf.predict(X_test)==y_test)/len(y_test)
print('训练集精度:{:.2f}'.format(train_acc))
print('测试集精度:{:.2f}'.format(test_acc))
print('最大深度设为3')
clf1=DecisionTreeClassifier(criterion='entropy',splitter='best',max_depth=3,random_state=2021)
clf1.fit(X_train,y_train)
train_acc=sum(clf1.predict(X_train)==y_train)/len(y_train)
test_acc=sum(clf1.predict(X_test)==y_test)/len(y_test)
print('训练集精度:{:.2f}'.format(train_acc))
print('测试集精度:{:.2f}'.format(test_acc))
print('基尼系数')
clf2=DecisionTreeClassifier(criterion='gini',splitter='best',max_depth=None,random_state=2021)
clf2.fit(X_train,y_train)
train_acc=sum(clf2.predict(X_train)==y_train)/len(y_train)
test_acc=sum(clf2.predict(X_test)==y_test)/len(y_test)
print('训练集精度:{:.2f}'.format(train_acc))
print('测试集精度:{:.2f}'.format(test_acc))
# dot_data=export_graphviz(clf,feature_names=iris_feat_names,out_file=None)
# dot=graphviz.Source(dot_data)
# dot.view()

6. 实验结果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值