使用随机森林进行缺失值填补的思想:

X和y之间是有联系的,所以才能用X预测y;那么反过来,y也可以在一定程度上预测X。

当X中的某个特征x有缺失值时,我们将该特征看为target,y看作一个新特征(即X去除x和y组成特征向量,x作为target);无缺失值的样本做训练集,有缺失值的样本做测试集,使用随机森林建模(可以是回归,也可是是分类),对缺失值进行预测。

当X中有多个特征有缺失值时,从缺失值最少的特征开始处理,此时其他缺失值用0填充;当该特征的缺失值用随机森林预测出来后,填补到原始数据中,之后继续按上述方法处理下一个缺失值。

import warnings
warnings.filterwarnings("ignore")
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestRegressor
from sklearn.datasets import load_boston
from sklearn.model_selection import cross_val_score
from sklearn.impute import SimpleImputer
#导入原始数据
ori_x = load_boston().data
target = load_boston().targetpd.DataFrame(ori_x).isnull().sum()
#可以看出,原始数据中13个特征都没有缺失值
0     0
1     0
2     0
3     0
4     0
5     0
6     0
7     0
8     0
9     0
10    0
11    0
12    0
dtype: int64
missing_rate = 0.2 #设置缺失率
missing_cnt = int(np.ceil(missing_rate*ori_x.shape[0]*ori_x.shape[1])) #计算一共有多少个数据将缺失
rs = np.random.RandomState(805) #设置随机数种子
missing_row_idx = rs.randint(0,ori_x.shape[0],missing_cnt) #缺失数据的行索引
missing_col_idx = rs.randint(0,ori_x.shape[1],missing_cnt) #缺失数据的列索引missing_x = ori_x.copy()
missing_x[missing_row_idx,missing_col_idx] = np.nan
missing_x = pd.DataFrame(missing_x,columns=load_boston().feature_names)
missing_x.isnull().sum().sort_values()
DIS         78
AGE         81
PTRATIO     84
TAX         86
RM          88
RAD         88
INDUS       91
CHAS        92
ZN          96
CRIM        98
NOX        100
B          101
LSTAT      104
dtype: int64
missing_col_name = missing_x.isnull().sum().sort_values().index #将特征按照缺失值数量由小到大排列(因为要从缺失值最少的特征开始处理)
missing_col_name
Index(['DIS', 'AGE', 'PTRATIO', 'TAX', 'RM', 'RAD', 'INDUS', 'CHAS', 'ZN','CRIM', 'NOX', 'B', 'LSTAT'],dtype='object')
missing_reg = missing_x.copy()for col in missing_col_name:missing_x_y = missing_reg.copy()missing_x_y['target'] = target #将y作为新特征加入到特征矩阵rf = RandomForestRegressor(random_state=805)test_x = missing_x_y[missing_x_y[col].isnull()].drop(col,axis=1).fillna(0) #将该特征有缺失值的样本取出,drop掉该特征之后,将其他特征的缺失值用0填充missing_idx = list(missing_x_y[missing_x_y[col].isnull()][col].index) #获取该特征值有缺失值的样本的行索引train_x = missing_x_y[missing_x_y[col].notnull()].drop(col,axis=1).fillna(0) #将该特征没有缺失值的样本取出,drop掉该特征之后,将其他特征的缺失值用0填充,处理好之后的数据作为训练集的Xtrain_y = missing_x_y[missing_x_y[col].notnull()][col].values #将该特征没有缺失值的样本取出,并且只保留该特征的数据作为训练集的yrf.fit(train_x,train_y)pre_y = rf.predict(test_x)missing_reg.loc[missing_idx,col] = pre_y #用预测的值填补该特征的缺失值missing_reg.isnull().sum() #可以看到,经过处理之后,所有特征都没有缺失值了
CRIM       0
ZN         0
INDUS      0
CHAS       0
NOX        0
RM         0
AGE        0
DIS        0
RAD        0
TAX        0
PTRATIO    0
B          0
LSTAT      0
dtype: int64
#不同填充方式最后预测结果的比较mean_imp = SimpleImputer(missing_values=np.nan,strategy='mean') #使用各特征的均值填补各特征的缺失值
missing_mean = mean_imp.fit_transform(missing_x)
missing_zero = missing_x.fillna(0) #使用0填补所有的缺失值rf = RandomForestRegressor(random_state=805)
mse = [cross_val_score(rf,ori_x,target,cv=10,scoring='neg_mean_squared_error').mean()*(-1),cross_val_score(rf,missing_reg,target,cv=10,scoring='neg_mean_squared_error').mean()*(-1),cross_val_score(rf,missing_mean,target,cv=10,scoring='neg_mean_squared_error').mean()*(-1),cross_val_score(rf,missing_zero,target,cv=10,scoring='neg_mean_squared_error').mean()*(-1)]
print('无缺失值的mse:{}\n回归填充缺失值的mse:{}\n均值填充缺失值的mse:{}\n0填充缺失值的mse:{}'.format(*mse))
#结果可视化展示:
x_labels = ['Full data', 'Reg Imputation', 'Mean Imputation', 'Zero 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.text(mse[i],i,round(mse[i],2))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()

使用随机森林填补缺失值相关推荐

  1. 利用随机森林填补缺失值

    利用随机森林填补缺失值 介绍 利用随机森林填补缺失值 介绍 说到缺失值,我想各位在进行数据分析之前或多或少都是会遇到的.在做有关机器学习的项目的时候,出题人都是会给你一个好几万好几十万的数据,可能会出 ...

  2. (机器学习)随机森林填补缺失值的思路和代码逐行详解

    随机森林填补缺失值 1.使用0和均值来填补缺失值 2.用随机森林填补缺失值的思路 3.使用随机森林填补缺失值代码逐行详解 3.1导包,准备数据,以及创造缺失的数据集 3.2数据集中缺失值从少到多进行排 ...

  3. python实现-用随机森林填补缺失值、均值填充0填充的比较

    sklearn中,可以使用sklearn.impute.SimpleImputer来轻松地填充均值等 import numpy as np import pandas as pd import mat ...

  4. 机器学习之随机森林填补缺失值和众数填补缺失值

    文章目录 基础 代码 填充众数(add) 代码 基础 随机森林由Leo Breiman(2001)提出的一种分类算法,它通过自助法(bootstrap)重采样技术,从原始训练样本集N中有放回地重复随机 ...

  5. 特征工程-使用随机森林进行缺失值填补

    特征工程-使用随机森林进行缺失值填补 一.前言 特征工程在传统的机器学习中是非常重要的一个步骤,我们对机器学习算法的优化通常是有限的.如果在完成任务时发现不管怎么优化算法得到的结果都不满意,这个时候就 ...

  6. 随机森林案例:回归森林填补缺失值

    文章目录 前言 使用随机森林回归填补缺失值 1.导入库 2. 以波士顿数据集为例,导入完整的数据集并探索 3.为完整数据集放入缺失值 4. 使用0和均值来进行填补 5. 使用随机森林填补缺失值 6. ...

  7. 五、实例:在波士顿房价数据集上用随机森林回归填补缺失值

    在波士顿房价数据集上用随机森林回归填补缺失值 点击标题即可获取源代码和笔记 一.引入 我们从现实中收集的数据,几乎不可能是完美无缺的,往往都会有一些缺失值.面对缺失值,很多人选择的方式是直接将含有缺失 ...

  8. 案例2:随机森林来填补缺失值

    使用随机森林回归来填补缺失值 1.导包 先导入一些需要的包 import numpy as np import pandas as pd import matplotlib.pyplot as plt ...

  9. R语言数据缺失值处理(随机森林,多重插补)

    缺失值是指数据由于种种因素导致的数据不完整,可以分为机械原因和人为原因.对于缺失值我们通常采用以下几种方法来进行插补. 1.读取数据 通过read.csv函数导入文档,也可以用其他函数读入,如open ...

最新文章

  1. python面向对象(part2)--封装
  2. 构造函数= default;_Python Collections之defaultdict 和 default_factory关系
  3. 一天的学习成果:hash输出,dcache工作原理,include的home directory,fist optype的含义...
  4. SuperSlide
  5. python的六个类型_介绍Python中6个序列的内置类型
  6. mysql支持arm64架构吗_ARM架构下面安装mysql5.7.22
  7. Java基础知识盘点(二)- 集合篇
  8. wxpython下载很慢_FAQ:在 Windows 使用 Python
  9. java同类型同字段名称对象赋值
  10. linux 命令 —— cp
  11. Qt使用paintevent事件绘制图像(可进行缩放且能够局部放大)
  12. 软件工程实验二Visio的使用
  13. CREO图文教程:三维设计案例之风扇叶制作图文教程之详细攻略
  14. html组件做成圆角,css3制作圆角按钮
  15. HoRNet SongKey MKIII Mac - 实时调性和弦检测
  16. Nr,GenBank, RefSeq, UniProt 数据库的异同
  17. 大数据还能火多久?通俗说大数据、人工智能、机器学习之关系
  18. 实验2014051901:opencv操作摄像头
  19. RTMP转HTTP-FLV视频流web端应用流程记录
  20. 身体好比什么都强 [唱片]

热门文章

  1. 归并排序实现(JAVA)
  2. python生成6位验证码随机数,需包含英文字母大写、小写和数字(含代码和注释)
  3. MaskRNN Instance Level Video Object Segmentation 论文翻译
  4. Spring Cloud简单笔记
  5. matlab如何在文中定义函数
  6. Android 8.0 、9.0源码编译问题记录
  7. 蓝牙5 BR/EDR Baseband层分析
  8. Golang Context 详细原理和使用技巧
  9. 为什么说期货交易者依靠程序化交易系统接口才能获得成功
  10. 普乐蛙小型5d电影设备|5d电影动感电影体验馆|VR景区影院设备