处理缺失数据

使用 PySpark 进行特征工程

John Hogue

Lead Data Scientist, General Mills

数字时代数据为何会缺失?

数据收集

  • 传感器故障

数据存储规则

  • 2017-01-01 与 January 1st, 2017

合并异构数据

  • 月度到周度

有意缺失

  • 隐私考虑

缺失

使用 PySpark 进行特征工程

缺失类型

完全随机缺失(MCAR)

  • 缺失是完全随机的子集

条件随机缺失(MAR)

  • 基于其他观测条件性随机缺失

非随机缺失(MNAR)

  • 因采集方式导致缺失
使用 PySpark 进行特征工程

评估缺失值

何时丢弃含缺失的行?

  • 缺失很少见
  • 完全随机缺失

isNull()

  • 若当前表达式为 null,则为 True。
df.where(df['ROOF'].isNull()).count()
765
使用 PySpark 进行特征工程

可视化缺失值

# Import library
import seaborn as sns

# subset the dataframe sub_df = df.select(['ROOMAREA1'])
# sample the dataframe sample_df = sub_df.sample(False, .5, 4)
# Convert to Pandas DataFrame pandas_df = sample_df.toPandas()
# Plot it sns.heatmap(data=pandas_df.isnull())
使用 PySpark 进行特征工程

缺失值热图

缺失值热图

使用 PySpark 进行特征工程

缺失值填补

替换缺失值的流程

基于规则

  • 依据业务规则设值

基于统计

  • 用均值、中位数等

基于模型

  • 用模型预测取值
使用 PySpark 进行特征工程

缺失值填补

** fillna(value, subset=None)

  • value 用于替换缺失的值
  • subset 要替换缺失值的列名列表
# 用 0 替换缺失值
df.fillna(0, subset=['DAYSONMARKET'])
# 用该列的均值替换
col_mean = df.agg({'DAYSONMARKET': 'mean'}).collect()[0][0]
df.fillna(col_mean, subset=['DAYSONMARKET'])
使用 PySpark 进行特征工程

开始练习吧!

使用 PySpark 进行特征工程

Preparing Video For Download...