为什么要用随机森林对缺失值填补!

  • 缺失值的填充往往会训练的结果,在闲时不妨尝试多种填充然后比较结果选择结果最优的一种;
  • 多学一点又不会死。

随机森林填充缺失值优点

  • 随机森林填补通过构造多棵决策树对缺失值进行填补,使填补的数据具有随机性和不确定性,更能反映出这些未知数据的真实分布;
  • 由于在构造决策树过程中,每个分支节点选用随机的部分特征而不是全部特征,所以能很好的应用到高维数据的填补;
  • 随机森林算法本身就具有很好的分类精度,从而也更进一步确保了得到的填补值的准确性和可靠性。

开始!冲!

import numpy as np
import pandas as pd
from sklearn.impute import SimpleImputer
from sklearn.ensemble import RandomForestRegressor

1.创建数据特征矩阵

data = pd.DataFrame({'id':[1,np.nan,np.nan,np.nan,5,6],'name':[22,np.nan,12,22,377,200],'math':[90,np.nan,99,78,97,np.nan],'english':[89,np.nan,80,94,94,90]})

注意:
在创建数据的时候就把缺失值填到里面了,模拟数据已经存在缺失值

2.创建标签

target = pd.DataFrame({'lable':[1,0,1,1,1,0]})

spss随机森林填充缺失值 随机森林填补缺失值_数据分析

3.根据缺失值的多少对对列名进行升序

sortindex = data.isnull().sum().sort_values().index
sortindex = list(sortindex)
sortindex

[‘name’, ‘english’, ‘math’, ‘id’]

4.开始填充

for i in sortindex:
    #构建新特征和新标签
    df = data
    fillc = df.loc[:,i]
    df = pd.concat([df.loc[:,df.columns != i],target],axis=1)
                                            # target 标签

    
    #在新特征中,对有缺失值的列,用0填补 df_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=50) 
    rfc = rfc.fit(Xtrain, Ytrain)
    Ypredict = rfc.predict(Xtest)
  
    #将填补好的特征返回到我们的原始的特征中
    data.loc[data.loc[:,i].isnull(),i] = Ypredict

5.填充完成

查看缺失值情况

data.isnull().sum()

id 0
name 0
math 0
english 0
dtype: int64

注意:

  • 1.数据表中必须每一列都得存在缺失值,不然会报错,在实战下可以把存在缺失的字段截下来就可以了,不懂就私聊我
  • 2.n_estimators:树的数量,不是越大就越好,但占用的内存与训练和预测的时间也会相应增长,在可承受的内存/时间内选取尽可能大的n_estimators

希望能够帮助到您,如果可以的话点个赞8,如果有不足的地方请指教,谢谢