利用随机森林填补缺失值
- 介绍
- 利用随机森林填补缺失值
介绍
说到缺失值,我想各位在进行数据分析之前或多或少都是会遇到的。在做有关机器学习的项目的时候,出题人都是会给你一个好几万好几十万的数据,可能会出现很多的缺失值。填补缺失值的方法其实有很多,利用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方法
下面的这个就是数据
data.info()
信息如下
这里导入所有要使用到的包
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()
运行结果如下
可以看到上面全部都是为0了,所有都填补好了,可以看一下填补之后的数据。
看上去还不错,哈哈,好了这个方法就介绍到这里了,如果有任何问题欢迎批评指教。还有在我分享的文件中还有其它的数据,感兴趣的可以使用这个在对其它的数据进行缺失值填补哦,最后感谢查看我的博客。