使用随机森林回归填补缺失值

news2024/11/24 17:58:46

文章目录

  • 一、概述
  • 二、实现
    • 1. 导入需要的库
    • 2. 加载数据集
    • 3. 构造缺失值
    • 4. 使用0和均值填充缺失值
    • 5. 使用随机森林填充缺失值
    • 6. 对填充好的数据进行建模
    • 7. 评估效果对比

一、概述

现实中收集的数据,几乎不可能是完美无缺的,往往都会有一些缺失值。面对缺失值,可以直接删除、数值填充等,在这个案例中,将使用均值,0,和随机森林回归来填补缺失值,并验证四种状况下的拟合状况,找出对使用的数据集来说最佳的缺失值填补方法。

二、实现

1. 导入需要的库

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_boston
from sklearn.impute import SimpleImputer
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import cross_val_score

2. 加载数据集

实现所使用的数据集为波士顿房价数据集

dataset = load_boston()
print(dataset.data.shape) # (506, 13)
X_full, y_full = dataset.data, dataset.target
n_samples = X_full.shape[0] # 506
n_features = X_full.shape[1] # 13

3. 构造缺失值

# 缺失值比例为50%
rng = np.random.RandomState(0)
missing_rate = 0.5
n_missing_samples = int(np.floor(n_samples * n_features * missing_rate))

# 缺失值所在的行位置和列位置
missing_features = rng.randint(0,n_features,n_missing_samples)
missing_samples = rng.randint(0,n_samples,n_missing_samples)

# 复制原始数据
X_missing = X_full.copy()
y_missing = y_full.copy()
# 构造缺失值
X_missing[missing_samples,missing_features] = np.nan
X_missing = pd.DataFrame(X_missing)

4. 使用0和均值填充缺失值

# 使用均值进行填充
from sklearn.impute import SimpleImputer
imp_mean = SimpleImputer(missing_values=np.nan, strategy='mean')
X_missing_mean = imp_mean.fit_transform(X_missing)

# 使用0进行填补
imp_0 = SimpleImputer(missing_values=np.nan, strategy="constant",fill_value=0)
X_missing_0 = imp_0.fit_transform(X_missing)

5. 使用随机森林填充缺失值

对于一个有n个特征的数据来说,其中特征T有缺失值,我们就把特征T当作标签,其他的n-1个特征和原本的标签组成新的特征矩阵。那对于T来说,它没有缺失的部分,就是我们的Y_test,这部分数据既有标签也有特征,而它缺失的部分,只有特征没有标签,就是我们需要预测的部分。

  • X_train特征T不缺失的值对应的其他n-1个特征 + 本来的标签
  • Y_train特征T不缺失的值
  • X_test特征T缺失的值对应的其他n-1个特征 + 本来的标签
  • Y_test特征T缺失的值:未知,我们需要预测的

那如果数据中除了特征T之外,其他特征也有缺失值怎么办?

答案是遍历所有的特征,从缺失最少的开始进行填补(因为填补缺失最少的特征所需要的准确信息最少)。填补一个特征时,先将其他特征的缺失值用0代替,每完成一次回归预测,就将预测值放到原本的特征矩阵中,再继续填补下一个特征。每一次填补完毕,有缺失值的特征会减少一个,所以每次循环后,需要用0来填补的特征就越来越少。当进行到最后一个特征时(这个特征应该是所有特征中缺失值最多的),已经没有任何的其他特征需要用0来进行填补了,而我们已经使用回归为其他特征填补了大量有效信息,可以用来填补缺失最多的特征。遍历所有的特征后,数据就完整,不再有缺失值了

X_missing_reg = X_missing.copy()
sortindex = np.argsort(X_missing_reg.isnull().sum(axis=0)).values
for i in sortindex:
    
    #构建我们的新特征矩阵和新标签
    df = X_missing_reg
    fillc = df.iloc[:,i]
    df = pd.concat([df.iloc[:,df.columns != i],pd.DataFrame(y_full)],axis=1)
    
    #在新特征矩阵中,对含有缺失值的列,进行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,:]
    
    #用随机森林回归来填补缺失值
    rfc = RandomForestRegressor(n_estimators=100)
    rfc = rfc.fit(Xtrain, Ytrain)
    Ypredict = rfc.predict(Xtest)
    
    #将填补好的特征返回到我们的原始的特征矩阵中
    X_missing_reg.loc[X_missing_reg.iloc[:,i].isnull(),i] = Ypredict

6. 对填充好的数据进行建模

#对所有数据进行建模,取得MSE结果
X = [X_full,X_missing_mean,X_missing_0,X_missing_reg]
mse = []
std = []
for x in X:
    estimator = RandomForestRegressor(random_state=0, n_estimators=100)
    scores = cross_val_score(estimator,x,y_full,scoring='neg_mean_squared_error', 
cv=5).mean()
    mse.append(scores * -1)

7. 评估效果对比

x_labels = ['full data'
           ,'zero imp'
           ,'mean imp'
           ,'Regressor Imputation']
colors = ['r', 'g','b','orange']
plt.figure(figsize=(12,6))
ax = plt.subplot(111)
for i in np.arange(len(mse)):
    ax.barh(i,mse[i],color=colors[i],alpha=0.6,align='center')
ax.set_title('Imputation Techniques with Boston Data')
ax.set_xlim(left=np.min(mse)*0.9,
           right=np.max(mse)*1.1)
ax.set_yticks(np.arange(len(mse)))
ax.set_xlabel('mse')
ax.set_yticklabels(x_labels)
plt.show()

在这里插入图片描述

可见在进行缺失值处理时使用随机森林进行填补,比单纯使用0或者均值填补效果要好。

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

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

相关文章

简单沟通,远离纸质繁琐!灵活简单的在线表单制作工具

在线表单制作表单的便利性、灵活性、简易性等优势特点已经成为当今现代化办公中的必需品。随着科技的进步和发展,大到企业、学校,小到集体、个人都需要采用正确的方式去采集信息。鉴于此,在线表单制作工具就是比较理想的记录工具了。那么&…

独立储能的现货电能量与调频辅助服务市场出清协调机制(Matlab代码实现)

💥 💥 💞 💞 欢迎来到本博客 ❤️ ❤️ 💥 💥 🏆 博主优势: 🌞 🌞 🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 …

中小型企业的仓库管理中常见问题及解决方案

中小型企业的仓储管理是企业运营中非常关键的一环,直接影响到企业的资金使用效率和客户体验。因此,建立高效的仓储管理系统对于企业来说至关重要。今天我们就来聊聊中小型企业该如何建立高效的仓库管理。 一、分析一下中小型企业仓库管理的现状 1、手工…

16.Java IO数据流

目录 1. Java基本介绍 2. JDK下载安装及其环境配置 3. 一个简单的java程序 4. Eclipse基本使用、数据类型、运算符 5. 控制语句(if、switch、for、while、foreach) 6. Java数组 7. Java字符串对象(String|StringBuffer|StringBuilder|StringJoiner…

功能安全ISO26262 道路车辆 功能安全审核及评估方法第3部分:软件层面

道路车辆 功能安全审核及评估方法 第3部分:软件层面 Road vehicles - Functional Safety Audit and Assessment Method - Part 3: Software Level (工作组草案) 2022.4.15 前  言 本文件按照GB/T 1.1—2020《标准化工作导则 第1部分…

什么是客户服务平台?

在社交媒体和智能手机出现之前,品牌主要通过单向广告渠道与客户互动。社交媒体打破了这种自上而下的动态,以前所未有的方式打开了对话,将客户包括在内。 品牌不再控制客户对人们分享公司内容的行为。人们可以点击离开,向左滑动&a…

分别使用软件和硬件SPI驱动1.28寸LCD屏幕刷新时间对比(驱动IC为GC9A01)

写在前面: 屏幕供应商提供的GC9A01驱动代码过于简陋,使用的话需要修改的东西比较多,还好看到一篇文章,而且博主分享了驱动代码。文章地址 以下软件SPI部分是通过博主分享的驱动代码得来的,稍微改一下就可以用&#xf…

jconsole工具监测jvm

背景 本篇文章为了记录如何使用jconsole工具。 jconsole工具使用环境是windows,监控服务端在linux上。 如何启动jconsole 找到你本地jdk的目录,进入bin目录,找到jconsole.exe程序双击启动即可 本地进程 如果是想调试本地程序的话&#xf…

23、iOS逆向防护

一、ptrace 1.1 、ptrace概述 ptrace: process trace,提供一个进程监察和控制另一个进程.并且可以读取和改变被控制进程的内存和寄存器里面的数据.它就可以用来实现断点调试和系统调用跟踪. App可以被lldb动态调试,因为App被设备中的debugserver附加,它会跟踪我们的应用进程…

Java阶段二Day08

Java阶段二Day08 文章目录 Java阶段二Day08DML语言-数据操作语言INSERTUPDATEDELETE 数据类型整数类型浮点类型字符类型日期类型 约束条件主键约束(PRIMARY KEY)非空约束(NOT NULL)唯一性约束(UNIQUE)检查约…

安科瑞:列头柜、监控系统、触摸屏的数据中心机房配电方案

摘要 安科瑞精密配电系统是安科瑞针对数据中心集中监控要求提供的多回路监控装置,监控多回路电参量并可对各种故障进行告警。主要适用于各类列头柜、精密配电柜、电源分配柜、UPS输出柜等末端配电设备的监控。在阐述数据中心机房机柜配电目标要求的基础上&#xff…

Redis分布式缓存方案

分布式缓存 单节点Redis问题 数据丢失:数据持久化并发能力弱:搭建主从集群,实现读写分离故障恢复问题:哨兵实现健康检测,自动恢复存储能力:搭建分片集群,利用插槽机制实现动态扩容 Redis持久…

Windows逆向安全(一)之基础知识(十八)

指针作为参数 代码 #include "stdafx.h" void function(int num){num52; } void function2(int* num){*num52; } int main(int argc, char* argv[]) {int num610;function(num);printf("%d\n",num);function2(&num);printf("%d\n",num);re…

KVM NAT 模型

目录 NAT原理 virbr0-nic作用 关于kvm中的网桥和virbr0-nic网卡需注意以下几点: NAT原理 virbr0-nic作用 在kvm中每次通过kvm创建一个网桥都会自动在该网桥下创建两个接口,与网桥同名的virbr0接口代表这个虚拟网桥,可以通过它来配置网桥…

vue2的生命周期

生命周期就是记录数据的状态。对数据进行操作 刚开始 new Vue() 创建了一个实例对象 beforeCreate() 数据还没有创建出来 created() 数据创建出来了,可以访问 判断有没有el 或 template 后 将模板编译成渲染函数 beforeMount() 数据还没有挂在到页面上面 mou…

引入tiff.js报错

当我们安装引入tiff.js时,会遇到这些问题,相关命令以及错误: 1、安装tiff依赖 npm install tiff.js 2、引入tiff import Tiff from tiff.js 3、错误展示: 这个错误是因为没有在vue.config.js以及webpack.base.conf.js(在build文…

C4D的GPU渲染器Octane和Redshift的渲染对比

对CG圈创作人员来说,除制作软件外渲染器是平时接触最多的一类软件,用渲染器进行渲染的过程,就是把制作软件里的预览效果变到融合材质、光照、物理特性的最终效果的这个过程,这是CG制作中最重要的一步,关乎着最终效果的…

头歌--shell脚本入门 变量、字符串--第3关:shell 字符串

任务描述 本关带领大家熟悉 shell 的变量并掌握其使用。 相关知识 字符串概念 字符串是 shell 编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号&#xff…

数据库系统概论--期末复习

目录 一.绪论 一.数据库系统概述 二.数据模型 三.数据库系统的结构 四.数据库系统的组成 二.关系数据库 一.关系数据结构及形式化定义 二.关系操作 三.关系的完整性 四.关系代数 三.SQL语言 一.数据定义 二.数据查询 三.数据更新 四.视图 四.数据库安全性 1.不安…

Access Token 访问令牌 如何获取?

一、引用 三方库导入时,通常需要输入账号和令牌进行鉴权。账号为指定平台的 HTTP 克隆账号,访问令牌即 Access Token,本文介绍如何获取常见三方代码平台的Access Token。 Access Token 通常在代码平台的个人账号设置内进行管理和配置&#xf…