轉載: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