ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

使用决策树算法进行鸢尾花数据分类

2021-12-06 12:32:15  阅读:250  来源: 互联网

标签:max 算法 准确率 depth train test 鸢尾花 集上 决策树


使用决策树算法进行鸢尾花数据分类(学习笔记)

决策树算法介绍

  • 构建树的过程

    1. 从根节点开始,计算所有特征值的信息增益(信息增益比、基尼系数),选择计算结果最大的特征作为根节点。(信息熵增益->ID3,信息熵增益率->C4.5,基尼系数->CART)
    2. 根据算出的特征建立子节点,执行第一步,直到所有特征的信息增益(信息增益比)很小或没有特征可以选择为止。
  • 直接按照以上步骤构建树容易产生过拟合的情况(训练出来的模型过于契合训练数据导致无法对测试数据进行分类)。

  • 防止过拟合:减少模型的复杂度,简化决策树-->剪枝

    • 预剪枝,构造树的同时进行剪枝
    • 后剪枝,决策树构建完成后再进行剪枝
  • 在sklearn中决策树算法的重要参数

    • max_depth:树的最大深度(分割点的个数),最常用的用于减少模型复杂度防止过拟合的参数
    • min_sample_leaf:每个叶子拥有的最少的样本个数
    • max_leaf_nodes:树中叶子的最大个数
    • 在实际应用中,通常只需要调整max_depth就已经足够防止决策树模型的过拟合
  • 熵(Entropy):在信息论中,设离散随机变量X的概率分布为$P(X=x_i)=p_i i=1,2,3,...,n$ 则概率分布的熵(Entropy)的定义为
    $$Entropy(p)=-\sum_^n$$

  • 信息增益(Information Gain):描述了当使用Q进行编码时,再使用P进行编码的差异。在决策树算法中,信息增益是针对某个特征而言的,就是看一个特征A,系统有它和没它的时候信息量各是多少,两者的差值就是这个特征给系统带来的信息量,即增益
    $$Gain(S,A)=Entropy(S)-\sum_{v \in Values(A)}{\frac{|S_v|}{|S|}Entropy(S_v)}$$

  • 当熵中的概率由数据估计(特别是最大似然估计)得到时,所对应的熵称为经验熵(empirical entropy)。比如有10个数据,一共有两个类别,A类和B类。其中有7个数据属于A类,则该A类的概率即为十分之七。其中有3个数据属于B类,则该B类的概率即为十分之三。浅显的解释就是,这概率是我们根据数据数出来的。我们定义贷款申请样本数据表中的数据为训练数据集D,则训练数据集D的经验熵为H(D),|D|表示其样本容量,及样本个数。设有K个类Ck, = 1,2,3,…,K,|Ck|为属于类Ck的样本个数,因此经验熵公式就可以写为 :
    $$Entropy(D) = - \sum_^{\frac{|c_k|}{|D|} log_2{\frac{|C_k|}{|D|}}}$$

准备数据以及划分训练集和测试集

加载数据以及调用所需的包
代码:

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
import seaborn as sns
from sklearn.metrics import accuracy_score
iris = load_iris()
print('特征名称:',iris.feature_names)
print('类别:',iris.target_names)

输出结果:

特征名称: ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
类别: ['setosa' 'versicolor' 'virginica']

数据处理
代码:

X = iris.data
y = iris.target
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=1/4,random_state=0)
print('数据集样本数:{},训练样本数:{},测试集样本数:{}'.format(len(X),len(X_train),len(X_test)))

输出结果:

数据集样本数:150,训练样本数:112,测试集样本数:38

建立模型,训练模型,测试模型

建立模型
代码:

dt_model = DecisionTreeClassifier(max_depth=3)

训练模型
代码:

dt_model.fit(X_train,y_train)

测试模型
代码:

y_pred = dt_model.predict(X_test)

acc = accuracy_score(y_test,y_pred)

print('准确率:',acc)

输出结果:

准确率: 0.9736842105263158

我们在建立模型的时候设置的最大深度参数为3,我们看接下来看一看超参数对于模型的影响

我们分别将参数设置为2,3,4来对比一下训练集和测试集上的准确率

代码:

max_depth_values = [2,3,4]

for max_depth_val in max_depth_values:
    dt_model = DecisionTreeClassifier(max_depth=max_depth_val)
    dt_model.fit(X_train,y_train)

    print('max_depth = ',max_depth_val)
    print('训练集上的准确率:{:.3f}'.format(dt_model.score(X_train,y_train)))
    print('测试集上的准确率:{:.3f}'.format(dt_model.score(X_test,y_test)))

得到结果:

max_depth =  2
训练集上的准确率:0.964
测试集上的准确率:0.895
max_depth =  3
训练集上的准确率:0.982
测试集上的准确率:0.974
max_depth =  4
训练集上的准确率:1.000
测试集上的准确率:0.974

由此可见当参数设置为4时在训练集和测试集上的准确率是最高的,那我们也可以再试着将参数加大看一看会有什么变化

标签:max,算法,准确率,depth,train,test,鸢尾花,集上,决策树
来源: https://blog.csdn.net/CavalierJHC/article/details/121744221

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有