缺失值处理
变量中如果有缺失值,针对缺失值有四种情况:
1.缺省值极多:若缺省值样本占总数比例极高,直接舍弃,因为作为特征加入反而会引入噪声值。
2.缺省值极多:若缺省值样本占总数比例极高,直接舍弃,因为作为特征加入反而会引入噪声值。非连续特征缺省值适中:如果缺值的样本适中,而该属性非连续值特征属性,就把NaN作为一个新类别,加入到类别特征中。
3.连续特征缺省值适中:如果缺值的样本适中,考虑给定一个step,然后离散化,将NaN作为一个type加入到属性类目中。
4.缺省值较少:考虑利用填充的办法进行处理。其中有均值、众数、中位数填充;用sklearn里的RandomForest模型去拟合数据样本训练模型,然后去填充缺失值;拉格朗日插值法。
MonthlyIncome(月收入)及NumberOfDependents(家属数量)两个变量出现了缺失值。由于MonthlyIncome缺失值达到29731条数据,比例较大,因此不能直接将缺失值删除,选择随机森林法。而NumberOfDependents的缺失较少,对数据影响不大,因此直接删除。
使用dropna()函数删除空值,使用drop_duplicates()删除重复值。
def set_missing(df):
# 把已有的数值型特征取出来
process_df = df.iloc[:,[6,1,2,3,4,5,7,8,9,10]]
# 分成已知该特征和未知该特征两部分
known = process_df[process_df.MonthlyIncome.notnull()].values
unknown = process_df[process_df.MonthlyIncome.isnull()].values
# X为特征属性值
X = known[:, 1:]
# y为结果标签值
y = known[:, 0]
# fit到RandomForestRegressor之中
rfr = RandomForestRegressor(random_state=0, n_estimators=200,max_depth=3,n_jobs=-1)
rfr.fit(X,y)
# 用得到的模型进行未知特征值预测
predicted = rfr.predict(unknown[:, 1:]).round(0)
print(predicted)
# 用得到的预测结果填补原缺失数据
df.loc[(df.MonthlyIncome.isnull()), 'MonthlyIncome'] = predicted
return df