基于随机森林的鲍鱼年龄预测

2024-06-15 04:04

本文主要是介绍基于随机森林的鲍鱼年龄预测,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1.作者介绍
  • 2.关于理论方面的知识介绍
    • 2.1 背景介绍
      • 2.1.1基本概念
      • 2.1.2算法步骤
      • 2.1.3优势
      • 2.1.4劣势
      • 2.1.5应用场景
      • 2.1.6随机森林的重要变体
      • 2.1.7相关理论
    • 2.2随机森林算法架构
      • 2.2.1 数据预处理与采样
      • 2.2.2构建决策树
      • 2.2.3决策树的训练
      • 2.2.4集成模型
      • 2.2.5 模型输出
    • 2.3鲍鱼数据集介绍
  • 3.关于实验过程的介绍,完整实验代码,测试结果
    • 3.1数据集处理
      • 3.1.1安装需要导入的模块:
      • 3.1.2数据集划分
      • 3.1.3训练参数设置
      • 3.1.4运行代码输出结果
    • 3.2问题分析
  • 4. 附录(完整代码)
  • 5.参考文献


1.作者介绍

郝浩,男,西安工程大学电子信息学院,2023级研究生
研究方向:输电线路绝缘子缺陷检测
电子邮件:2606801894@qq.com

孙思伟,男,西安工程大学电子信息学院,2023级研究生
研究方向:机器视觉与人工智能
电子邮件:sunsiwei0109@163.com

2.关于理论方面的知识介绍

2.1 背景介绍

随机森林(Random Forest)是一种集成学习方法,广泛应用于分类和回归任务。它是由Leo Breiman和Adele Cutler在2001年提出的,是基于决策树(Decision Tree)的组合模型。以下是随机森林算法的详细背景介绍:

2.1.1基本概念

随机森林通过构建多个决策树并结合其预测结果来提高模型的整体性能。它属于**Bagging(Bootstrap Aggregating)**方法的范畴。具体而言,随机森林通过以下两个主要步骤来创建多个不同的决策树:
Bootstrap采样:从原始训练集中有放回地随机抽取多个子集。
特征随机选择:在每个决策树的节点分裂时,随机选择一个特征子集进行最佳分裂,而不是使用所有特征。

2.1.2算法步骤

  1. 数据准备:从原始数据集创建多个Bootstrap样本,每个样本的大小与原始数据集相同。
  2. 构建决策树:对每个Bootstrap样本,构建一棵决策树。在构建过程中,节点的分裂仅在一个随机选择的特征子集上进行。
  3. 集成模型:将所有决策树的预测结果进行平均(回归任务)或投票(分类任务)以得到最终预测。

2.1.3优势

减少过拟合:单个决策树容易过拟合训练数据,而随机森林通过集成多个决策树来减少这种风险。
高准确性:由于结合了多个决策树的预测,随机森林通常比单个决策树更准确。
处理高维数据:随机选择特征使得它能有效处理高维数据集。
内置特征重要性评估:随机森林可以提供每个特征的重要性评分,有助于特征选择。

2.1.4劣势

计算开销较大:训练多个决策树和预测时的集成计算会耗费更多的资源。
解释性较差:相比单个决策树,随机森林的模型结构更为复杂,难以解释。

2.1.5应用场景

随机森林在许多领域有广泛的应用,包括但不限于:
金融领域:信用评分、股票市场预测
医疗领域:疾病预测、基因数据分析
市场营销:客户分类、销售预测
计算机视觉:图像分类、对象检测

2.1.6随机森林的重要变体

极端随机树(Extremely Randomized Trees, ExtraTrees):除了随机选择特征,还随机选择分裂点。
随机森林回归(Random Forest Regression):应用于回归任务。

2.1.7相关理论

Bagging:通过自助采样(Bootstrap)生成多个训练集,并对这些训练集分别训练模型,然后综合这些模型的预测结果。
决策树:一种树状结构的模型,利用特征的条件来进行数据分类或回归。
在这里插入图片描述
通过结合多个决策树,随机森林能够提高模型的泛化能力和稳定性,成为机器学习中非常重要且广泛应用的算法之一。

2.2随机森林算法架构

随机森林算法是一种集成学习方法,其架构由多棵独立的决策树组成。以下是随机森林算法的详细架构介绍:

2.2.1 数据预处理与采样

  1. 数据准备
    原始数据集:包含特征(输入变量)和标签(输出变量)。
  2. Bootstrap采样
    从原始数据集中有放回地随机抽取多个子集(Bootstrap样本),每个子集的大小与原始数据集相同。

2.2.2构建决策树

  1. 特征选择
    在每个节点进行分裂时,从全部特征中随机选择一个特征子集(通常是总特征数的平方根)进行最佳分裂。
  2. 构建过程
    对于每个Bootstrap样本,构建一棵决策树。
    在构建过程中,使用特征子集来决定每个节点的分裂。

2.2.3决策树的训练

每棵决策树独立训练,不进行剪枝(Pruning),以确保每棵树的深度最大化,从而捕捉到训练数据中的更多模式。

2.2.4集成模型

  1. 集成预测
    对于分类任务:每棵决策树进行投票预测,最终结果为投票数最多的类别。
    对于回归任务:每棵决策树进行数值预测,最终结果为所有树预测值的平均值。

2.2.5 模型输出

最终模型由多棵决策树组成,集成了所有决策树的预测结果,从而提高整体模型的稳定性和准确性。

2.3鲍鱼数据集介绍

鲍鱼数据集可以从 UC Irvine 数据仓库中获得,其 URL:abalone.data。
此数据集数据以逗号分隔,没有列头。每个列的名字存在另外一个文件中。建立预测模型所需的数据包括性别、长度、直径、高度、整体重量、去壳后重量、脏器重量、壳的重量、环数。最后一列“环数”是十分耗时采获得的,需要锯开壳,然后在显微镜下观察得到。这是一个有监督机器学习方法通常需要的准备工作。基于一个已知答案的数据集构建预测模型,然后用这个预测模型预测不知道答案的数据。
本实验用Sklearn模块RandomForestRegressor类的对鲍鱼数据建立随机森林回归模型,然后用训练完成的模型测试一部分数据。
本示例采用鲍鱼数据集abalone.csv。本数据集有4178行9列。前8列表示特征,最后一列是鲍鱼的环数量,即是标签。部分数据如下表所示:

在这里插入图片描述

数据集应用场景:

鲍鱼数据集常用于以下机器学习任务:
回归分析:预测鲍鱼的年龄(环数)。
分类任务:将鲍鱼按年龄分组进行分类。
特征选择和工程:用于测试特征选择方法和工程技术。
算法评估:作为基准数据集评估机器学习算法的性能。
鲍鱼数据集因其简单且包含多种类型特征,成为机器学习入门和算法研究的理想选择。

3.关于实验过程的介绍,完整实验代码,测试结果

3.1数据集处理

3.1.1安装需要导入的模块:

import pandas as pd
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, r2_score

3.1.2数据集划分

# 分割数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

3.1.3训练参数设置

# 初始化随机森林模型
rf = RandomForestRegressor(random_state=42)# 定义参数网格
param = {"n_estimators": [10, 20, 30, 40], "max_depth": [25, 35, 45]}# 初始化 GridSearchCV,减少折数
gc = GridSearchCV(rf, param_grid=param, cv=3)

3.1.4运行代码输出结果

C:\Software\anaconda3\envs\py310\python.exe D:\JupetyCode\machinelearning\鲍鱼年龄.py 
Best Parameters: {'max_depth': 25, 'n_estimators': 40}
Best Score: 0.5344924150868674
Mean Squared Error: 5.25
R^2 Score: 0.52Actual  Predicted  Actual Age  Predicted Age
866        9     12.075        10.5         13.575
1483       8      9.325         9.5         10.825
599       16     13.825        17.5         15.325
1702       9     10.650        10.5         12.150
670       14     13.075        15.5         14.575进程已结束,退出代码为 0

3.2问题分析

有时在自己找代码的时候,有些代码在加载数据集路径时提示需要csv格式的文件(也就是excel文件)此时我们需要把数据集data文件(word文件)格式转变,并且csv文件需要我们手动添加鲍鱼特征类别,如下图所示,否则代码运行时会识别不到特征类别。本文中直接用data文件即可。

4. 附录(完整代码)

import pandas as pd
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, r2_score# 模拟加载数据
abalone_data_url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/abalone/abalone.data'
abalone_column_names = ['Sex', 'Length', 'Diameter', 'Height', 'Whole weight', 'Shucked weight', 'Viscera weight', 'Shell weight', 'Rings']
abalone = pd.read_csv(abalone_data_url, names=abalone_column_names)# 将 'Sex' 列的分类变量映射为数值变量
abalone["Sex"] = abalone["Sex"].map({"M": 0, "F": 1, "I": 2})# 分离特征和目标
X = abalone.drop("Rings", axis=1)
y = abalone["Rings"]# 分割数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 标准化特征值
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)# 初始化随机森林模型
rf = RandomForestRegressor(random_state=42)# 定义参数网格
param = {"n_estimators": [10, 20, 30, 40], "max_depth": [25, 35, 45]}# 初始化 GridSearchCV,减少折数
gc = GridSearchCV(rf, param_grid=param, cv=3)# 进行网格搜索
gc.fit(X_train, y_train)# 输出最佳参数和最佳得分
print(f"Best Parameters: {gc.best_params_}")
print(f"Best Score: {gc.best_score_}")# 使用最佳模型进行预测
best_model = gc.best_estimator_
y_pred = best_model.predict(X_test)# 评估模型性能
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)print(f"Mean Squared Error: {mse:.2f}")
print(f"R^2 Score: {r2:.2f}")# 查看预测结果和实际结果的对比
comparison = pd.DataFrame({'Actual': y_test, 'Predicted': y_pred})# 计算实际年龄和预测年龄
comparison['Actual Age'] = comparison['Actual'] + 1.5
comparison['Predicted Age'] = comparison['Predicted'] + 1.5# 打印对比结果
print(comparison.head())

5.参考文献

  1. Breiman, L. (2001). Random forests. Machine learning, 45(1), 5-32.
  2. Ho, T. K. (1995). Random decision forests. In Proceedings of the 3rd international conference on document analysis and recognition (Vol. 1, pp. 278-282). IEEE.

这篇关于基于随机森林的鲍鱼年龄预测的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1062379

相关文章

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

使用C#如何创建人名或其他物体随机分组

《使用C#如何创建人名或其他物体随机分组》文章描述了一个随机分配人员到多个团队的代码示例,包括将人员列表随机化并根据组数分配到不同组,最后按组号排序显示结果... 目录C#创建人名或其他物体随机分组此示例使用以下代码将人员分配到组代码首先将lstPeople ListBox总结C#创建人名或其他物体随机分组

AI学习指南深度学习篇-带动量的随机梯度下降法的基本原理

AI学习指南深度学习篇——带动量的随机梯度下降法的基本原理 引言 在深度学习中,优化算法被广泛应用于训练神经网络模型。随机梯度下降法(SGD)是最常用的优化算法之一,但单独使用SGD在收敛速度和稳定性方面存在一些问题。为了应对这些挑战,动量法应运而生。本文将详细介绍动量法的原理,包括动量的概念、指数加权移动平均、参数更新等内容,最后通过实际示例展示动量如何帮助SGD在参数更新过程中平稳地前进。

AI学习指南深度学习篇-带动量的随机梯度下降法简介

AI学习指南深度学习篇 - 带动量的随机梯度下降法简介 引言 在深度学习的广阔领域中,优化算法扮演着至关重要的角色。它们不仅决定了模型训练的效率,还直接影响到模型的最终表现之一。随着神经网络模型的不断深化和复杂化,传统的优化算法在许多领域逐渐暴露出其不足之处。带动量的随机梯度下降法(Momentum SGD)应运而生,并被广泛应用于各类深度学习模型中。 在本篇文章中,我们将深入探讨带动量的随

Tensorflow lstm实现的小说撰写预测

最近,在研究深度学习方面的知识,结合Tensorflow,完成了基于lstm的小说预测程序demo。 lstm是改进的RNN,具有长期记忆功能,相对于RNN,增加了多个门来控制输入与输出。原理方面的知识网上很多,在此,我只是将我短暂学习的tensorflow写一个预测小说的demo,如果有错误,还望大家指出。 1、将小说进行分词,去除空格,建立词汇表与id的字典,生成初始输入模型的x与y d

临床基础两手抓!这个12+神经网络模型太贪了,免疫治疗预测、通路重要性、基因重要性、通路交互作用性全部拿下!

生信碱移 IRnet介绍 用于预测病人免疫治疗反应类型的生物过程嵌入神经网络,提供通路、通路交互、基因重要性的多重可解释性评估。 临床实践中常常遇到许多复杂的问题,常见的两种是: 二分类或多分类:预测患者对治疗有无耐受(二分类)、判断患者的疾病分级(多分类); 连续数值的预测:预测癌症病人的风险、预测患者的白细胞数值水平; 尽管传统的机器学习提供了高效的建模预测与初步的特征重

HDD 顺序和随机文件拷贝和存储优化策略

对于机械硬盘(HDD),顺序拷贝和随机拷贝涉及到磁头的移动方式和数据的读取/写入模式。理解这些概念对于优化硬盘性能和管理文件操作非常重要。 1. 顺序拷贝 定义: 顺序拷贝指的是数据从硬盘的一个位置到另一个位置按顺序连续读取和写入。这意味着数据在硬盘上的位置是线性的,没有跳跃或回溯。 特点: 磁头移动最小化:由于数据是连续的,磁头在读取或写入数据时只需要在磁盘的一个方向上移动,减少了寻道时

结合Python与GUI实现比赛预测与游戏数据分析

在现代软件开发中,用户界面设计和数据处理紧密结合,以提升用户体验和功能性。本篇博客将基于Python代码和相关数据分析进行讨论,尤其是如何通过PyQt5等图形界面库实现交互式功能。同时,我们将探讨如何通过嵌入式预测模型为用户提供赛果预测服务。 本文的主要内容包括: 基于PyQt5的图形用户界面设计。结合数据进行比赛预测。文件处理和数据分析流程。 1. PyQt5 图形用户界面设计

算法:将数组随机打乱顺序,生成一个新的数组

一、思路 核心:缩小原数组的可随机取数范围 1、创建一个与原数组长度相同的新数组; 2、从原数组的有效的可取数范围 (不断缩小) 中随机取出一个数据,添加进新的数组; 3、将取出的随机数与原数组的最后一个数据进行置换; 4、重复步骤2和3。 二、代码 public class ArrayRandomTest {//将数组随机打乱顺序,生成一个新的数组public static int