1. nan 的处理
先讲一个真事:
在 Kaggle 的一个竞赛里面,是要求预测哪些大学的基金项目会得到批复而那些不会。随后一个参赛者通过其中某一列的 nan 与否特征的预测,得到了金奖。事后证明,这个学校在填入资料的时候,如果这项基金不会被批复,那么他们就不会继续填入更多信息。因此 nan 的填写与否反而由于 data leakage 的原因成为了这个竞赛里面最重要的特征。
但是呢,nan 又没有办法直接喂给机器学习模型。因此我们可以针对所有的数据列,做如下操作:
1. 选取所有的 数字列;
2. 如果该列的 nan 数目大于 1,则填充 fillna 为该列均值,或者任意制定数值;
3. 在整个 dataframe 后加入一列,记录该列的 nan 的 True/False 情况;
def fill_na(df, na_data={}): cols = df.select_dtypes(include='number') for col in cols: if df[col].isnull().sum() > 0: df[col+'_na'] = df[col].isnull() fillna = na_data[col] if col in na_data else df[col].median() df[col].fillna(fillna, inplace=True) %time fill_na(df_cat)