数据清洗一是为了解决数据质量问题,二是让数据更适合做挖掘
数值类数据
缺失值
在处理缺失值之前,首先要理解为什么数据会有缺失。
丢弃
直接丢弃含有缺失值的行或者列
# 丢弃有缺失值的列
df.dropna(axis=1,how='all'|'any',subset=[''])
适用情况
- 错误导致的数据缺失(GSP中跑步速度的缺失)
- 要建模预测的数据列有数据缺失
- 无用数据(调查车辆的价格,要排除无车的样本)
缺点
- 经常丢弃数据会导致Biased Models
- 人们不愿意分享的敏感数据(亲密关系、经济情况)导致缺失,如果直接丢弃会影响模型效率
特殊情况
如果一列中有大量数据缺失,可以建立一个只含01的列,来区分样本是否有数据缺失
插值
用统计值(平均数、众数、中位数)填充缺失值
# 冒号:之前的a,b,c表示它们是这个函数的参数
# 匿名函数不需要return来返回值,表达式本身结果就是返回值
fill_mean = lambda col: col.fillna(col.mean())
df[['A','B','D']].apply(fill_mean, axis=0)
无论采用什么方法来插值,都需要小心Bias。尽管插值是一种常用的方法而且能让模型有更好的预测效果,但常常会导致模型过拟合。
建模预测
AMELIA library中包含很多运用机器学习和贝叶斯统计的方法来填补缺失值的方法
目录类数据
One-Hot Encoding
有多少个状态就有多少比特,而且只有一个比特为1,其他全为0的一种码制。
for col in cat_cols:
df = pd.concat([df.drop(col,axis=1),pd.get_dummies(df[col],prefix=col,dummy_na=dummy_na,drop_first=True)],axis=1)
好处
- 易于翻译
- 使非偏序关系的变量取值不具有偏序性
缺点
- 特征空间会变得非常大(可用PCA来减少维度)
特殊情况
[用回归模型时要少编码一类](