数据填充-随机森林填充

news2024/9/17 1:49:53

文章目录

  • 一、简介
    • 2.随机森林的主要特点
  • 二、代码应用
    • 1.数据预处理
    • 2.数据集填充
    • 3.rm_test_fill 函数
  • 三、总结

一、简介

随机森林(Random Forest)是一种集成学习方法,它通过构建多个决策树并将它们的预测结果进行汇总来做出最终的预测。结合了决策树的预测能力和集成学习的优势,以提高预测的准确性和鲁棒性。

2.随机森林的主要特点

  • 集成学习:随机森林通过构建多个决策树(通常称为“树”或“基学习器”)并将它们的预测结果结合起来,从而提高整体模型的预测性能。这通常通过平均(对于回归问题)或多数投票(对于分类问题)来实现。
  • 随机性:随机森林的“随机”体现在两个方面:
  • 数据随机性:在构建每棵树时,通常使用自助采样法(bootstrap sampling)从原始数据集中随机抽取样本。这意味着每棵树都是基于原始数据集的一个随机子集构建的,这有助于减少模型之间的相关性。
  • 特征随机性:在决定树的每个分裂点时,不是考虑所有的特征,而是随机选择一个特征子集,并从中选择最优的分裂特征。这进一步增加了模型的多样性。
  • 决策树的多样性:由于随机性的引入,每棵树都是独一无二的,这使得随机森林中的决策树具有多样性。这种多样性是随机森林能够减少过拟合并提高预测性能的关键。
  • 并行处理:随机森林中的每棵树都可以独立地构建和预测,这使得随机森林非常适合并行计算。在大数据集上,这可以显著减少训练时间。
  • 易于使用和解释:尽管随机森林是一个复杂的集成模型,但它通常很容易在大多数机器学习库中使用,并且其性能可以通过调整少数几个参数来优化。此外,由于它基于决策树,因此可以通过查看单个树的决策路径来部分地解释随机森林的预测。

二、代码应用

随机森林因其良好的性能和易用性而被广泛应用于各种领域,下面让我们了解一下随机森林对数据填充的应用。这段代码的主要目的是使用随机森林回归器来填充训练集和测试集中的缺失值。它定义了两个函数:rm_train_fill 用于填充训练数据,而 rm_test_fill 用于填充测试数据。这两个函数采用了相似的方法来处理缺失值,但分别针对训练集和测试集。

1.数据预处理

from sklearn.ensemble import RandomForestRegressor


def rm_train_fill(train_data, train_label):
    train_data_all = pd.concat([train_data, train_label], axis=1)
    train_data_all = train_data_all.reset_index(drop=True)
    train_data_X = train_data_all.drop('矿物类型', axis=1)
    null_num = train_data_X.isnull().sum()  # 查看每个特征中存在空数据的个数
    null_num_sorted = null_num.sort_values(ascending=True)  # 将空数据的类别从小到大排列

合并数据和标签:首先,将训练数据 train_data 和训练标签 train_label 合并成一个DataFrame train_data_all。并重新划分数据的索引。
准备特征集:从合并后的数据中删除目标列(假设是“矿物类型”),得到特征集 train_data_X。
查找并排序缺失值:计算每个特征的缺失值数量,并按数量从小到大排序,以确定填充顺序。

2.数据集填充

    filling_feature = []  # 用来存储需要传入的特征名称
    for i in null_num_sorted.index:
        filling_feature.append(i)
        if null_num_sorted[i] != 0:  # 当前特征是否有空缺内容,用来判断是否开始训练模型
            X = train_data_X[filling_feature].drop(i, axis=1)  # 构建训练集
            y = train_data_X[i]

            row_numbers_mg_null = train_data_X[train_data_X[i].isnull()].index.tolist()  # 获取空数据的行
            X_train = X.drop(row_numbers_mg_null)  # 非空的数据作为训练数据集
            y_train = y.drop(row_numbers_mg_null)  # 非空的标签作为训练标签
            X_test = X.iloc[row_numbers_mg_null]  # 空的数据作为测试数据集
            regr = RandomForestRegressor(n_estimators=100,random_state=42)  # 创建线性回归
            regr.fit(X_train, y_train)  # 训练模型
            y_pred = regr.predict(X_test)  # 使用模型进行预测
            train_data_X.loc[row_numbers_mg_null, i] = y_pred
            print('完成训练数据集中的{}列数据的填充'.format(i))
	return train_data_X, train_data_all.矿物类型

迭代填充缺失值:

  • 遍历排序后的特征列表,对每个包含缺失值的特征进行迭代。
  • 对于每个特征,使用其他非缺失值的特征作为训练集(X),当前特征的非缺失值作为训练标签(y)。
  • 识别当前特征中缺失值的行索引,并分别构建训练集和测试集(测试集只包含缺失值)。
  • 使用随机森林回归器训练模型,并预测测试集中的缺失值。
  • 将预测值填充回原始数据集中对应的位置。
  • 返回填充后的数据:返回填充后的特征集 train_data_X 和原始的目标列“矿物类型”。

3.rm_test_fill 函数

def rm_test_fill(train_data, train_label, test_data, test_label):
    train_data_all = pd.concat([train_data, train_label], axis=1)
    train_data_all = train_data_all.reset_index(drop=True)

    test_data_all = pd.concat([test_data, test_label], axis=1)
    test_data_all = test_data_all.reset_index(drop=True)

    train_data_X = train_data_all.drop('矿物类型', axis=1)
    test_data_X = test_data_all.drop('矿物类型', axis=1)
    null_num = test_data_X.isnull().sum()
    null_num_sorted = null_num.sort_values(ascending=True)

    filling_feature = []
    for i in null_num_sorted.index:
        filling_feature.append(i)
        if null_num_sorted[i] != 0:
            X_train = train_data_X[filling_feature].drop(i, axis=1)
            y_train = train_data_X[i]
            X_test = test_data_X[filling_feature].drop(i, axis=1)
            row_numbers_mg_null = test_data_X[test_data_X[i].isnull()].index.tolist()
            X_test = X_test.iloc[row_numbers_mg_null]

            regr = RandomForestRegressor(n_estimators=100,random_state=42)
            regr.fit(X_train, y_train)
            y_pred = regr.predict(X_test)
            test_data_X.loc[row_numbers_mg_null, i] = y_pred
            print('完成测试数据集中的{}列数据的填充'.format(i))
    return test_data_X, test_data_all.矿物类型

这个函数与 rm_train_fill 非常相似,但它是针对测试集进行操作的。主要区别在于:

  • 合并测试数据和标签:同样地,将测试数据 test_data 和测试标签 test_label 合并成一个DataFrame
    test_data_all。
  • 准备测试集特征:从合并后的测试数据中删除目标列,得到测试集特征 test_data_X。
  • 使用训练集数据训练模型:在填充测试集的缺失值时,使用训练集的特征和标签来训练随机森林回归器。这是因为测试集通常不包含标签或完整的真实值,因此无法直接使用测试集本身来训练模型。
  • 迭代填充测试集中的缺失值:过程与 rm_train_fill 类似,但使用训练集的特征和标签来训练模型,并预测测试集中缺失的值。
  • 返回填充后的测试集:返回填充后的测试集特征 test_data_X和原始的目标列。

三、总结

随机森林是一种强大且灵活的机器学习算法,具有许多优点,但也存在一些潜在的缺点。
优点:

  • 高准确性:通过构建多个决策树并集成它们的预测结果,随机森林通常能够提供比单一决策树更高的预测准确性。
  • 鲁棒性:随机森林对噪声和异常值具有较好的容忍度,不容易受到过拟合的影响。这主要是因为每棵树都是基于原始数据集的一个随机子集构建的,并且每个节点的分裂都是基于随机选择的特征子集。
  • 并行化:随机森林中的每棵树都可以独立地构建和评估,这使得算法非常适合并行计算,可以显著减少在大规模数据集上的训练时间。
  • 自动特征选择:随机森林可以隐式地进行特征选择,通过评估每个特征在分裂过程中的重要性来评估其贡献度。
  • 易于实现和使用:随机森林在大多数机器学习库中都有现成的实现,如scikit-learn、R的randomForest包等,用户只需要调整少数几个参数即可。
  • 可解释性:尽管随机森林是一个复杂的集成模型,但由于其基于决策树,因此仍然具有一定的可解释性。用户可以通过查看单个树的决策路径来理解模型的预测过程。

缺点:

  • 计算成本高:尽管随机森林可以并行化,但在构建大量树时,计算成本仍然可能很高,特别是对于大型数据集和深度树。
  • 过拟合风险:虽然随机森林本身具有一定的抗过拟合能力,但如果树的数量过多或树过于复杂,仍然有可能发生过拟合。这通常需要通过交叉验证等方法来避免。
  • 模型复杂性:尽管随机森林相对容易使用,但其内部机制(如多棵树之间的交互)可能相当复杂,难以完全理解。
  • 对小数据集的敏感性:对于非常小的数据集,随机森林可能无法很好地工作,因为自助采样法可能导致某些重要样本的丢失。
  • 参数敏感性:随机森林的性能对参数(如树的数量、树的深度、特征子集的大小等)较为敏感,需要仔细调整以获得最佳性能。
  • 类别不平衡问题:在处理类别不平衡的数据集时,随机森林可能会偏向于多数类。这可以通过一些技术(如重采样、类别权重等)来缓解,但可能需要额外的努力。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Jupyter Notebook】汉化

1.打开:Anaconda Prompt 2.输入:"activate Zhui01"(注意:Zhui01是刚创建的环境名字) activate Zhui01 3.输入:"pip install jupyterlab-language-pack-zh-CN" pip install jupyterlab-language-pack-zh-CN 4.打开:Jupyter Notebook 5.点击&q…

Mysql高级篇(中)——七种常见的 join 查询图

注意: MySQL是不支持 FULL OUTER JOIN 这种语法的,因此要实现图中 6、7的查询结果,可以使用 UNION 关键字结合 LEFT JOIN、RIGHT JOIN 实现,UNION可以实现去重的效果; 参考如下代码: -- MySQL中 图标6 的实…

用Unity2D制作一个人物,实现移动、跳起、人物静止和动起来时的动画:中(人物移动、跳起、静止动作)

上回我们学到创建一个地形和一个人物,今天我们实现一下人物实现移动和跳起,依次点击,我们准备创建一个C#文件 创建好我们点击进去,就会跳转到我们的Vision Studio,然后输入这些代码 using UnityEngine;public class M…

MarginNote 4 激活码 - 苹果电脑(Mac)全能型的阅读工具

对广大求学者来说,如何科学有效地掌握知识,一定是大家不懈追求的方向。 众多求学者使用的,深度阅读学习工具 MarginNote,终于为 Mac 推出了官网 4.0 版。带来了众多创新的学习辅助工具。 MarginNote 4 功能简介 1、快速理清各版…

大数据新视界--大数据大厂之Java 与大数据携手:打造高效实时日志分析系统的奥秘

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

探索fastFM:Python中的高效推荐系统库

文章目录 🚀 探索fastFM:Python中的高效推荐系统库背景:为何选择fastFM?快照:fastFM是什么?安装指南:如何将fastFM加入你的项目?快速入门:五个基础函数的使用实战演练&am…

猫眼电影字体破解(图片转码方法)

问题 随便拿一篇电影做样例。我们发现猫眼的页面数据在预览窗口中全是小方框。在当我们拿到源码以后,数据全是加密后的。所以我们需要想办法破解加密,拿到数据。 破解过程 1.源码获取问题与破解 分析 在我们刚刚请求url的时候是可以得到数据的&#xff…

halcon 由离散点云生成3d模型(2步)

一,创建立方体的3d坐标,定义X,Y,Z坐标 dev_open_window (0, 0, 512, 512, black, WindowHandle) x:[0,0,1,1,0,0,1,1] y:[0,1,1,0,0,1,1,0] z:[0,0,0,0,2,2,2,2] 二,由3创建3d模型(在这里是将所有的点集合为一体) ge…

多路转接之select(fd_set介绍,参数详细介绍),实现非阻塞式网络通信

目录 多路转接之select 引入 介绍 fd_set 函数原型 nfds readfds / writefds / exceptfds readfds 总结 fd_set操作接口 timeout timevalue 结构体 传入值 返回值 代码 注意点 -- 调用函数 select的参数填充 获取新连接 注意点 -- 通信时的调用函数 添…

JavaScript使用高德API显示地图

前言 在JavaScript中,使用Leaflet库显示地图是一种常见的做法。Leaflet是一个开源的JavaScript库,用于在Web应用程序中创建互动地图。它非常轻量级,易于使用,并且提供了多种功能,使开发者能够轻松地将地图集成到他们的…

【Python报错已解决】 SyntaxError: positional argument follows keyword argument

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一:调整参数顺序2.2 步骤二…

银行贷款产品

1、对公贷款 1.1 一般贷款 按贷款期限可分为短期贷款和中长期贷款。短期贷款是指金融企业根据有关规定发放的,期限在1年(含1年)以下的各种贷款。中长期贷款是指金融企业发放的贷款期限在1年以上的各种贷款。 按提供方式不同可分为信用贷款、担保贷款等。信用贷款是指金融企…

springboot实战学习(1)(开发模式与环境)

目录 一、实战学习的引言 (1)前后端的大致学习模块 (2)后端 (3)前端 二、开发模式 一、实战学习的引言 (1)前后端的大致学习模块 (2)后端 Validation&#xf…

ubuntu上通过openvswitch卸载实现roce over vxlan

环境 操作系统: uname -a Linux 5.4.0-187-generic #207-Ubuntu SMP Mon Jun 10 08:16:10 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux Mellanox网卡: ethtool -i ens6np0 driver: mlx5_core version: 23.10-2.1.3 firmware-version: 20.39.3004 (MT_0…

在Linux下查看HBA卡的速率和状态

平时在Linux下映射存储,都是映射哪台就给哪台插线,然后在存储端扫描WWPN,简单粗暴,没技术含量。当然,光交下也可以看。 1,查看当前卡的品牌,常用的卡有两种,Emulex和Qlogic。 lspc…

C语言 - 预处理详解(一)#预定义符号 ##define #undef

文章目录 前言 一、预定义符号 二、#define (一)、#define 定义的标识符 (二)、#define 定义的宏 (三)、#define 替换规则 (四)、# 和 ## 1、 # 的作用 2、## 的作用 (五)、带副作用的宏参数 (六)、宏和函数的对比 (七)、命名约定 三、#undef 总结 前言 路漫漫其修远兮&#…

C语言深度剖析--不定期更新的第五弹

const关键字 来看一段代码&#xff1a; #include <stdio.h> int main() {int a 10;a 20;printf("%d\n", a);return 0; }运行结果如下&#xff1a; 接下来我们在上面的代码做小小的修改&#xff1a; #include <stdio.h> int main() {const int a 1…

【QT】基础入门学习

文章目录 浅析Qt应用程序的主函数使用qDebug()函数常用快捷键Qt 编码风格信号槽连接模型实现方案 信号和槽的工作机制Qt对象树机制 浅析Qt应用程序的主函数 #include "mywindow.h"#include <QApplication>// 程序的入口 int main(int argc, char *argv[]) {//…

IDA的安装和使用

IDA Pro&#xff08;简称 IDA&#xff0c;官网地址为 https://www.hex-rays.com/products/ida/&#xff09;是一个反编译器&#xff0c;同时具备调试器的功能。IDA Pro 的功能非常强大&#xff0c;几乎所有的逆向题目都需要用到它&#xff0c;因而也被称为「逆向神器」 IDA安装…

MySQL入门到精通

一、创建数据库 CREATE DATABASE 数据库名称; 如果数据库存在&#xff0c;则会提示报错。 二、选择数据库 USE 数据库名称; 三、创建数据表 CREATE TABLE 数据表名称; 四、MySQL数据类型 MySQL支持多种类型&#xff0c;大致可以分为三类&#xff1a;数值、日期/时间和字符串…