数据预处理-缺失值
一.画图查看缺失值分布情况
方法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. 在决策树中可以将缺失值处理融合到算法中:按比重分配
相关推荐
yangkang 2020-11-09
lbyd0 2020-11-17
KANSYOUKYOU 2020-11-16
wushengyong 2020-10-28
腾讯soso团队 2020-11-06
Apsaravod 2020-11-05
PeterChangyb 2020-11-05
gyunwh 2020-11-02