随机森林填充缺失值
前言:
任何回归都是从特征矩阵中学习,然后求解连续性标签y的值,之所以能实现这个过程,是因为回归算法认为,特征矩阵和标签之前存在着某种关系,实际上特征和标签是可以相互转化的,比如说用地区,环境,附近学校数量预测房价的问题,我们既可以用地区,环境,附近学校数量的数据来预测房价,也可以反过来,用环境,附近学校数量和房价来预测地区,而回归填补缺失值,正式利用了这种情况。

非常使用与一个特征大量数据缺失,其他特征却很完整的情况。

def fill_missing_rf(X,y,to_fill):

    """
    使用随机森林填补一个特征的缺失值的函数

    参数:
    X:要填补的特征矩阵
    y:完整的,没有缺失值的标签
    to_fill:字符串,要填补的那一列的名称
    """

    #构建我们的新特征矩阵和新标签
    df = X.copy()
    fill = df.loc[:,to_fill]
    df = pd.concat([df.loc[:,df.columns != to_fill],pd.DataFrame(y)],axis=1)

    # 找出我们的训练集和测试集
    Ytrain = fill[fill.notnull()]#特征不缺失的值
    Ytest = fill[fill.isnull()]#特征缺失的值
    Xtrain = df.iloc[Ytrain.index,:]#特征不缺失的值对应其他n-1个特征+本来的标签
    Xtest = df.iloc[Ytest.index,:]#特征缺失的值对应其他n-1个特征+本来的标签

    #用随机森林回归来填补缺失值
    from sklearn.ensemble import RandomForestRegressor as rfr
    rfr = rfr(n_estimators=100)
    rfr = rfr.fit(Xtrain, Ytrain)
    Ypredict = rfr.predict(Xtest)

    return Ypredict
X = data.iloc[:,1:]
y = data["SeriousDlqin2yrs"]#y = data.iloc[:,0]
X.shape#(149391, 10)

#=====[TIME WARNING:1 min]=====#
y_pred = fill_missing_rf(X,y,"MonthlyIncome")

#注意可以通过以下代码检验数据是否数量相同
# y_pred.shape ==  data.loc[data.loc[:,"MonthlyIncome"].isnull(),"MonthlyIncome"].shape

#确认我们的结果合理之后,我们就可以将数据覆盖了
data.loc[data.loc[:,"MonthlyIncome"].isnull(),"MonthlyIncome"] = y_pred

data.info()

问题:对于一个特征缺失,其他特征也有缺失值怎么办?

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

python用随机森林预测填补缺失值 随机森林缺失值填充_数据