基于python的随机森林多分类模型

1.随机森林多分类模型

1.1 基本原理

        随机森林(Random Forest)是一种基于决策树的集成学习方法,它通过将多个决策树进行组合,以投票或平均的方式得到最终的预测结果。在多分类问题中,随机森林通过构建多个决策树,每个决策树都对数据进行分类预测,最终通过多数投票的方式确定样本所属的类别。本文将对随机森林多分类模型的原理进行详细介绍,内容将分为数据准备、随机抽样、决策树构建、随机森林构建和模型评估等部分。

1.2 数据准备

        随机森林模型的构建首先需要准备好用于训练和测试的数据集。数据集应包含特征和标签,其中特征是用于预测标签的变量,标签是我们要预测的变量。在多分类问题中,标签通常表示不同的类别。数据集应被分为训练集和测试集,通常是将数据集的70%用于训练,30%用于测试。这样可以确保模型在训练过程中学习到数据的特征,同时在测试集上评估模型的性能。

1.3 随机抽样

        随机森林模型的核心思想之一是随机抽样。在每个决策树的训练过程中,我们随机选择一部分特征和样本进行训练,以减少过拟合的风险。这个过程被称为“随机抽样”。具体来说,随机抽样包括两个方面的随机性:

  1. 样本随机性:从原始数据集中随机选择一定数量的样本(有放回抽样),构建一棵决策树。这样,每棵决策树都是基于不同的样本子集进行训练的,从而增加了树之间的多样性。
  2. 特征随机性:在每个节点上,随机选择一部分特征子集,并基于这些特征进行最优划分。这个过程也被称为“特征袋外”(Feature Bagging)。通过随机选择特征子集,可以减少决策树之间的相关性,提高模型的泛化能力。
1.4 决策树构建

图1-1 决策树构建

        在随机抽样之后,我们可以开始构建决策树。决策树是一种树形结构,其中每个节点代表一个特征,每个叶子节点代表一个类别。在构建决策树时,我们使用训练集中的数据来确定每个节点的最佳特征和最佳分割点。具体过程如下:

  1. 从根节点开始,选择一个特征作为当前节点的分裂特征。分裂特征的选择基于信息增益、基尼指数等准则,这些准则用于衡量特征对分类结果的影响程度。
  2. 根据选定的分裂特征,将训练集划分为两个或多个子集。每个子集对应于分裂特征的一个取值范围或类别。
  3. 对每个子集递归地执行步骤1和步骤2,直到满足停止条件(如树的最大深度、叶子节点中的最小样本数等)。在递归过程中,每个节点都基于其对应的训练子集进行最优划分。
  4. 当满足停止条件时,将当前节点作为叶子节点,并根据该节点对应的训练子集中样本的类别分布情况,确定该叶子节点的类别标签。对于多分类问题,通常选择样本数最多的类别作为叶子节点的类别标签。
1.5 随机森林构建

图1-2 随机森林构建

        随机森林是由多个决策树组成的集成模型。在构建随机森林时,我们需要选择决策树的数量(即森林中树的数量)和每个决策树的最大深度等参数。这些参数的选择通常基于经验或交叉验证等方法来确定。具体来说,随机森林的构建过程如下:

  1. 重复执行随机抽样和决策树构建的过程,构建多棵决策树。每棵决策树都是基于不同的样本子集和特征子集进行训练的,从而保证了树之间的多样性。
  2. 当所有决策树都构建完成后,将它们组合成一个随机森林模型。在预测时,将待预测样本输入到随机森林中,每棵决策树都会给出一个预测结果(即样本所属的类别)。
  3. 最后,通过多数投票的方式确定待预测样本的最终类别。具体来说,对每个类别统计其在所有决策树中的预测次数(即投票数),并选择投票数最多的类别作为最终预测结果。
1.6 模型评估

        为了评估随机森林模型的性能,我们可以使用测试集来计算模型的准确率、精确率、召回率和F1分数等指标。此外,我们还可以使用ROC曲线和AUC值等指标来评估模型的分类效果。如果模型的性能不够好,我们可以调整模型的参数(如决策树的数量、每个决策树的最大深度等)或增加更多的决策树来提高模型的性能。同时,随机森林模型还可以提供特征重要性评估。通过计算每个特征在随机森林中被用来划分节点的次数或平均信息增益等指标,我们可以评估特征对分类结果的重要性程度。这对于特征选择和模型优化非常有用。

        综上,随机森林多分类模型通过构建多个基于随机抽样的决策树,并通过多数投票的方式确定样本所属的类别,从而实现了对多分类问题的有效预测。该模型具有泛化能力强、能够处理高维数据、对噪声和异常值不敏感等优点,在分类问题中得到了广泛应用。通过合理设置模型的参数和进行特征重要性评估,我们可以进一步提高模型的性能和解释性。

2.代码与运行结果

2.1 数据加载与预处理
import pandas as pd  
import numpy as np 
import matplotlib.pyplot as plt 
# 忽略Matplotlib的警告(可选)  
import warnings  
warnings.filterwarnings("ignore")  
  
# 设置Matplotlib的字体属性  
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用于中文显示,你可以更改为其他支持中文的字体  
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号    
# 加载数据  
df = pd.read_excel('污染物浓度数据.xlsx')  
  
# 将“质量等级”一列转换为数字  
mapping = {'优': 1, '良': 2, '轻度污染': 3, '中度污染': 4, '重度污染': 5, '严重污染': 6}  
df['质量等级'] = df['质量等级'].map(mapping).fillna(0)  # 假设没有'严重污染'等级,用0填充非映射值  
  
# 检测并处理缺失值  
# 这里假设NaN表示缺失值  
print(df.isnull().sum())  # 检测缺失值  
  
# 可视化缺失值  
import missingno as msno  
msno.matrix(df)  
  
# 删除包含缺失值的行(这里仅作为示例,实际中可能需要根据业务逻辑处理)  
df = df.dropna()  
  
# 检测重复值  
print(df.duplicated().sum())  
  
# 删除重复的行(如果有的话)  
df = df.drop_duplicates()

        运行结果:

图2-1

2.2 数据分布可视化
plt.figure(figsize=(20, 10))  
for i, feature in enumerate(df.columns, 1):  
    plt.subplot(3, len(df.columns)-7, i)  
    sns.histplot(df[feature], kde=True, bins=30, label=feature,color='black') 
    plt.title(f'{feature}的数据分布', fontsize=20, color='y')  
    # 如果需要设置坐标轴标签的字体大小和颜色  
    plt.xlabel('X-axis Label', fontsize=15, color='blue')  # 设置x轴标签的字体大小和颜色  
    plt.ylabel('Y-axis Label', fontsize=20, color='green')  # 设置y轴标签的字体大小和颜色  
  
    # 还可以调整刻度线的长度、宽度等属性  
    plt.tick_params(axis='x', labelsize=20, colors='red', length=5, width=1)  # 设置x轴刻度线、刻度标签的更多属性  
    plt.tick_params(axis='y', labelsize=20, colors='deepskyblue', length=5, width=1)  # 设置y轴刻度线、刻度标签的更多属性 
plt.tight_layout()  
plt.show()

        运行结果:

图2-2

2.3随机森林多分类模型建立与训练

2.3.1模型建立与训练

from sklearn.model_selection import train_test_split  
from sklearn.linear_model import LinearRegression  
from sklearn.metrics import mean_squared_error 
from sklearn.ensemble import RandomForestClassifier  
from sklearn.metrics import classification_report, confusion_matrix  
  
# 准备数据  
X = df[['年','月','日','PM10', 'O3', 'SO2', 'PM2.5', 'NO2', 'CO', 'AQI']]  
y = df['质量等级']  
  
# 划分训练集和测试集  
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)  
  
# 拟合分类模型  
clf = RandomForestClassifier(n_estimators=100, random_state=42)  
clf.fit(X_train, y_train)  
  
# 预测  
y_pred = clf.predict(X_test)  
  
# 评估模型  
print(classification_report(y_test, y_pred))  
# 打印混淆矩阵  
cm = confusion_matrix(y_test, y_pred)  
print("Confusion Matrix:")  
print(cm)  

        运行结果:

     图2-3

         由图2-3中模型评估报告可以看出准确率达到100%。

2.3.2 预测结果可视化


plt.figure(figsize=(7, 6))  
sns.heatmap(df_cm, annot=True, fmt='d', cmap='Blues')  
plt.xlabel('Predicted')  
plt.ylabel('True')  
plt.show()

        运行结果:

图2-4

        从图2-4的混淆矩阵也可以看出准确率达到100%。

plt.figure(figsize=(6,3))  
  
plt.subplot(1, 2, 1)  
sns.histplot(y_test, kde=True,color='blue', label='Truth')  
plt.title('Distribution of Truth')  
plt.xlabel('Quality Level')  
plt.ylabel('Count')  
  
plt.subplot(1, 2, 2)  
sns.histplot(y_pred, kde=True,  color='orange', label='Prediction')  
plt.title('Distribution of Prediction')  
plt.xlabel('Quality Level')  
plt.ylabel('Count')  
  
plt.tight_layout()  
plt.show()

        运行结果:

图2-5

2.3 分类预测
import pandas as pd  
from sklearn.ensemble import RandomForestClassifier  
from sklearn.metrics import classification_report, confusion_matrix  
import matplotlib.pyplot as plt  
import seaborn as sns  
# 加载test.xls数据  
test_df = pd.read_excel('test.xls')  
  
# 预处理测试数据以匹配训练数据   
X_test_actual = test_df[['年','月','日','PM10', 'O3', 'SO2', 'PM2.5', 'NO2', 'CO', 'AQI']]  
  
# 使用模型进行预测  
y_test_pred = clf.predict(X_test_actual)  
print(y_test_pred)
sns.histplot(y_test_pred, kde=True,  color='black', label='Prediction')  
plt.title('Distribution of Prediction')  
plt.xlabel('Quality Level')  
plt.ylabel('Count')  
  
plt.tight_layout()  
plt.show()

        运行结果:

图2-6

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/744229.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Gartner发布开发敏捷网络安全计划指南:安全计划是一个在快速变化的环境中运作的复杂生态系统

随着企业数字化程度的提高,它们面临的网络安全风险和威胁只会增加。这项研究有助于高管领导了解敏捷网络安全计划的重要性,以及如何与安全和风险利益相关者合作,为下一次重大破坏做好准备。 主要发现 新冠肺炎疫情、地区冲突、全球政治紧张局…

cropperjs 裁剪/框选图片

1.效果 2.使用组件 <!-- 父级 --><Cropper ref"cropperRef" :imgUrl"url" searchImg"searchImg"></Cropper>3.封装组件 <template><el-dialog :title"title" :visible.sync"dialogVisible" wi…

游戏服务器研究二:大世界的 scale 问题

这是一个非常陈旧的话题了&#xff0c;没什么新鲜的&#xff0c;但本人对 scale 比较感兴趣&#xff0c;所以研究得比较多。 本文不会探讨 MMO 类的网游提升单服承载人数有没有意义&#xff0c;只单纯讨论技术上如何实现。 像 moba、fps、棋牌、体育竞技等 “开房间类型的游戏…

前端:HTML、CSS、JavaScript 代码注释 / 注释与代码规范

一、HTML 行内注释 HTML注释是在HTML代码中添加说明和解释的一种方法&#xff0c;这些注释不会被浏览器渲染或显示在页面上&#xff0c;而是被浏览器忽略。HTML注释对于代码的可读性、可维护性和团队协作非常重要。 1.1、HTML注释的语法 HTML注释的语法是以<!--开始&…

中小学劳技课程开展创意木工 传承非遗木工魅力

学生劳技课程&#xff0c;全称劳动技术课程&#xff0c;是一门旨在通过实践活动培养学生的劳动技能、创新思维、实践能力和社会责任感的基础教育课程。这门课程强调学生的参与和体验&#xff0c;让学生在动手实践中学习并掌握知识&#xff0c;提高解决问题的能力。 学生劳技课程…

大模型应用研发基础环境配置(Miniconda、Python、Jupyter Lab、Ollama等)

老牛同学之前使用的MacBook Pro电脑配置有点旧&#xff08;2015 年生产&#xff09;&#xff0c;跑大模型感觉有点吃力&#xff0c;操作起来有点卡顿&#xff0c;因此不得已捡起了尘封了快两年的MateBook Pro电脑&#xff08;老牛同学其实不太喜欢用 Windows 电脑做研发工作&am…

解码数智升级良方:中国一拖、中原传媒、神火股份等企业数字化实践分析

大模型、AI等技术的成熟以及政策法规的细化&#xff0c;数据资源的权属论证、合规确权、资产论证等环节逐渐走向实用性、价值化。 而伴随着“业财税数融”综合性数字化成为企业数字化转型的主流选择&#xff0c;财务部门的纽带属性被放大&#xff0c;财务数据的融合能力成为企业…

ABC234G Divide a Sequence 题解

题目来源 ABC234G 洛谷 Description 给定长度为 n n n 的序列 { a n } \{a_n\} {an​}。定义一种将 { a n } \{a_n\} {an​} 划分为若干段的方案的价值为每段的最大值减去最小值的差的乘积。求所有划分方案的价值的总和并对 998244353 998244353 998244353 取模。 1 ≤…

Vue3 使用 Vue Router 时,params 传参失效

前言&#xff1a; 在写项目的时候&#xff0c;使用了 vue-router 的 params 进行传参&#xff0c;但是在详情页面中一直获取不到参数。原因&#xff1a;Vue Router 在2022-8-22的那次更新后&#xff0c;使用这种方式在新页面上无法获取&#xff01; 正文&#xff1a; 在列表页进…

从零开始做题:老照片中的密码

老照片中的密码 1.题目 1.1 给出图片如下 1.2 给出如下提示 这张老照片中的人使用的是莫尔斯电报机&#xff0c;莫尔斯电报机分为莫尔斯人工电报机和莫尔斯自动电报机&#xff08;简称莫尔斯快机&#xff09;。莫尔斯人工电报机是一种最简单的电报机&#xff0c;由三个部分组…

【笔记】从零开始做一个精灵龙女-拆uv阶段

目录 先回顾一下拆uv的基础流程吧 肩部盔甲分UV示例 手环UV部分 腰带UV部分 其它也差不多&#xff0c;需要删掉一半的就先提前删掉一半&#xff0c;然后把不需要的被遮挡的面也删掉 龙角UV 胸甲UV 侧边碎发UV 马尾UV 脸部/耳朵UV 特殊情况&#xff1a;如果要删一半再…

kafka的命令行操作

kafka-topics.bat 该命令行和主题相关 kafka启动后&#xff0c;默认端口为9092,可修改 找到kafka_2.13-3.6.2\bin\windows目录下的kafka-topics.bat&#xff0c;用cmd执行 按下会有提示&#xff0c;REQURIED代表为必输项 创建topic 创建一个名为test的topic队列 kafka-t…

绘制图形

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在前3节的实例中&#xff0c;我们一直绘制的都是直线&#xff0c;实际上&#xff0c;海龟绘图还可以绘制其他形状的图形&#xff0c;如圆形、多边形等…

FineReport聚合报表与操作

一、报表类型 模板设计是 FineReport 学习过程中的主要难题所在&#xff0c;FineReport 模板设计主要包括普通报表、聚合报表、决策报表三种设计类型。 报表类型简介- FineReport帮助文档 - 全面的报表使用教程和学习资料 二、聚合报表 2-1 介绍 聚合报表指一个报表中包含多个…

STM32的SPI通信

1 SPI协议简介 SPI&#xff08;Serial Peripheral Interface&#xff09;协议是由摩托罗拉公司提出的通信协议&#xff0c;即串行外围设备接口&#xff0c;是一种高速全双工的通信总线。它被广泛地使用在ADC、LCD等设备与MCU间&#xff0c;使用于对通信速率要求较高的场合。 …

扩散模型 GLIDE:35 亿参数的情况下优于 120 亿参数的 DALL-E 模型

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学。 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 合集&#x…

LeetCode 算法:二叉树的层序遍历 c++

原题链接&#x1f517;&#xff1a;二叉树的层序遍历 难度&#xff1a;中等⭐️⭐️ 题目 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;roo…

TensorFlow开源项目

欢迎来到 Papicatch的博客 文章目录 &#x1f349;TensorFlow介绍 &#x1f349;主要特点和功能 &#x1f348;多语言支持 &#x1f348;灵活的架构 &#x1f348;分布式训练 &#x1f348;跨平台部署 &#x1f348;强大的工具链 &#x1f348;丰富的社区和生态系统 &a…

人工智能与物联网:融合创新驱动未来

引言 人工智能&#xff08;AI&#xff09;指的是计算机系统模拟人类智能的能力&#xff0c;包括学习、推理、问题解决、理解自然语言以及感知和响应环境的能力。AI技术涵盖了机器学习、深度学习、神经网络、自然语言处理等领域&#xff0c;广泛应用于图像识别、语音识别、自动驾…

FPGA学习笔记(5)——硬件调试与使用内置的集成逻辑分析仪(ILA)IP核

如果要对信号进行分析&#xff0c;可以使用外置的逻辑分析仪&#xff0c;但成本较高&#xff0c;对初学者来说没有必要&#xff0c;可以使用Xilinx Vivado内自带的逻辑分析仪IP核对信号进行分析&#xff0c;不过需要占用一定的芯片资源。 本节采用上一节配置的LED灯闪烁代码&a…