文章目录

  • 随机森林回归填补缺失值
    • ♦导入需要的库
    • ♦导入数据集
    • ♦构建缺失值
    • ♦缺失值填补
      • ① 均值mean填补
      • ② 使用0值填补
      • ③ 使用随机森林回归填补
        • ⑴ 缺失值数目排序索引
        • ⑵ 遍历索引填补空值
      • ④ 对填补结果进行评估
      • ⑤ 评估结果可视化

随机森林回归填补缺失值

我们从现实中收集的数据,几乎不可能是完美的,往往都会有一些缺失值,很多人选择的是直接将含有缺失值的样本直接删除,这是一种方式,但是有时候填补缺失值会比直接丢弃样本效果更好,即使我们不知道缺失值的真实数据。

sklearn.impute.SimpleImputer模块中可以轻松地将均值、中值、或者其它常用的数值来对空值进行填补。下面我们将对波士顿房价数据集进行均值0随机森林回归来进行缺失值填补,并验证各种情况下的拟合效果,找出最佳的缺失值填补方式。

♦导入需要的库

import numpy as np
import pandas as pd
from matplotlib import 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

♦导入数据集

# 获取数据集 --- 共有 506*13=6578 个数据
boston = load_boston()
x_full = boston.data   # 数据集
y_full = boston.target # 标签列
n_samples = x_full.shape[0] # 506行
n_features = x_full.shape[1] # 13列 --- 特征名称

♦构建缺失值

  • 1.首先确定放入缺失值的比例:50%,也就是共有3289个数据缺失
rng = np.random.RandomState(0) # 随机种子
missing_rate = 0.5 # 缺失值比例
n_missing_samples = int(np.floor(n_samples*n_features*missing_rate)) # np.floor()向下取整,返回.0格式的浮点数
n_missing_samples # 3289
  • 2.缺失值是遍布在506*13的数据表中 ---- 随机位置生成3289个缺失值(行、列组成的网格格数)。类似于DataFrame,我们需要通过索引(行、列)来进行定位,生成缺失值。
#   randint(下限,上限,取出数的个数)
missing_samples = rng.randint(0,n_samples,n_missing_samples)  # 行中随机取出3289个数据
missing_features= rng.randint(0,n_features,n_missing_samples) # 列中随机取出3289个数据
# 使用上述的方式进行抽样,会使得数据远超样本量506(这里的样本量只按照行来计算)
# 我们还可以使用np.random.choice()来进行抽象,可以抽取不重复的随机数,确保数据不会集中在同一行中,某种程度上也保证了数据的分散度
  • 3.生成缺失值
x_missing = x_full.copy() # 对源数据集进行拷贝
x_missing[missing_samples,missing_features] = np.nan # 通过行、列索引随机定位生成缺失值
x_missing = pd.DataFrame(x_missing)
x_missing


返回顶部


♦缺失值填补

① 均值mean填补

  • 利用sklearn.impute中的SimpleImputer类进行填补,missing_values=np.nan代表当前所需填补值(空值)的类型;strategy='mean'表示填补空值所使用的策略,就是用均值mean来进行填补。
# 4.使用均值进行填补
imp_mean = SimpleImputer(missing_values=np.nan,strategy='mean')
x_missing_mean = imp_mean.fit_transform(x_missing) # 训练fit() + 导出predict() ==> fit_transform()
x_missing_mean = pd.DataFrame(x_missing_mean)
x_missing_mean

填补之后,效果如下图所示

返回顶部


② 使用0值填补

  • strategy=’constant’,fill_value=0 表示使用常量进行填补,fill_value指明所使用的常数为0。
imp_0 = SimpleImputer(missing_values=np.nan,strategy='constant',fill_value=0)
x_missing_0 = imp_mean.fit_transform(x_missing) # 训练fit() + 导出predict() ==> fit_transform()
x_missing_0 = pd.DataFrame(x_missing_0)
x_missing_0

返回顶部


③ 使用随机森林回归填补

任何回归都是从特征矩阵中学习,然后求解连续型标签y的过程,之所以能够实现这个过程,是因为回归算法认为特征矩阵和标签之前存在着某种联系。实际上,标签和特征是可以相互转换的,比如说,在一个“用地区,环境,附近学校数量预测“房价”的问题中,我们既可以用“地区,“环境”,“附近学校数量”的数据来预测“房价”,也可以反过来用“环境”,“附近学校数量”和“房价”来预测“地区”(有点类似"y=kx+b"方程中的知三求一)。而回归填补缺失值,正是利用了这种思想。

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

特征T不缺失的值对应的其他 n-1个特征+本来的标签:xtrain
特征T不缺失的值:ytrain

特征缺失的值对应的其他 n-1个特征+本来的标签: xtest
特征缺失的值:未知,我们需要预测的ytest

  • 这种做法,对于某一个特征大量缺失,其他特征却很完整的情况,非常适用!

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

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

⑴ 缺失值数目排序索引

x_missing_reg = x_missing.copy()
# 找出数据集中,缺失值从小到大排序的特征们的顺序
# np.argsort() --- 返回从小到大排序的顺序所对应的索引
sort_columns_index = np.argsort(x_missing_reg.isnull().sum()).values
sort_columns_index

⑵ 遍历索引填补空值

for i in sort_columns_index:# 构建新的特征矩阵(没有选中填充的特征 + 原始的标签)和新标签(被选中填充的特种)df = x_missing_regfillc = df.iloc[:,i] # 当前要填值的一列特征 --- 新标签  df = pd.concat([df.iloc[:,df.columns != i],pd.DataFrame(y_full)],axis=1) # 其余n-1列和完整标签# 在新的特征矩阵中对含有缺失值的列进行空值填补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).fit(xtrain,ytrain)y_predict = rfc.predict(xtest)# 将填补好的特征返回到我们的原始特征矩阵中x_missing_reg.loc[x_missing_reg.iloc[:,i].isnull(),i] = y_predict

返回顶部


④ 对填补结果进行评估

  • 我们接下来使用交叉验证(均方误差),分别对原始数据集均值填补数据集0值填补数据集随机森林回归填补数据集进行打分。
# 对空值填补进行评估
X = [x_full,x_missing_mean,x_missing_0,x_missing_reg]
mse = [] # 使用均方误差进行评估for x in X:estimator = RandomForestRegressor(n_estimators=100,random_state=0)scores = cross_val_score(estimator,x,y_full,scoring='neg_mean_squared_error',cv=5).mean()mse.append(scores * -1)
mse    [21.62860460743544, 43.20737719157445, 47.40551717161716, 17.55283253410987]

通过评估,可以发现,利用均值0值进行空值填补均方误差评分达到40以上,而利用随机森林回归填补竟然比原始数据集的拟合效果还要好,均方误差评分低至17.5,当然不排除具有过拟合情况的出现。

返回顶部


⑤ 评估结果可视化

# 可视化
plt.figure(figsize=(12,8)) # 画布
colors = ['r','g','b','orange'] # 颜色
x_labels = ["x_full","x_missing_mean","x_missing_0","x_missing_reg"] # 标签ax = plt.subplot(111) # 添加子图
for i in range(len(mse)):ax.barh(i,mse[i],color=colors[i],alpha=0.6,align='center')ax.set_title("Imputation Technique with Boston Data",color='white') # 设置标题
ax.set_xlim(left=np.min(mse)*0.9,right=np.max(mse)*1.1) # 设置x轴的范围
ax.set_yticks(range(len(mse)))
ax.set_xlabel("MSE",color='white') # 设置x轴标签
ax.set_yticklabels(x_labels) # 设置y轴刻度
# 设置图形坐标轴颜色为白色
plt.tick_params(axis='x',colors='white')
plt.tick_params(axis='y',colors='white')
plt.show()

返回顶部


【skLearn 练习】随机森林回归填补缺失值相关推荐

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

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

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

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

  3. sklearn机器学习:随机森林回归器RandomForestRegressor

    sklearn随机森林回归器类的格式 sklearn.ensemble.RandomForestRegressor (n_estimators='warn', criterion='mse', max ...

  4. 万能  随机森林回归 补缺函数

    #####todo 只对一列数据含有缺失,另外的数据都不含缺失值的数据有效def fill_missing_rf(X, Y, to_fill):"""使用随机森林填补一个 ...

  5. HuaPu在学:机器学习——sklearn【随机森林】

    随机森林 文章目录 随机森林 一.集成算法 二.RandomForestClassifier [控制基评估器的参数] [n_estimators] [random_state] [bootstrap ...

  6. 菜菜的sklearn课堂——随机森林

    1.概述 1.1 集成算法概述 集成算法会考虑多个评估器的建模结果,汇总之后得到一个综合的结果,以此来获取比单个模型更好的回归或分类表现. 1.2 sklearn中的集成算法 sklearn中的集成算 ...

  7. 机器学习系列(10)_决策树与随机森林回归

    注:本篇文章接上一篇文章>>机器学习系列(9)_决策树详解01 文章目录 一.决策树优缺点 二.泰坦尼克号幸存者案例 三.随机森林介绍 1.随机森林的分类 2.重要参数 [1]n_esti ...

  8. 随机森林回归算法讲解

    随机森林(Random Forest)是一种基于集成学习的机器学习算法,被广泛用于回归问题.它通过使用多个决策树对数据进行建模,并将它们的预测结果进行集成,从而提高了模型的性能和稳定性.在本教程中,我 ...

  9. sklearn的系统学习——随机森林分类器与随机森林回归器(含有python完整代码及案例)

    目录 集成算法 sklearn中的随机森林 随机森林分类器 随机性参数 属性 案例代码 随机森林回归器 案例代码 在前面的内容中,已经对决策树解决分类回归问题分别做了阐述,今天走进随机森林的世界. 什 ...

最新文章

  1. mysql 优化器算法_SQL 查询优化器底层原理解析【MySQL 篇】
  2. @HostListener 可接收的事件列表
  3. 如何用fiddler抓取HTTPS的详细教程(附fiddler安装教学)
  4. 全面解读Objective-C语言及Cocoa特性——《Objective-C基础教程》
  5. 批量选中删除(包含全选)---jsp,servlet
  6. linux emacs配置文件,[z]使用.emacs.d目录管理Emacs配置文件
  7. java8 循环jsonarray_JSONArray 遍历方式
  8. SpringBoot—数据库初始化脚本配置
  9. php易错,PHP学习1:几种常见数据类型及其易错点
  10. python数据存储系列教程——python对象与json字符串的相互转化,json文件的存储与读取
  11. 【bzoj4011】落忆枫音
  12. 查看远程计算机ip地址吗,我的电脑跟别人远程过可不可以查对方IP地址
  13. PyTorch模型定义和训练技巧
  14. STEP2——《数据分析:企业的贤内助》重点摘要笔记(四)——数据清洗
  15. reset.css(常用项目代码初始化)
  16. es6模块循环引用的问题
  17. 3 树莓派使用网线连接路由器获取网络
  18. python安装作业
  19. 配置LXDE快捷键锁屏
  20. MPLAB 安装 mmc 报错需要安装web相关插件

热门文章

  1. 七月学习之E6、ES7、ES8、ES9、ES10、ES11新特性
  2. C语言-- 输出大写英文字母
  3. Linux 上开通1521 端口
  4. 修复重新启动 Windows 时桌面图标布局未保存的问题
  5. OCP学习——数据库整库备份恢复实验
  6. fileinfo的作用以及如何开启fileinfo扩展
  7. 【深度学习】激活函数:原理+常见激活函数(Sigmoid\Tanh\ReLU\Leaky ReLU\Softmax)
  8. VSCode搭建 c 环境教程
  9. 客户端与服务器端的区别
  10. html 一键复制 ios,h5实现一键复制到粘贴板-兼容ios