导航

缺失值填充的算法:树模型

Posted on 2018-10-02 10:36  wzd321  阅读(1981)  评论(0编辑  收藏  举报

转载:https://www.toutiao.com/i6606293133602849284/

转载:https://blog.csdn.net/Q2605894893/article/details/81327027

一般的缺失值填充方法:

连续变量:中位数、平均数

离散变量:众数

上述的方法会造成数据集本身分布的改变,引入更多偏差。另外的一种方式是利用模型学习数据集本身的结构:K-means插值、混合高斯插值等,下面我们介绍一种树模型的方法:

def fill_missing_value_by_rf(feat_ls=[],miss_name="",df):
    #一般不将标签列作为特征,因为预测集中没有标签
    #本问题可以分为全部没有缺失值的数据作为训练集,缺失列没有缺失值的数据作为训练集
    """
    param feat_ls:list,全部的特征名称列表或者想要利用的特征名称列表
    param miss_name:str,需要填充缺失值的列名
    param df :DataFrame,数据集
    return :    
    df:DataFrame, 填充了缺失值的数据集
    rf:isinstance,训练后的模型
    """
    
    df_feature = df[feat_ls]    
    #按照需要填充缺失值的列分成两部分:
    #一部分没有缺失(作为训练集),一部分有缺失(作为预测集)
    
    not_null_df = df_feature[df_feature[miss_name].notnull()]
    is_null_df  = df_feature[df_feature[miss_name].isnull()]
    
    #分割训练集的特征和目标
    feat_ls_copy = feat_ls.copy()
    
    X_train = not_null_df[feat_ls_copy.remove(miss_name)]
    y_train = not_null_df[miss_name]
    
    #from sklearn.ensemble import RandomForestClassifier
    from sklearn.ensemble import RandomForestRegressor
    
    rf = RandomForestRegressor(random_state=0,n_estimators=1000,n_jobs=-1)
    rf.fit(X_train.values,y_train.values)
    
    #用得到的预测结果填补原缺失数据    
    df.loc[(df[miss_name].isnull()),miss_name]=rf.predict(is_null_df[feat_ls_copy])
    
    return df,rf