一.画图查看缺失值分布情况
方法1
import missingno as msno # pip install missingno msno.matrix(train_data);
方法2
缺失值高亮
# matplotlib画缺失值 plt.imshow(train_data.isna(),aspect='auto');
二. 缺失值处理方式
依据业务逻辑和缺失值占比,目标保证对预测结果影响越小越好
1. 占比较多:如80%以上,删除缺失值所在列(如果对字段有特殊需求,那就删除样本,前提是样本足够多)
# 删除NOD缺失值样本 train_data.dropna(inplace=True)
train_data.shape
2. 占比一般:30%-80%,将缺失值作为单独的类
3. 占比少:10%-30% , 多重插补:通过特征进行相互间的预测
随机森林回归填补(连续性数据)
方法1
# 多重插补:随机森林回归器填补 from sklearn.ensemble import RandomForestRegressor def fill_missing(data,to_fill): ''' data:数据集 to_fill:需要填补的特征列 ''' # 构建新的特征和标签 df = data.copy() columns = [*train_data.columns] columns.remove(to_fill) # 将需要预测的标签移除 # 移除有缺失值的列 columns.remove('NumberOfDependents') # 提取特征和标签,并划分训练集和测试集,训练集指的是月收入中没有缺失值的样本,测试集指的是需要预测的缺失值的样本 X = df.loc[:,columns] # 特征 y = df.loc[:,to_fill] # 标签 Xtrain = X.loc[df[to_fill].notnull()] # 训练数据 Xtest = X.loc[df[to_fill].isnull()] # 测试数据 Ytrain = y.loc[df[to_fill].notnull()] model = RandomForestRegressor(n_estimators=200,max_depth=3,n_jobs=-1,random_state=0) model.fit(Xtrain,Ytrain) # 预测 pred = model.predict(Xtest).round() # 进行填补 df.loc[df[to_fill].isnull(),to_fill] = pred return df train_data = fill_missing(train_data,'MonthlyIncome') train_data.info()
方法2
# 方法二:用随机森林对缺失值预测填充函数 def set_missing(df): # 把已有的数值型特征取出来 process_df = df.iloc[:,[5,0,1,2,3,4,6,7,8,9]] # 分成已知该特征和未知该特征两部分 known = process_df[process_df.MonthlyIncome.notnull()] unknown = process_df[process_df.MonthlyIncome.isnull()] # X为特征属性值 X = known.iloc[:, 1:] # y为结果标签值 y = known.iloc[:, 0] # fit到RandomForestRegressor之中 rfr = RandomForestRegressor(random_state=0, n_estimators=200,max_depth=3,n_jobs=-1)#,n_jobs=- 根据CPU的性能进行 rfr.fit(X,y) # 用得到的模型进行未知特征值预测 predicted = rfr.predict(unknown.iloc[:, 1:]).round(0) # print(predicted) # 用得到的预测结果填补原缺失数据 df.loc[(df.MonthlyIncome.isnull()), 'MonthlyIncome'] = predicted return df
分类型数据用卡方或者分箱
4. 占比较少:10%以上,单一值替换:中位数(连续型)、均值(连续性)、众数(分型型)
左偏右偏,用中位数
正太分布用均值
分类型变量用众数
5. 在决策树中可以将缺失值处理融合到算法中:按比重分配