转载自知乎“宋城”的《最全面的数据预处理介绍》一文
本文主要介绍详细处理流程以及这样处理的原因,对于处理方法的原理介绍较为简略。当然,想深入了解原理可以根据这份框架深入研究思索,将框架和细节一起把握。
数据是机器学习的原料,在把数据投入机器学习模型前,我们需要对数据进行加工。就像榨果汁,得先把水果削皮切小块了才可以投入榨汁机中,否则倒出来的连猫咪也喝不下去。同样的,正确预处理数据对模型输出结果有非常大的影响。可以说,数据预处理是机器学习落地最麻烦但最具有挑战的环节。
在实际业务处理中,数据通常是脏数据。所谓的脏,指数据可能存在以下几种问题(主要问题):
数据缺失 (Incomplete):是属性值为空的情况。如 Occupancy = “ ”
数据噪声 (Noisy):数据值不合常理的情况。如 Salary = “-100”
数据不一致 (Inconsistent):数据前后存在矛盾的情况。如 Age = “42” vs. Birthday = “01/09/1985”
数据冗余 (Redundant):数据量或者属性数目超出数据分析需要的情况。
数据集不均衡 (Imbalance):各个类别的数据量相差悬殊的情况。
离群点/异常值 (Outliers):远离数据集中其余部分的数据。
数据重复(Duplicate):在数据集中出现多次的数据。
数据进行预处理主要有以下步骤,第一部分提及的各种脏数据的处理就在这些步骤中完成:
在数据清洗阶段,我们处理第一部分提及的缺失数据、离群点和重复数据。
1)缺失数据分为以下几类:
Missing completely at random:缺失的概率是随机的,比如门店的计数器因为断电断网等原因在某个时段数据为空。
Missing conditionally at random:数据是否缺失取决于另外一个属性,比如一些女生不愿意填写自己的体重。
Not missing at random:数据缺失与自身的值有关,比如高收入的人可能不愿意填写收入。
2)处理方式:
删数据:如果缺失数据的记录占比比较小,直接把这些记录删掉完事。
手工填补 / 重新收集数据 / 根据领域知识来补数据。
自动填补:简单的就是均值填充,或者再加一个概率分布看起来更真实些,也可以结合实际情况通过公式计算,比如门店计数缺失,可以参考过往的客流数据,转化数据,缺失时段的销售额,用一个简单公式自动计算回补。
1)概念、种类及处理方式:
离群点即远离数据集中部分的其余数据,这部分数据可能由随机因素产生,也可能是由不同机制产生,如何处理取决于离群点的产生原因以及应用目的。
2)检测离群点的方法:
在sklearn
(一个python
机器学习包)中提供了多种方法,如OneClassSVM、Isolation Forest、Local Outlier Factor (LOF)。需要进一步了解原理的可以额外看些资料。这里就不展开了。
如果高度疑似的样本是挨着的,就可以用滑动窗口对比,为了让相似记录相邻,可以每条记录生成一个hash key, 根据key去排序。
数据清洗阶段结束后,我们得到的是没有错误的数据集了。在数据转换阶段,我们对数据进行采样处理、类型转换、归一化。
采样是从特定的概率分布中抽取样本点的过程。采样在机器学习中有非常重要的应用:
PS:整体准确率不适用于不平衡数据集,需要引入新的度量模式比如G-mean, 它会看正类上的准确率,再看负类上的准确率,然后两者相乘取平方根。另外一种常见的度量如F-score。
采样一般分为过采样(Over-sampling)和欠采样(Under-sampling):
两种方法也存在问题:
为了解决上诉问题,通常采取以下措施:
Informed Undersampling采样技术主要有两种方法分别是EasyEnsemble算法和BalanceCascade算法。
- EasyEnsemble算法:此算法类似于随机森林的Bagging方法,它把数据划分为两部分,分别是多数类样本和少数类样本,对于多数类样本,通过n次有放回抽样生成n份子集,少数类样本分别和这n份样本合并训练一个模型,这样可以得到n个模型,最终的模型是这n个模型预测结果的平均值。
- BalanceCascade算法:是一种级联算法,将若干个强分类器由简单到复杂排列,只有和少数类样本特征比较接近的才有可能输入到后面的分类器,比如边界点,因此能更充分地利用多数类样本的信息,一定程度上解决随机欠采样的信息丢失问题。
当总体数据量不够时,除了简化模型,我们可以借鉴随机过采样的方法,对每个类进行过采样,以扩充数据。具体到图像任务,还可以直接在图像空间进行变换,如可以通过对图像施加一定幅度的变换(旋转、平移、缩放、裁剪、填充、翻转、添加噪声、颜色变换、改变亮度、清晰度、对比度等),得到扩充的数据集。此外,迁移学习也是在小数据集上进行建模的好方法。
在类型转换处理前,我们先来看下数据的类型。数据类型可以简单划分为数值型和非数值型:
各类型示例如下:
对于非数值型,我们需要进行类别转换,即将非数值型转换为数值型,以方便机器学习算法后续处理。具体处理方式如下:
经过类别转换后,我们所有的数据均转为了数值型。为了消除数据特征之间的量纲影响,我们需要对特征进行归一化处理,使不同指标之间具有可比性。
例如,分析一个人的身高和体重对健康的影响,如果使用米(m)和千克(kg)作为单位,身高在1.6-1.8m的数值范围内,体重特征在50-100kg的数值范围内,分析出来的结果会倾向于数值差别较大的体重特征。对数值型特征进行归一化可以将所有特征都统一到一个大致相同的区间内,以便进行分析。归一化方式通常有:
当然,不是所有的机器学习算法需要对数值进行归一化,在实际应用中:
在数据描述阶段,我们可以根据需要计算统计量和对数据进行可视化。
(1)数据的一般性描述有:
(2)数据之间的相关性描述可以使用:
(3)数据可视化描述:
当我们做特定分析的时候,可能属性非常多,但有些属性是不相关的,有些属性是重复的,所以我们需要用特征选择挑选出来最相关的属性降低问题难度。
我们可以通过熵增益(Entropy Information Gain)、分支定界(Branch and Bound)等方式进行特征选择。特征选择还有sequential forward, sequential backward, simulated annealing(模拟退火), tabu search(竞技搜索), genetic algorithms(遗传算法)等方式去优化。
为了提高复杂关系的拟合能力,在特征工程中经常会把一些离散特征两两组合,构成高阶特征。如在点击率预测问题中,原始数据有语言和类型两种特征,为了提高拟合能力,语言和类型可以组合成二阶特征,联合预测对点击率的影响。如何找到有意义的组合特征?有一种方法是基于决策树的组合特征寻找方法。
在机器学习中,数据通常需要表示为向量的形式进行训练,但是在对高维向量进行处理和分析时,会极大消耗系统资源,甚至产生维度灾难。因此,使用低维度的向量来表示高维度的向量就十分必要。特征抽取或降维即使用低纬度向量表示高维度向量的方法。
特征抽取是主要有两种方式:
两者相同之处为均假设数据服从高斯分布,都使用了矩阵分解的思想。两者不同之处为
以上为数据预处理的步骤,希望对正在进行实操的朋友有所帮助。