' Y( g# O4 @) J) k2 I) {6 m
写这篇文章的原因是前段日子看了很多机器学习书籍,发现各种书籍对具体机器学习算法介绍非常详细,而在实际应用中非常重要的一环——数据预处理介绍很少或者不完整。于是整理了一下。本文主要介绍详细处理流程以及这样处理的原因,对于处理方法的原理介绍较为简略。当然,想深入了解原理可以根据这份框架深入研究思索,将框架和细节一起把握。 ) u- \. [$ n7 b* B5 @. ~$ A
数据是机器学习的原料,在把数据投入机器学习模型前,我们需要对数据进行加工。就像榨果汁,得先把水果削皮切小块了才可以投入榨汁机中,否则倒出来的连猫咪也喝不下去(不信试试┓( ´∀` )┏)。同样的,正确预处理数据对模型输出结果有非常非常非常(重要的事情说三遍)大的影响。可以说,数据预处理是机器学习落地最麻烦但最具有挑战的环节。
) n. H. E- a5 Q- [7 i* G; A4 y" I 一、数据可能存在问题- v4 e6 ^( E! Z D1 }1 @
在实际业务处理中,数据通常是脏数据。所谓的脏,指数据可能存在以下几种问题(主要问题): 数据缺失 (Incomplete) 是属性值为空的情况。如 Occupancy = “ ”2. 数据噪声 (Noisy)是数据值不合常理的情况。如 Salary = “-100”
" c# U) X& Z4 n1 @4 m 3. 数据不一致 (Inconsistent)是数据前后存在矛盾的情况。如 Age = “42” vs. Birthday = “01/09/1985”
6 g' z; V) l- T" W, E 4. 数据冗余 (Redundant)是数据量或者属性数目超出数据分析需要的情况。 + N% x) e3 y& L1 w: X- L
5. 数据集不均衡 (Imbalance)是各个类别的数据量相差悬殊的情况。 3 V8 Y$ I* x2 S3 l: w m& H
6. 离群点/异常值 (Outliers)是远离数据集中其余部分的数据。
. H- I, h. ], |3 t5 e& Y 7. 数据重复(Duplicate)是在数据集中出现多次的数据。
6 v# v, e+ ~9 X5 T: } 二、数据预处理步骤
& Z+ P& @% C. o" O7 e 数据进行预处理主要有以下步骤,第一部分提及的各种脏数据的处理就在这些步骤中完成: 数据清洗 Data Cleansing2. 数据转换 Data Transformation . z( L3 f# }8 a2 P3 e
3. 数据描述 Data Description ) d) j# K! L( b3 s7 c
4. 特征选择 Feature Selection 或特征组合 Feature Combination - g1 [+ E/ \# p$ t8 L6 C0 {
5. 特征抽取 Feature Extraction ! a( s9 n. t) @7 [ i4 N% H. ` `
在数据清洗阶段,我们处理第一部分提及的缺失数据、离群点和重复数据。 4 s( C/ f' p0 V; D% l: o( G8 \
缺失数据有以下几类: ; F0 u. C3 \* u8 n- ^; `4 Z) n
a.Missing completely at random: 缺失的概率是随机的,比如门店的计数器因为断电断网等原因在某个时段数据为空。 & m. Q2 y& T C: Z1 N P( c( d0 U4 P
b.Missing conditionally at random: 数据是否缺失取决于另外一个属性,比如一些女生不愿意填写自己的体重。
- h- ]8 E$ f- L% h c.Not missing at random: 数据缺失与自身的值有关,比如高收入的人可能不愿意填写收入。 1 Q; w! D% U. A. D9 }9 }
处理方式有以下几种: $ w, p# |; v4 p! z+ L n9 Z P: H
a. 删数据,如果缺失数据的记录占比比较小,直接把这些记录删掉完事。 * o/ D$ _3 }4 n+ e! u" N
b. 手工填补,或者重新收集数据,或者根据领域知识来补数据。
8 D& Y# _" r5 v% `) A5 j c. 自动填补,简单的就是均值填充,或者再加一个概率分布看起来更真实些,也可以结合实际情况通过公式计算,比如门店计数缺失,可以参考过往的客流数据,转化数据,缺失时段的销售额,用一个简单公式自动计算回补。
% p$ }# Q. o& B0 b' J3 u: `8 O; k5 D 离群点是远离数据集中其余部分的数据,这部分数据可能由随机因素产生,也可能是由不同机制产生。如何处理取决于离群点的产生原因以及应用目的。若是由随机因素产生,我们忽略或者剔除离群点,若是由不同机制产生,离群点就是宝贝,是应用的重点。后者的一个应用为异常行为检测,如在银行的信用卡诈骗识别中,通过对大量的信用卡用户信息和消费行为进行向量化建模和聚类,发现聚类中远离大量样本的点显得非常可疑,因为他们和一般的信用卡用户特性不同,他们的消费行为和一般的信用卡消费行为也相去甚远。还有购物网站检测恶意刷单等场景也重点对离群点进行分析。
; M$ e' z/ ?8 T3 b! R/ ? D; Q' ^% e 不论是对离群点提出还是重点研究应用,我们首先需要检测出离群点。在sklearn(一个python机器学习包)中提供了多种方法,如OneClassSVM、Isolation Forest、Local Outlier Factor (LOF)。需要进一步了解原理的可以额外看些资料。这里就不展开了。 1 y. c7 t1 K# X/ t Z
对重复数据的处理如下:如果高度疑似的样本是挨着的,就可以用滑动窗口对比,为了让相似记录相邻,可以每条记录生成一个hash key, 根据key去排序。
$ @' o* _: W( Q! ?) \! l. }+ ~ 数据清洗阶段结束后,我们得到的是没有错误的数据集了~
' q9 S; D$ s2 F7 t3 J 在数据转换阶段,我们对数据进行采样处理、类型转换、归一化。 $ d* c1 H3 b; l) ]1 F
采样是从特定的概率分布中抽取样本点的过程。采样在机器学习中有非常重要的应用:将复杂分布简化为离散的样本点;用重采样可以对样本集进行调整以更好地进行调整并适应后期的模型学习;用于随机模拟以进行复杂模型的近似求解或推理。采样的一个重要作用是处理不均衡数据集。
9 l- \. ]2 O5 Z6 y( d! B( ` 最简单的处理不均衡样本集的方法是随机采样。采样一般分为过采样(Over-sampling)和欠采样(Under-sampling)。随机过采样是从少数类样本集 S_min中有放回地随机重复抽取样本,随机欠采样是从多数类样本集S_max中随机选取较少样本。两种方法也存在问题,如随机过采样会扩大数据规模,容易造成过拟合;随机欠采样可能损失部分有用信息,造成欠拟合。为了解决上诉问题,通常在随机过采样时不是简单复制样本,而是采取一定方法生成新的样本。如使用SMOTE(Synthetic Minority Oversampling Technique)算法、Borderline-SMOTE、ADASYN等算法。对于欠采样,可以采用Informed Undersampling来解决数据丢失问题。
N. K7 Z! U7 y. s4 u& I/ t7 X PS:当总体数据量不够时,除了简化模型,我们可以借鉴随机过采样的方法,对每个类进行过采样。具体到图像任务,还可以直接在图像空间进行变换,如可以通过对图像施加一定幅度的变换(旋转、平移、缩放、裁剪、填充、翻转、添加噪声、颜色变换、改变亮度、清晰度、对比度等),得到扩充的数据集。此外,迁移学习也是在小数据集上进行建模的好方法。
7 I0 H2 z+ V& t PS:整体准确率不适用于不平衡数据集,需要引入新的度量模式比如G-mean, 它会看正类上的准确率,再看负类上的准确率,然后两者相乘取平方根。另外一种常见的度量如F-score。 & Z( k4 l6 F5 R) T9 [9 W0 s% d/ f
在类型转换处理前,我们先来看下数据的类型。
7 f* |/ p/ r, y. A 数据类型可以简单划分为数值型和非数值型。数值型有连续型和离散型。非数值型有类别型和非类别型,其中类别型特征中如果类别存在排序问题为定序型,若不存在排序问题则为定类型,非类别型是字符串型。如下所示: 连续型 ContinuousReal values: Temperature, Height, Weight …
( c3 x* _ U1 ?2 N: r; ^3 { 2. 离散型 Discrete / `' r) T( p* H
Integer values: Number of people … 1 y4 D! B. ~ \' \: Z
3. 定序型 Ordinal
% Q E+ Z: i: x k! Q; y Rankings: {Average, Good, Best}, {Low, Medium, High} …
; ]* C! M" e) N 4. 定类型 Nominal
9 L/ N, \" O4 d1 m Symbols: {Teacher, Worker, Salesman}, {Red, Green, Blue} … / j9 f( I4 k% A: }( V# x
5. 字符串型 String
" f& B$ M. G( W0 t# S) Z Text: “Tsinghua University”, “No. 123, Pingan Avenue” … ' p" v9 U2 Q% a3 r: n
对于非数值型,我们需要进行类别转换,即将非数值型转换为数值型,以方便机器学习算法后续处理。
% Z; A) e) T0 g8 w. ]+ t5 | 对于定序型,我们可以使用序号编码,如成绩,分为Average, Good, Best三档,序号编码可以按照大小关系对定序型特征赋予一个数值ID,例如Average表示为1,Good表示为2,Best表示为3,转换后依旧保留了大小关系。
* x/ u/ j G) W9 N% G; u0 Z) g, N 对于定类型,我们可以使用独热编码,如颜色三原色,为Red, Green, Blue,独热编码可以把三原色变为一个三维稀疏向量,Red表示为(0,0,1),Green表示为(0,1,0),Blue表示为(1,0,0)。需要注意的是,在类别值较多的情况下,可以使用稀疏向量来节省空间,目前大部分算法实现均接受稀疏向量形式的输入。当然还有很多别的编码方式,如二进制编码等,感兴趣的可以额外查阅资料了解。 % ~% ^5 o4 x' s4 d$ Y' V- Z
对于字符串型,我们有多种表示方式,如词袋模型(Bag of Words),TF-IDF(Term Frequency-Inverse),主题模型(Topic Model),词嵌入模型(Word Embedding)。各种表示有不同的适用场景和优缺点,需要进一步了解的可以额外查资料。 ' p& y0 Y$ q+ ^
经过类别转换后,我们所有的数据均转为了数值型。为了消除数据特征之间的量纲影响,我们需要对特征进行归一化处理,使不同指标之间具有可比性。例如,分析一个人的身高和体重对健康的影响,如果使用米(m)和千克(kg)作为单位,身高在1.6-1.8m的数值范围内,体重特征在50-100kg的数值范围内,分析出来的结果会倾向于数值差别较大的体重特征。对数值型特征进行归一化可以将所有特征都统一到一个大致相同的区间内,以便进行分析。归一化方式通常有线性函数归一化(Min-Max Scaling)和零均值归一化(Z-score Normalization)。当然,不是所有的机器学习算法需要对数值进行归一化,在实际应用中,通过梯度下降法求解的模型通常需要归一化,因为经过归一化后,梯度在不同特征上更新速度趋于一致,可以加快模型收敛速度。而决策树模型并不需要,以C4.5为例,决策树在节点分裂时主要依据数据集D关于特征x的信息增益比,而信息增益比跟特征是否经过归一化是无关的。
1 k# W3 w) X8 m 在数据描述阶段,我们可以根据需要计算统计量和对数据进行可视化。
0 }) s) R: {6 E 数据的一般性描述有mean, median, mode, variance. % l$ D9 D% z* ^& u( A- O0 {, e6 U
mean是均值;median是中位数,取数据排序后在中间位置的值,避免因为极端离群点影响客观评价;mode是出现频率最高的元素,其实用的比较少;variance是方差衡量数据集与其均值的偏离。 ! Z V7 P" P% }# f- D9 x
数据之间的相关性可以使用Pearson correlation coefficient和Pearson chi-square进行度量。前者适用与有metric data的情况,后者适用于分类统计的情况。
# E6 b6 P1 {; H' E1 X 数据可视化一维数据圆饼图,柱状图;二维数据散点图;三维数据用三维坐标呈现;高维数据需要先做转换或映射,比如用matlab的Box Plots,也可以用平行坐标呈现。可使用工具有很多,如matlab和Geph。 4 H1 o$ m6 U) w0 b: t
当我们做特定分析的时候,可能属性非常多,但有些属性是不相关的,有些属性是重复的,所以我们需要用特征选择挑选出来最相关的属性降低问题难度。
( ~- v5 [3 J# }; x 我们可以通过熵增益(Entropy Information Gain)、分支定界(Branch and Bound)等方式进行特征选择。特征选择还有sequential forward, sequential backward, simulated annealing(模拟退火), tabu search(竞技搜索), genetic algorithms(遗传算法)等方式去优化。 # f# e6 M+ P9 [& s! e6 x g
为了提高复杂关系的拟合能力,在特征工程中经常会把一些离散特征两两组合,构成高阶特征。如在点击率预测问题中,原始数据有语言和类型两种特征,为了提高拟合能力,语言和类型可以组合成二阶特征,联合预测对点击率的影响。如何找到有意义的组合特征?有一种方法是基于决策树的组合特征寻找方法。 3 U5 S. ~2 m* C3 x2 i* X( T. ]
在机器学习中,数据通常需要表示为向量的形式进行训练,但是在对高维向量进行处理和分析时,会极大消耗系统资源,甚至产生维度灾难。因此,使用低维度的向量来表示高维度的向量就十分必要。特征抽取或降维即使用低纬度向量表示高维度向量的方法。
7 k3 M8 j2 |. b6 o# H% j* e. R# }2 t 特征抽取是主要有主成分分析(Principal Component Analysis,PCA)和线性判别分析(Linear Discriminant Analysis,LDA)两种方式。两者相同之处为均假设数据服从高斯分布,都使用了矩阵分解的思想。两者不同之处为PCA是无监督的算法,对降低后的维度无限制,其目标为投影方差最大;LDA是有监督的算法,降维后的维度小于类别数,其目标为类内方差最小,类间方差最大。 - j! t" q& l) A2 r$ q: p7 o0 F
以上为数据预处理的步骤,希望对正在进行实操的朋友有所帮助。
( E |# v, { M1 |8 u3 U! x H! E Reference 袁博. 清华大学《数据挖掘:理论与算法》课件,学堂在线。Jeru_d39e. 数据挖掘:理论与算法笔记.诸葛越等.《百面机器学习:算法工程师带你去面试》.胡欢武.《机器学习基础:从入门到求职》.高扬,卫峥, 尹会生等. 《白话大数据与机器学习》.5 H! l7 W4 M7 C; e) A7 B3 b
9 J6 _8 I. j1 y0 l$ d. Y; f/ B
! e' ]( H* x y7 o1 d6 m) V% w5 p. ]9 [' X+ N& Q
, t3 w6 N0 z! Z. w, b |