利用随机森林填补缺失值

  • 介绍
  • 利用随机森林填补缺失值

介绍

说到缺失值,我想各位在进行数据分析之前或多或少都是会遇到的。在做有关机器学习的项目的时候,出题人都是会给你一个好几万好几十万的数据,可能会出现很多的缺失值。填补缺失值的方法其实有很多,利用pandas自带的fillnan,replace方法,使用sklearn.impute的SimpleImputer等都是可以填补的,在这里主要是介绍使用随机森林来进行填补缺失值。

利用随机森林填补缺失值

利用随机森林进行填补缺失值的思想:随机森林是进行回归的操作,我们可以把那些包含缺失值的列当作标签,如果是很多列都有缺失值,那么就要按照每一列的缺失值的从小到大来填补(因为这样子的话,正确率会更加高一些,因为缺失值少的那个对特征等的要求更加低一些),然后在将剩下和原本就已经给的标签组成新的特征矩阵(一般情况下,最开始的标签是不会有缺失值的),在这个特征矩阵里面,将缺失值利用numpy,pandas或者sklearn的impleImputer填补为0,因为0对数据的影响比较小。接着就是将取出的那个新的标签列,按照有没有缺失值分为Ytrain和Ytest,同样的道理,按照新标签列有缺失值所在的行的位置,将新的特征矩阵分为Xtrain和Xtest,然后就可以利用RandomForestRegressor()来进行训练和预测,利用predict接口来得到最后的Y,其实在前面的Ytest并没有用处,只是来确定所在的行而已。在这里的predict出来的就是要填补的内容,将它把Ytest覆盖就可以了。如果有缺失值的列很多的话,就可以使用循环,不断的预测就可以了。最后所填补的缺失值的正确率要远比利用0填补,均值填补,中位数填补,最多数填补的高。

接下要使用的数据可以在链接下载:https://pan.baidu.com/s/1pfGMHUxiAx__FSEnbv-OXg
提取码:ko12

import pandas as pd
data = pd.read_excel(r'datasets.xlsx',sheet_name = 2)#在这里的是xlsx文件,我们要使用pd.read_excel方法

下面的这个就是数据

随机森林填补缺失值 python 随机森林填补缺失值r_机器学习

data.info()

信息如下

随机森林填补缺失值 python 随机森林填补缺失值r_数据分析_02


这里导入所有要使用到的包

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

为了安全,先使用copy()方法来复制一个副本进行操作

data_copy = data.copy()

在这里的data_copy是data.copy()来的,在这里很明显发现,第一列是object的,而且不需要进行填补,进行删除。

data_copy.drop(data_copy.columns[0], axis=1, inplace=True)
sindex = np.argsort(data_copy.isnull().sum()).values

上面的这个代码就是对那个进行了从小到大排序,并且是返回的所对应的列号而不是列名,这里的np.argsort就是一个从小到大的排序,不过不同于sort等,这个是返回的是列号,然后使用values得到其中的内容放入sindex中,还要介绍的是,我们都知道在python里面False和True用数字表示分别是0和1,在上面的代码里面就是使用这个特性,得到总和进行排序。
接下来的代码就是核心所在

# 进行缺失值的填补,利用随机森林进行填补缺失值
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,:]
    
    rfc = RandomForestRegressor()
    rfc.fit(Xtrain, Ytrain)
    Ypredict = rfc.predict(Xtest)
    
    data_copy.loc[data_copy.iloc[:,i].isnull(),data_copy.columns[i]] = Ypredict

上面就是前面的思想的代码体现,如果看懂了前面的思想的,在这里应该是很好理解的。

接着可以使用下面的代码来进行查看是否还具有缺失值。

data_copy.isnull().sum()

运行结果如下

随机森林填补缺失值 python 随机森林填补缺失值r_机器学习_03


可以看到上面全部都是为0了,所有都填补好了,可以看一下填补之后的数据。

随机森林填补缺失值 python 随机森林填补缺失值r_python_04


看上去还不错,哈哈,好了这个方法就介绍到这里了,如果有任何问题欢迎批评指教。还有在我分享的文件中还有其它的数据,感兴趣的可以使用这个在对其它的数据进行缺失值填补哦,最后感谢查看我的博客。