转载: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