基于决策树和随机森林的鸢尾花种类预测

server/2025/3/4 3:43:10/
  1. sklearn中与决策树分类有关的函数是DecisionTreeClassifier函数,本次实验主要使用DecisionTreeClassifier,集成学习由RandomForestRegressor函数指定若干棵决策树。使用这两种函数默认参数。

  1. 指定决策树算法。使用criterion="entropy"(信息熵)、criterion=”gini”(CART算法),同时修改max_depth的值分选择2和5进行实验。以及使用20棵和50棵决策树随机森林进行实验。

3. 使用标准化后的数据进行模型的训练,比较模型的性能。

4. 画图查看决策树深度和错误率之间的关系,观察是否存在过拟合现象:

5.尝试不同的剪枝参数训练模型,对结果进行比较,画出准确率随深度的变化图:

(剪枝参数:max_depth:限制树的最多分层,适用于高维低量样本,分一层需要的样本就多一倍,一般从3开始试。与这个参数类似的还有:

min_samples_leaf: 一个节点分支后的子节点上至少包含多少的训练样本数量。

min_samples_split :一个节点上至少包含多少训练样本数量。)

6.打印预测值和真实值之间的图像(一张图即可)。

7.使用graphviz进行决策树的可视化(gini和entropy各一张)

  • 结果分析

根据上述实验结果对比不同的函数,不同剪枝方法,不同类型的决策树方法和随机森林的实验结果,可以根据网格搜索得出最佳结果。

使用标准化后的数据进行模型的训练,比较模型的性能,并画图查看决策树深度和错误率之间的关系,观察是否存在过拟合现象。

代码1构建决策树随机森林结果:

代码2使用不同决策方式、深度、森林数量的模型结果如下

代码3标准化后模型结果如下:

代码4查看深度与错误率的关系结果如下:

代码5查看不同剪枝策略对决策树模型结果准确率的影响结果:

代码6查看max_depth剪枝后预测值和真实值的差异结果:

代码7使用graphviz可视化决策树预测过程(分别使用entropy和gini)结果如下:

结果分析

    从代码1的运行结果中我们就可以看到决策树随机森林即使使用默认参数,对鸢尾花数据集的预测结果也很好。

通过调整模型参数,我们可以得到不同的分类结果,具体看到代码2的结果,不管是使用信息增益还是gini指数来评估决策树分类结果,对于鸢尾花数据,决策树深度为5的时候的模型结果都会优于深度为3的时候的准确率。而对于随机森林来说,森林里树木数量为20和50的结果都是100%的预测准确率,可见随机森林的分类效果较优,参数的调整对分类结果的影响不大,甚至可能导致过拟合。

对比代码3运行结果,可以看到标准化后模型的准确率没有明显变化,因为它们是基于特征值而非其缩放来拆分数据,它们可以在没有标准化的情况下良好运行,标准化通常对依赖距离度量的算法更有益,比如 k-最近邻或支持向量机。

通过代码4的运行结果我们可以看到,不管是训练集还是测试集,在depth=2以前该参数对模型准确率的影响都是比较大的,当depth>2时影响变小,而当训练集的决策树深度达到6的时候,模型的准确率就已经来到了100%,当测试集决策树深度达到3时,模型的准确率就已经来到了100%。

通过代码5的运行结果可以看出,min_samples_leaf和min_samples_split两种剪枝策略在当前数据集的决策树模型下作用较大,让模型在depth=1的时候就已经达到了100%的准确率,而调整max_depth参数至3的时候模型才达到100%的准确率。

从代码6运行结果我们可以看出,当max_depth=2的时候,决策树并不能全部预测正确,比如第五个数据他就把类别1的样本预测为类别2了。

通过代码7的运行结果,我们可以很清晰的看出决策树使用entorpy和gini两种方式进行鸢尾花数据分类的决策过程。其中petal_length是该分支的花瓣长度,第二行gini/entropy是决策方法, samples是数据集大小,value是对数据特征属于各个类别的概率数量比例,class表示该节点的预测结果。

提高决策树随机森林模型准确率的可能方法。

1.调整超参数

       比如调整决策树的深度,这里决策树采用depth=5的效果就比depth=2的效果好,同理调整随机森林中树的数量也有助于提高模型性能,超参数的调整可以引入网格搜索来选择模型的最佳值。

2.特征工程

       做好数据提取工作和数据预处理工作,比如缺失值处理、分层采样等。也可以对数据进行标准化归一化把数据变为更适合该算法的数据。使用PCA降维或者随机森林的 feature_importances_ 属性,识别哪些特征对模型的性能影响最大,减少其他权重较小的特征的影响。也可以使用预剪枝和后剪枝策略调整决策树分支,防止过拟合

3.集成学习

调整随机森林参数: 考虑调整随机森林的其他参数,如每棵树的最大深度、每个节点的最小样本拆分数量等,以优化性能。

尝试其他集成模型: 除了随机森林,还可以尝试其他集成学习方法,如梯度提升树(Gradient Boosting)等。

4.损失验证

       使用交叉熵损失函数或者均方误差来评估模型。防止过拟合,并获得对模型泛化能力的更好估计


http://www.ppmy.cn/server/172239.html

相关文章

蓝桥杯 灯笼大乱斗【算法赛】

问题描述 元宵佳节&#xff0c;一场别开生面的灯笼大赛热闹非凡。NN 位技艺精湛的灯笼师依次落座&#xff0c;每位师傅都有相应的资历值&#xff0c;其中第 ii 位师傅的资历值为 AiAi​。从左到右&#xff0c;师傅们的资历值逐级递增&#xff08;即 A1<A2<⋯<ANA1​&l…

谈谈 Node.js 中的模块系统,CommonJS 和 ES Modules 的区别是什么?

Node.js 模块系统&#xff1a;CommonJS 和 ES Modules 核心差异与实战指南 一、模块系统基础概念 **CommonJS (CJS)**​ 是 Node.js 传统模块系统&#xff0c;采用同步加载方式&#xff0c;典型特征&#xff1a; // 导出 module.exports { name: cjs }; // 或 exports.nam…

内网渗透测试-Vulnerable Docker靶场

靶场来源&#xff1a; Vulnerable Docker: 1 ~ VulnHub 描述&#xff1a;Down By The Docker 有没有想过在容器中玩 docker 错误配置、权限提升等&#xff1f; 下载此 VM&#xff0c;拿出您的渗透测试帽并开始使用 我们有 2 种模式&#xff1a; - HARD&#xff1a;这需要您将 d…

SoapUI 结合 Postman 测试 WebService 协议

SoapUI 结合 Postman 测试 WebService 协议 一、WebService 协议概述 WebService 是一种基于标准的 Web 应用程序接口&#xff0c;允许不同系统之间通过网络进行通信和数据交换。常见的 WebService 协议有 SOAP&#xff08;Simple Object Access Protocol&#xff09;&#x…

C++对象特性

#构造函数 和 析构函数 构造函数:主要为对象属性赋值 语法:类名(){} 注意: 1.无返回值也无void 2.函数名称与类名相同 析构函数 语法:~类名(){} 注意: 1.无返回值也无void 2.不可以有参数&#xff0c;不可发生重载 class Person { public://构造函数Person(){cout<<&quo…

C语言入门资料分享源码+PDF速查手册

01 目标&#xff1a;掌握基础语法&#xff0c;能编写简单的程序 源码PDF获取 通过网盘分享的文件&#xff1a;C语言入门到精通.rar 链接: https://pan.baidu.com/s/1lcKj3aywRJUecLmoDeQfFg?pwdxiyx 提取码: xiyx 02 环境搭建 安装编译器&#xff08;推荐GCC/MinGW/M…

Trae智能协作AI编程工具IDE:如何在MacBook Pro下载、安装和配置使用Trae?

Trae智能协作AI编程工具IDE&#xff1a;如何在MacBook Pro下载、安装和配置使用Trae&#xff1f; 一、为什么选择Trae智能协作IDE&#xff1f; 在AI编程新时代&#xff0c;Trae通过以下突破性功能重新定义开发体验&#xff1a; 双向智能增强&#xff1a;AI不仅提供代码补全&a…

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_init_cycle 函数 - 详解(6)

详解&#xff08;6&#xff09; 初始化监听套接字数组&#xff08;listening&#xff09; n old_cycle->listening.nelts ? old_cycle->listening.nelts : 10;if (ngx_array_init(&cycle->listening, pool, n, sizeof(ngx_listening_t))! NGX_OK){ngx_destroy_p…