为什么要用随机森林对缺失值填补!
- 缺失值的填充往往会训练的结果,在闲时不妨尝试多种填充然后比较结果选择结果最优的一种;
- 多学一点又不会死。
随机森林填充缺失值优点
- 随机森林填补通过构造多棵决策树对缺失值进行填补,使填补的数据具有随机性和不确定性,更能反映出这些未知数据的真实分布;
- 由于在构造决策树过程中,每个分支节点选用随机的部分特征而不是全部特征,所以能很好的应用到高维数据的填补;
- 随机森林算法本身就具有很好的分类精度,从而也更进一步确保了得到的填补值的准确性和可靠性。
开始!冲!
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]})
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,如果有不足的地方请指教,谢谢