Capture 1
在机器学习的工作流中,数据清洗环节尤为重要。接下来首先让我们看一下数据预处理的流程图。
总的来说,主要包含下面三大块:
- 收集数据
- 标注数据
- 提升数据质量
Capture 2
NO.1 Data Errors
所谓数据错误,就是你收集到的数据和实际的数据之间存在不一致。
- 数据实际上是存在的,但是在数据表里是missing了
- 数据的极值超出其所属的范围,例如房价不能小于0,但是在数据表却存在负数。
虽然数据存在存在错误无可避免,但是一个好的机器学习模型能够容忍这些错误的存在,同样能够训练+收敛。但是,通常计算出来结果的精度会比干净的数据低一些。
在实际项目中,如果我们不知道原本的数据能达到最好的效果是多少,这样子我们就没有衡量数据好坏的指标。但是呢,一个良好的数据质量能够训练出一个好的模型,在面对新的数据具有更强的泛化能力。
NO.2 Type of Data Errors
- Outliers:离群点,即某些数据不在正常数据分布的范围内。
- Rule violations:即某些数据不满足规则所规定的范围。比如说用ID必须是唯一的,但是存在重复;再比如说有些标签它是一个空值等等。
- Pattern violations:即数据的格式,语法等等硬性表达方式不对。这种情况在程序运行时容易出现bug。比如你的数据格式是’xx-xx’,但是有些错误的格式是’xx@xx’;或者数值的类型不对应,如毫米mm替换成米m。
Outlier Detection
对于离群点,我们要分两种数据类型进行检测:
- category feature:在面对类型特征时,我们会用
data[feats].value_counts()
即将类别特征里面所有的类别数据都打印出来,看看是否存在某些种类的数据是否过于稀疏,能否将这些稀疏的数据合并在一起处理(如下图中的某些种类的数据只有数十次的出现频次)。又或者某些种类的数据是否从属于某个大类,只是表达形式不一样(如下图中Single Family被划分了几种表达方式,但其实他们所要表达的意思是一样的,可以将其合并为一类)。
- numerical feature:在面对数值特征时,我们会用
boxplot=df.boxplot()
即使用箱型图的方法,表达所有数据的分布情况。如下图所示,可以看到离群点数值都超出极值的1.5倍(这里的1.5倍的阈值可以根据实际情况而定)。
Rule-based Detection
对于规则类的检测,主要分为以下两大类:
- Functional dependencies,即一个x总会对应一个唯一的y,比如说你的邮政编码能够一一对应你所处的地理位置。如果是一对多的情况,这时候就要检查数据是否存在依赖错误。如果不满足依赖条件,要么就把这条样本删掉,要么就手动fix。
- Denial constraints,即根据一个规则或者函数function来约束数据。比如,如果你有家庭地址,那么就一定会有你个人的邮政编码;比如你指定了用户的ID是唯一的,如果出现了重复ID的情况,就考虑去掉重复样本。
Pattern-based Detection
对于模式类的检测,主要分类两大类:
- Syntactic patterns,即语法模式,比如说某个特征的英文规定是大写,如果出现小写,就会有语义错误。再比如说规定整数型的数据,但是出现了float型,这时候就考虑拿掉或者手动fix。
- Semantic patterns,语义模式,比如某列特征是首都,但是数据中存在某个乡镇的名称,这时候就会存在语义上的错误。
Summary
- Type of errors: Outliers, rules violations, pattern violations.
- 错误数据的检测方法:查看数据的分布,制定相应的规则或者语法来排查错误数据