使用决策树的方法对鸢尾花卉Iris数据集进行分类

决策树

决策树是一种常用的监督学习算法,用于分类和回归任务。它通过树形结构来表示决策过程,其中每个内部节点表示一个特征属性上的判断条件,每个分支代表某个特征属性在某个值域上的输出,而每个叶节点则代表一个类别标签(对于分类树)或具体的数值(对于回归树)。

实验代码

1、导入相关库

import pandas as pd
import numpy as np
from sklearn import tree
from sklearn.metrics import accuracy_score
import matplotlib as mpl
from matplotlib import pyplot as plt

2、显示部分数据集信息

data = pd.read_csv('./iris_data.csv')
data.head()
print(data.head())
X = data.drop(['target', 'label'], axis=1)
y = data.loc[:, 'label']
print(X.shape, y.shape)

 

3、构建决策树模型

在可以评测哪个数据划分方式是最好的数据划分之前,集合信息的度量方式称为香农熵或者简称为熵(entropy),常见的计算信息熵有3种,ID3,C4.5,CART。
而大多数情况都是用ID3算法,它的核心是在决策树各个结点上对应信息增益准则选择特征,递归地构建决策树。具体方法是:从根结点(root node)开始,对结点计算所有可能的特征的信息增益,选择信息增益最大的特征作为结点的特征,由该特征的不同取值建立子节点;再对子结点递归地调用以上方法,构建决策树;直到所有特征的信息增益均很小或没有特征可以选择为止。最后得到一个决策树。ID3相当于用极大似然法进行概率模型的选择。
本文criterion='entropy’也就是采用ID3。
min_samples_leaf:叶子节点最少样本数,可选参数,默认是1。这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。叶结点需要最少的样本数,也就是最后到叶结点,需要多少个样本才能算一个叶结点。如果设置为1,哪怕这个类别只有1个样本,决策树也会构建出来。如果min_samples_leaf是整数,那么min_samples_leaf作为最小的样本数。如果是浮点数,那么min_samples_leaf就是一个百分比,同上,celi(min_samples_leaf * n_samples),数是向上取整的。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。
这里我们先选择5试试。

导入评判正确率的函数,预测和真实值进行比较得出正确率97%,还是很不错的。

dc_tree = tree.DecisionTreeClassifier(criterion='entropy', min_samples_leaf=5)
dc_tree.fit(X, y)
y_predict = dc_tree.predict(X)
accuracy = accuracy_score(y, y_predict)
print(accuracy)

4、可视化

为了易于理解和解释。决策树可以可视化。
feature_names=[‘花萼长’, ‘花萼宽’, ‘花瓣长’, ‘花瓣宽’],这就是一些特征。
class_names=[‘山鸢尾’, ‘变色鸢尾’, ‘维吉尼亚鸢尾’],这些是标签。

font2 = {'family' : 'SimHei',
'weight' : 'normal',
'size'   : 20,
}
mpl.rcParams['font.family'] = 'SimHei'
mpl.rcParams['axes.unicode_minus'] = False
fig = plt.figure(figsize=(20, 20))
tree.plot_tree(dc_tree, filled=True,
               feature_names=['花萼长', '花萼宽', '花瓣长', '花瓣宽'],
               class_names=['山鸢尾', '变色鸢尾', '维吉尼亚鸢尾'])
plt.savefig('./1.png', bbox_inches='tight', pad_inches=0.0)
plt.show()

这是前文设置min_samples_leaf=5时候的决策树结构。
实际上min_samples_leaf有点的控制树的深度的意思,但是不是简单的值为多少深度就是多少。它是通过样本数来控制深度。如果再分下去的某个分支样本数小于5那么它就不会再分了。
如果想要直接控制深度的话,这里还有个参数是max_depth,这个参数值是多少那么决策树的深度就是多少了。
可以清晰看到决策树是怎么分类的。和前文博主构想的一样,鸢尾花数据集里面有一种花的特征与其余两种有很大区别,直接可以分类出。那这里就是如果花瓣宽小于等于0.8,那么就是山鸢尾花,而且注意到分类出来的山鸢尾花sample为50,说明根据这个特征分类出来山鸢尾花直接全部分类正确。其余的就再进行其他特征的判断,一层一层特征判断。

为了给读者展示min_samples_leaf如何控制决策树,博主这里令值为10再进行可视化看看。

dc_tree = tree.DecisionTreeClassifier(criterion='entropy', min_samples_leaf=10)
dc_tree.fit(X, y)
fig1 = plt.figure(figsize=(8, 8))
tree.plot_tree(dc_tree, filled='True',
               feature_names=['花萼长', '花萼宽', '花瓣长', '花瓣宽'],
               class_names=['山鸢尾', '变色鸢尾', '维吉尼亚鸢尾'])
plt.savefig('./2.png', bbox_inches='tight', pad_inches=0.0)
plt.show()

可以看到最后的sample样本数都是大于等于10的,它不会继续往下分,深度才5。而上面min_samples_leaf=5时候最后的sample是大于等于5的,深度为6。


                        

参考博客:https://blog.csdn.net/ABin_203/article/details/105992098


————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/ABin_203/article/details/105992098

  • 14
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值