数据清洗-缺失值填充-随机森林搜寻最优参数填充

news2024/9/27 9:19:26

目录

  • 一、安装所需的python包
  • 二、采用随机森林算法进行缺失值填充
    • 2.1可直接运行代码
    • 2.2以某个缺失值数据进行实战
      • 代码运行过程截屏:
      • 填充后的数据截屏:
  • 三、随机森林算法 (Random Forest) 介绍
    • 3.1随机森林的定义
    • 3.2随机森林的基本思想
    • 3.3随机森林的工作原理
    • 3.4随机森林的优缺点
      • 3.4.1优点
      • 3.4.2缺点
    • 3.5随机森林的应用场景
    • 3.6随机森林的参数
  • 四、随机森林参数优化原理--网格搜索
    • 4.1代码说明
    • 4.2参数优化的原理
      • 1. 网格搜索(Grid Search)
      • 2. 交叉验证(Cross-Validation)
      • 3. 随机森林模型的超参数
      • 4. 预测缺失值
    • 4.3整体优化效果
    • 4.4输出与保存

感觉大家对原理性的东西不太感兴趣,那我就直接举例提供代码,以及详细的注释,大家自己对照改代码应用于你自己建立的模型吧。

这些代码全部是我自己做数模竞赛时候自己用的代码。可以直接运行,记得修改文件路径。

一、安装所需的python包

pip install scikit-learn
pip install numpy
pip install pandas

二、采用随机森林算法进行缺失值填充

注意代码需要把自己的数据文件格式转换为CSV文件,并且把路径修改为自己文件所在的路径,不会转换的参考我此教程文件格式转换:EXCEL和CSV文件格式互相转换。

我知道大家对原理性的东西不感兴趣,我把他的原理介绍放在文末,需要写论文的同学自己拿去用,记得修改,否则查重率过不去。

2.1可直接运行代码

"""
随机森林补充缺失值,随机森林的参数是经过优化的,但是精度不太够,哎先就这样吧
我想着可以对初值进行优化,但是还没弄,就现这样吧
这个运算速度慢

随机森林:优点可以处理各种类型的特征(包括二元、分类和数值特征),并且不需要对数据进行标准化或规范化
"""
from sklearn.impute import SimpleImputer
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import GridSearchCV

import numpy as np
import pandas as pd

#导入文件
data = pd.read_csv('缺失值填充.csv',encoding='gbk')

#备份数据,防止数据丢失,保护原数据
data_copy = data.copy()

#删除第一列,因为是索引,不影响结果
data_copy.drop(data_copy.columns[0], axis=1, inplace=True)
#对数据的各列进行排序,找出缺失值最少的列
sindex = np.argsort(data_copy.isnull().sum()).values

#创建随机森林模型
rfc = RandomForestRegressor()

#GridSearchCV的参数网络
param_grid = {'n_estimators': range(10, 71, 10), 'max_depth': range(5, 8),
               'min_samples_split': range(2, 5), 'min_samples_leaf': range(1, 3)}

#创建GridSearchCV的实例
rfc_GS = GridSearchCV(estimator=rfc, param_grid=param_grid, cv=3)

#处理每一列数据
for i in sindex:
    #判断,无缺失值跳过
    if data_copy.iloc[:, i].isnull().sum() == 0:
        continue
    df = data_copy
    fillc = df.iloc[:, i]
    df = df.iloc[:, df.columns != df.columns[i]]

    #对于缺失值填充0
    df_0 = SimpleImputer(missing_values=np.nan, strategy='constant', fill_value=0).fit_transform(df)

    #划分训练集和测试集
    Ytrain = fillc[fillc.notnull()]
    Ytest = fillc[fillc.isnull()]
    Xtrain = df_0[Ytrain.index, :]
    Xtest = df_0[Ytest.index, :]

    #使用GridSearchCV训练模型,寻找最优参数
    rfc_GS.fit(Xtrain, Ytrain)

    #预测缺失值
    Ypredict = rfc_GS.predict(Xtest)

    #打印最优参数
    print('Best parameters are: ', rfc_GS.best_params_)

    #填充数据
    data_copy.loc[data_copy.iloc[:, i].isnull(), data_copy.columns[i]] = Ypredict

#打印数据
print(data_copy)

#保存数据
data_copy.to_csv('随机森林参数优化填充.csv', index=False)

注意:data = pd.read_csv('缺失值填充.csv',encoding='gbk')里面的缺失值填充.csv是你自己的缺失值的csv文件路径,data_copy.to_csv('随机森林参数优化填充.csv', index=False)中的随机森林参数优化填充.csv是你填充后的文件名,你可以自己起名。

2.2以某个缺失值数据进行实战

注意:数据量较少,由自己构建,均有规律,
如下图:
在这里插入图片描述

构造缺失值,如下图:
在这里插入图片描述

运行代码查看填充后的数据怎么样,
运行代码如下图+填充后的截图:

代码运行过程截屏:

在这里插入图片描述

填充后的数据截屏:

在这里插入图片描述

说明:可以看到对参数进行优化后,预测填充的效果直线上升,但是你在进行数模比赛时候,需要说明为什么你要选用该算法填充,说明他的原理即可,不必纠结填充的数据是否正确,因为你本身也不知道数据的正确性。

接下来我将继续分享其他我参加数模时候常用的几种数据填充的代码,都是我自己调试跑通过的,大家直接复制粘贴使用。

三、随机森林算法 (Random Forest) 介绍

3.1随机森林的定义

随机森林 (Random Forest) 是一种基于决策树的集成学习方法,由 Leo Breiman 和 Adele Cutler 在 2001 年提出。它通过构建多个决策树来完成分类或回归任务,并利用这些决策树的集成结果来提高模型的准确性和稳定性。随机森林的基本思想是将多个相对较弱的学习器(即决策树)结合起来,从而形成一个强大的集成模型。

3.2随机森林的基本思想

随机森林属于 Bagging (Bootstrap Aggregating) 集成方法 的一种扩展。Bagging 方法通过从原始数据集中有放回地抽样来生成多个子数据集,并在每个子数据集上训练一个弱学习器(如决策树)。在预测时,随机森林会将所有树的预测结果进行投票(分类问题)或平均(回归问题),以得到最终的预测结果。

随机森林的基本特点在于“随机性”,主要体现在以下两个方面:

  1. 数据随机性:在构建每棵决策树时,从原始数据集中随机抽取样本(有放回),构成训练数据集。
  2. 特征随机性:在每棵树的节点分裂时,随机选择部分特征来确定最佳分裂点,而不是使用所有特征。

3.3随机森林的工作原理

  1. 随机抽样:从原始数据集中有放回地随机抽取多个子样本,构建多个训练数据集。
  2. 构建决策树:对每个训练数据集,构建一棵决策树。在每个节点分裂时,随机选择一部分特征,并根据这些特征选择最佳分裂点。
  3. 集成结果:对分类问题,随机森林对所有决策树的结果进行投票,选择出现次数最多的类别作为最终分类结果;对回归问题,则取所有决策树预测值的平均作为最终预测结果。

3.4随机森林的优缺点

3.4.1优点

  • 准确性高:通过多个决策树的集成,随机森林通常比单一决策树有更高的预测准确性。
  • 防止过拟合:由于采用了随机性机制,随机森林能有效防止决策树的过拟合问题。
  • 鲁棒性强:对噪声和异常值不敏感,具有较好的鲁棒性。
  • 处理高维数据:能够处理大量特征的数据集,并能评估特征的重要性。
  • 易于并行化:各个树的构建可以独立并行进行,容易扩展到大数据场景。

3.4.2缺点

  • 模型复杂度高:由于集成了多棵决策树,随机森林的模型复杂度较高,不易解释。
  • 计算成本大:构建多棵决策树的计算开销大,特别是在数据量大或特征数量多的情况下。
  • 对单调特征不敏感:如果某个特征对于所有树来说都是有用的,则无法通过随机森林的特征重要性识别出来。

3.5随机森林的应用场景

随机森林广泛应用于以下场景:

  • 分类问题:如文本分类、图像分类、疾病诊断等。
  • 回归问题:如房价预测、销量预测等。
  • 特征选择:通过评估特征的重要性,帮助选择有意义的特征。
  • 异常检测:通过识别异常样本与正常样本的差异,应用于金融欺诈检测、网络入侵检测等领域。

3.6随机森林的参数

随机森林模型有多个参数可以调整,主要包括:

  • n_estimators(决策树的数量):构建的决策树数量,通常数量越多,模型效果越好,但计算开销也越大。
  • max_features(最大特征数):每次分裂时随机选择的特征数量,可以是特定数值或占比(如 "sqrt" 表示总特征数的平方根)。
  • max_depth(最大深度):单棵决策树的最大深度,防止树过度生长(过拟合)。
  • min_samples_split(最小分裂样本数):节点分裂所需的最小样本数,越大则越能防止过拟合。
  • min_samples_leaf(叶节点最小样本数):叶节点上所需的最小样本数。
  • bootstrap(是否有放回抽样):是否对样本进行有放回抽样构建子数据集。

四、随机森林参数优化原理–网格搜索

4.1代码说明

该代码使用随机森林回归器(RandomForestRegressor)来填补数据中的缺失值,并通过网格搜索(Grid Search)对随机森林模型的超参数进行优化,以提高填补的精度。具体步骤如下:

  1. 读取数据:从 CSV 文件中读取数据,并备份原始数据,以防数据丢失。
  2. 数据预处理
    • 删除数据的第一列(假设为索引列),以免影响结果。
    • 对数据的各列进行排序,按缺失值的数量从少到多排序,以便先填补缺失值较少的列。
  3. 创建随机森林模型:使用 RandomForestRegressor 作为基础模型。
  4. 定义参数网格:使用 GridSearchCV 定义一组超参数范围,以进行网格搜索优化:
    • n_estimators:树的数量,范围为 10 到 70(步长为 10)。
    • max_depth:树的最大深度,范围为 5 到 7。
    • min_samples_split:分裂节点所需的最小样本数,范围为 2 到 4。
    • min_samples_leaf:叶节点所需的最小样本数,范围为 1 到 2。
  5. 逐列填补缺失值:对每一列存在缺失值的数据,使用随机森林进行预测和填补:
    • 将非目标列的缺失值填充为 0,准备训练数据。
    • 分离训练集(有值)和测试集(缺失值部分)。
    • 使用网格搜索和交叉验证(Cross-Validation)来选择最佳的模型参数组合。
    • 用训练好的随机森林模型预测测试数据中的缺失值并进行填补。
  6. 保存数据:将填补后的数据保存为新的 CSV 文件 随机森林参数优化填充.csv

4.2参数优化的原理

1. 网格搜索(Grid Search)

网格搜索是一种对模型超参数进行优化的技术,通过定义一组参数的可能取值,遍历这些组合来找到模型在验证集上表现最优的参数设置。在代码中,使用 GridSearchCV 实现网格搜索优化随机森林模型的超参数。

  • estimator:指定使用的基础模型,这里是 RandomForestRegressor
  • param_grid:定义参数的取值范围:
    • n_estimators:从 [10, 20, 30, 40, 50, 60, 70] 中选择最佳的树数量。
    • max_depth:从 [5, 6, 7] 中选择最佳的树深度。
    • min_samples_split:从 [2, 3, 4] 中选择最佳的分裂节点最小样本数。
    • min_samples_leaf:从 [1, 2] 中选择最佳的叶节点最小样本数。
  • cv:设置交叉验证的折数,这里为 3,表示使用 3 折交叉验证。

2. 交叉验证(Cross-Validation)

交叉验证用于评估模型的泛化能力。在本代码中,采用 3 折交叉验证,意味着将数据集分为 3 份,每次使用其中 2 份训练模型,剩下 1 份用于验证。这有助于防止过拟合,确保选择的参数在不同数据分割上都能表现良好。

3. 随机森林模型的超参数

  • n_estimators(树的数量):决定了随机森林中决策树的数量,更多的树通常会提高模型的性能,但也增加了计算成本。
  • max_depth(最大深度):控制树的最大深度,较大的深度会使模型更复杂,可能导致过拟合。
  • min_samples_split(最小分裂样本数):每个内部节点所需的最小样本数,较高的值可以防止过拟合。
  • min_samples_leaf(叶节点最小样本数):叶节点上最少的样本数,较高的值会导致模型更加简单,防止过拟合。

4. 预测缺失值

在找到最佳的参数组合后,使用训练好的随机森林模型预测测试数据中的缺失值。模型使用已知数据学习缺失值的模式,然后对未知部分进行填充。

4.3整体优化效果

通过网格搜索和交叉验证,代码能够找到适合填补每一列缺失值的最佳随机森林模型参数,从而最大化模型的预测准确性。

4.4输出与保存

  • 最优参数:对于每一列,输出最优的参数组合。
  • 保存数据:将填补后的完整数据保存为新的 CSV 文件 随机森林参数优化填充.csv

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

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

相关文章

语言模型中的多模态链式推理(论文复现)

语言模型中的多模态链式推理(论文复现) 本文所涉及所有资源均在传知代码平台可获取 文章目录 语言模型中的多模态链式推理(论文复现)简介摘要引言多模态思维链推理的挑战多模态CoT框架多模态CoT模型架构细节编码模块融合模块解码模…

redis短信登录模型

基于Session实现登录 ,

Unity程序基础框架

概述 单例模式基类 没有继承 MonoBehaviour 继承了 MonoBehaviour 的两种单例模式的写法 缓存池模块 &#xff08;确实挺有用&#xff09; using System.Collections; using System.Collections.Generic; using UnityEngine;/// <summary> /// 缓存池模块 /// 知识点 //…

数据结构基础详解:哈希表【C语言代码实践篇】开放地址法__拉链法_哈希表的创建_增删查操作详解

文章目录 1.哈希表代码实现之开放地址法1.1 开放地址法创建哈希表1.2 开放地址法之查找1.3 开放地址法之插入1.4 开放地址法之删除 2.哈希表代码实现之链地址法(拉链法)2.1 链地址法之创建哈希表2.2 链地址法之查找2.3 链地址法之插入2.4 链地址法之删除 1.哈希表代码实现之开放…

Stable diffusion生图原理

简介 Stable diffusion 是一种基于扩散技术的深度学习模型&#xff0c;于2022年发布&#xff0c;是Stability AI公司推出的首要产品&#xff0c;它主要用于生成以文本描述为条件的详细图像&#xff0c;同时也可以进行补绘、外绘、重绘等任务&#xff0c;但原理都和文生图原理…

C++中矩阵的介绍及相关应用扩展详解

1. 矩阵概念 在数学中&#xff0c;矩阵&#xff08;Matrix&#xff09;是一个按照长方阵列排列的复数或实数集合&#xff0c;最早来自于方程组的系数及常数所构成的方阵。这一概念由19世纪英国数学家凯利首先提出。 矩阵是高等代数学中的常见工具&#xff0c;也常见于统计分析…

Qt-QPushButton按钮类控件(22)

目录 描述 使用 给按钮添加图片 给按钮添加快捷键 添加槽函数 添加快捷键 添加组合键 开启鼠标的连发功能 描述 经过上面的一些介绍&#xff0c;我们也尝试的使用过了这个控件&#xff0c;接下来我们就要详细介绍这些比较重要的控件了 使用 给按钮添加图片 我们创建…

线性表之单链表

在上一节我们学习了线性表中的顺序表&#xff0c;今天我们来学习一下线性表中的另一种结构——单链表 前言 我们在之前已经初步了解了数据结构中的两种逻辑结构&#xff0c;但线性结构中并非只有顺序表一种&#xff0c;它还有不少兄弟姐妹&#xff0c;今天我们再来学习一下单链…

RealityCapture全面讲解:摄影测量软件的新纪元

随着数字化技术的迅猛发展&#xff0c;摄影测量软件在各行各业中的应用日益广泛。其中&#xff0c;RealityCapture作为一款领先的摄影测量解决方案&#xff0c;以其卓越的速度、精度和易用性&#xff0c;赢得了全球众多专业人士的青睐。本文将全面讲解RealityCapture的功能特点…

演示:基于WPF自绘的中国省份、城市、区县矢量地图

一、目的&#xff1a;演示一个基于WPF自绘的中国省份、城市、区县矢量地图 二、效果 国 省 市 三、功能 支持实际经纬度显示 支持平移&#xff0c;缩放等功能 显示中国地图 显示各个省份地图 显示各个省份地图&#xff08;包含在表格中&#xff0c;包含缩率图&#xff09; 显…

UE4_后期处理五—饱和度调整、隔离、扭曲、重影

一、色彩饱和度调整&#xff1a; 原图 后期处理材质节点&#xff1a; 效果图&#xff1a; 可以根据参数saturation调整饱和还是去饱和。 当saturation为1时&#xff1a;去饱和度&#xff0c;如下图&#xff1a; 当saturation为0时&#xff1a;原始的一个状态&#xff0c;如下…

JS import export export default ES6 modules 玩的明白吗

export (ES6) 导出 一个文件可以有多个&#xff0c;不可重名 命名导出&#xff1a; 使用export关键字导出变量、函数、类或值时&#xff0c;需要为它们指定名称。这些名称将在其他模块中用于导入。 export default 单一导出&#xff1a; export default 只能用于导出一个模块、…

python 读取excel

一、安装依赖&#xff1a; pandas 二、新建excel 示例数据&#xff1a;students.xlsx 三、定义类&#xff1a;student.py Student class Student:def __init__(self, name, sex):self.name nameself.sex sexdef show(self):print(f姓名&#xff1a;{self.name} 性别&#…

全面理解tensor编程中矩阵的行和列

经常会在编程中遇到理解矩阵行和列的事情。 1、要明确无论这个张量有多少维度&#xff0c;它的矩阵乘法都只能作用于最后两个维度。 例如&#xff1a; import torcha torch.rand([64, 32, 3, 4]) b torch.rand([64, 32, 3, 4])c torch.matmul(a, b.transpose(2, 3)) # 交…

3.接口测试的基础/接口关联(Jmeter工具/场景一:我一个人负责所有的接口,项目规模不大)

一、Jmeter接口测试实战 1.场景一&#xff1a;我一个人负责所有的接口&#xff1a;项目规模不大 http:80 https:443 接口文档一般是开发给的&#xff0c;如果没有那就需要抓包。 请求默认值&#xff1a; 2.请求&#xff1a; 请求方式:get,post 请求路径 请求参数 查询字符串参数…

sh文件执行提示语法错误: 未预期的文件结尾

在执行sh文件时总是提示&#xff1a;语法错误: 未预期的文件结尾&#xff0c;尝试删除最后的空格也不对 最后发现在notepad中转换的问题 需要把windows换成unix就行了

时间序列中的多尺度问题-近期值得关注的8篇多尺度建模工作

时间序列的多尺度建模 多尺度是时序研究必须要考虑的问题。一方面&#xff0c;不同特征的周期模式有长有短&#xff0c;需要用不同尺度进行刻画。另一方面&#xff0c;尺度越小越精细&#xff0c;计算越复杂&#xff1b;尺度越大越粗糙&#xff0c;相应计算量减少&#xff0c;…

容器化安装jenkins稳定版长期维护版本LTS

前提已有 docker-compose和docker-ce环境&#xff0c;这里安装稳定的Lts版本即可。 选择稳定版本 这里选择LTS 稳定长期维护的版本 在docker镜像找到LTS稳定版本 部署jenkins服务 创建持久化数据目录 jenkinsdata]# pwd /data/jenkinsdata编写docker-compose文件 jenkins_…

DAY 13 : 排序

定义 稳定排序和非稳定排序 设文件f&#xff08;R1……Ri……Rj……Rn&#xff09;中记录Ri、Rj&#xff08;i≠j&#xff0c;i、j1……n&#xff09;的key相等&#xff0c;即KiKj。 若在排序前Ri领先于Rj&#xff0c;排序后Ri仍领先于Rj&#xff0c;则称这种排序是稳定的&…

Linux操作系统入门(三)

_______________________________________________ 一.Linux操作系统的文件结构 相比于Windows操作系统的C,D,E等盘符&#xff0c;Linux操作系统仅有一个"/"符号的根目录. 这其中存在一个显著的不同&#xff0c;Linux操作系统使用的是斜杠"/",而Windows…