- b' \! K" A8 N1 t5 r8 ]
从网络上搜集来的原始数据(raw data)里面会存在很多错误,包括手工录入错误和系统自动产生的错误等等。
$ l: T) u) _$ Q- |; B, j 数据净化和预处理(Data preparation & wrangling)就是为了把这些带错误的、不精准的干数据(raw data)转化成可以输入模型的形式(consolidated format)。 ! U7 I! c5 z R r% L
传统数据的数据清洗(Data Cleansing/ Preparation)( V3 }" Y7 [ H& c8 f5 A
【】中的颜色为图例中相关需清洗的数据类型。 - ?; z$ b3 G6 m8 l
- V! F5 u) x/ t 【红色】数据缺失(Incompleteness error):Missing values/ N/A not applicable的两种处理方法 ① 删除该行数据; ② 用其它数据替代,包括 平均数、众数、中位数,或者假设为0。
* x, p) W" W6 h& S3 U. m 【橙色】无效数据(Invalidity error):数据超出了有意义的范围(meaningful range),如图中例子,1900年生人到现在肯定死翘翘了,这个数据是无意义的,所以该数据无效。可以参考其他数据进行修正。
9 j$ a- y( S* Y# ~' m 【黄色】不准确(Inaccracy error):如图中例子,要么就是yes,要么就是no,dont know是不精确的陈述(not a measure of true value)。可以参考原始记录进行修正。
9 J; H% m; x) G7 ` 【绿色】不一致(Inconsistency error):前后矛盾。如图中例子,X女士的性别不应该是男。
& i3 t+ |7 q' d; p3 V6 P9 n 【蓝色】不统一(Non-uniformity error):格式上的不统一。如5000000, 5百万, 500万,5,000,000,5m,5million,五百万都是表达的一个含义,应将格式统一。
9 r3 u3 @" w; }' T% ~ 【紫色】重复(Duplication error):如图中2号和5号行的数据代表的同一个人,重复的数据删掉一个就好了。
' v; c* k, v+ T9 H 下图为清洗完毕(cleansed)的传统数据。
0 l7 Z( f J) X* O5 r5 i , }" A# t% `$ @4 L. d7 N6 s" l/ J+ R
因为要人工逐行逐列的检查和修正,数据清洗需要花费大量的成本。可以借助一些软件(如SPSS),通过元数据(metadata)来检测数据的属性。 @4 l: P( t5 [& o
这里简单提一下元数据(metadata),简单的定义就是data about data。
) s' L0 G ^% j H0 g5 {$ O$ o 实在不行的数据行,删掉他就好了,当然也要注意数据库的大小,数据库尺寸很大的话删掉一个也不差什么。 / p: L* e) @; V3 [
传统数据的数据预处理(Data Wrangling/ Preprocessing). R% X7 H& P' b# g
对数据的预处理过程(data wrangling/ preprocessing)是基于清洗完的数据(cleansed dataset)的。 # d$ ^6 P8 f# i0 N' f* y! y
主要包括以下几种方式:
6 v! o- z7 `! z& i8 X) C7 X" n 提取(extraction):从旧数据中提取新的数据。
1 N. o: A/ q5 G: {( X* ?1 Z* { 并列加和(aggregation):两个或者更多的数据加和成一个新的数据。 3 _, Y6 P$ c: k1 e
过滤(filtration)-行:去除不必要的行的数据。
' v* g& }, v2 \* m- ] 筛选(selection)-列:去除不必要的列的数据。 M7 p" q1 a: c" ^
转化(conversion):之前我们讨论过数据分为几种不同的类型(nominal, ordinal, continuous, categorical...),数据转化成更合适的类型。 $ a: R, T3 m" ^5 L# k0 x
接下来我们主要讨论下数据预处理中的对异常值的处理(Outliers)以及数据的标准化(Scaling)。
H; n, U) U( a+ I( s/ S% a0 d 异常值处理(Outliers) 6 B8 }$ M6 W$ U6 b, Q) b# Q
异常值就是离正常数据列非常遥远的数据,明眼人一看就知道不合群、不对劲,但是统计学上还是给出了一些检测异常值的方法。 - y4 m, \& g# B
6 f/ H7 s9 h! b 机器学习中outlier的检测方法类似于统计学,如标准差(Standard Deviation)、分位值(Interquartile Range, IQR)等。 ! w6 X; v- V) _: a5 W7 \ x4 J
标准差(Standard Deviation)方法适用于正态分布中,超出3个标准差的值就可以考虑是outlier了。
1 i. ^! `8 |" B: @ Interquartile Range, IQR的定义是75th分位置和25th分位置的差,IQR的中心即为50th分位置。超出1.5个IQR的值可以考虑是outlier,超出3个IQR的值就是extreme value了。 & z1 F( Y; F3 N- a% o
异常值的处理方式就两种:删除掉(Trimming/ truncation),或者用非outlier的值进行替代(winsorization-缩尾处理)。 ^; g* s: g/ C+ l# I9 {+ c
数据标准化(Scaling)
- \5 k% v+ w$ v+ M; d4 }7 I/ n 数据标准化就是把所有数据都标准到[0,1]的区间,更便于相互之间的比较。 , D5 ]. ~; M" M7 q
其实在统计学中,我们已经事先接触到标准化的过程了,类似于协方差(covariance)到相关系数(correlation)的过程。 3 w" j/ Z; D6 t6 w: _0 E% `
机器学习同样适用于数据的标准化进程,将异质的(heterogeneous)数据同质化(homogeneous)。
; f5 d4 i, m. K* l% ]& S' h 下面列举出两种标准化的方法: 6 g4 v+ d# n+ P
Normalization:适用于更广泛的分布,对outlier比较敏感。通过对整个数据列的最大值和最小值之间的跨度进行标准化。
; p1 `6 Z2 W% |' V. ?1 ] 2 M1 j2 U' \; D, t3 x& Q
Standardization:适用于正态分布,对outlier没那么敏感。通过使用均值和方差进行标准化。
& H9 W n" b3 ], x( }8 `2 i, z 9 M) `5 ]# f$ S" J( J9 a' ?
文本数据的数据清洗(Text Cleansing/ Preparation)
+ I3 j V- X" A) ~ x: y. F |! J1 k l; m 我们在网页上看到的规规整整的文字,抓取(scraping)之后的原始文本数据(raw text data)就包括了很多不必要的元素。
# `7 r( U2 e2 k4 Q! X4 |
$ L% {9 M) ]% V, I+ U/ O 这些不必要的元素包括【红色】html tags, 【黄色】标点符号punctuation, 【蓝色】numbers, 【绿色】空白格white spaces) 2 u! i' F- S4 Z1 Z0 A0 z' z+ {
2 D o( m: a( Q% k7 }/ I
文本数据的数据清洗(Text Cleansing/ Preparation)过程就是将它们移除,清洗完成的文本数据(cleansed text data)如下图。 1 [) [/ v2 R) O; i
2 H) |( a! J# c, l' G( t
文本数据的数据预处理(Data Wrangling/ Preprocessing)
3 b$ B( p0 f' [; r+ t! b 首先引进一个概念,token。上图中一个 /.../ 就可以等同于一个token的概念,tokenization的就是把文本(a collection of tokens)分裂成一个小块一个小块的过程。
; `2 h$ t8 S d2 M+ M 文本数据的预处理的过程首先是normalizing,把具有相似含义的tokens标准化成一个形式。形成一个BOW(Bag-of-Words),囊括了一篇文本里的所有标准化的tokens们。然后列出一个token在不同文本出现的频率表(Document Term Matrix, DTM),将这些unstructed(text) data最终转化成了structed data。
7 A0 s ^0 M5 M2 _" ]+ k8 t { Normalizing tokens 标准化 ; v! e% q2 Q7 _# y+ F1 [
机器学习大数据的标准化处理的结果其实看起来是挺奇怪的。 ( }; [# o, U6 ~7 H& ~3 p
我们从小学习的英语语法中有一些不同寻常的变形方式,比如“去e+ing”,“y变i+ed”等等,这些就导致了机器学习大数据中很多标准化处理后的结果像个残疾人一样。
+ K5 v/ }' u. |' s, w; u* K7 B& w2 J 比如increase, increases, increasing, increased, increasingly这些词并不是标准化成increase(所谓的原型),而是increas。 - Q* R0 C9 A( j5 Q
因为increasing把e去掉加的ing,所以为了让三个词都能有个共同的标准化结果,机器学习大数据的标准化结果只能是“increas”了——看,像不像个残疾人?
0 r4 `/ e; e- |2 i8 u5 H 那我们拆开看一下value, valued, values...这些是怎么一步步变成valu的?
' x+ h. g* I6 u& {" k Normalizing的过程包括四个步骤。 . C- d! t3 M6 Z+ L5 t# W
①Lowercasing:统一大小写。
& `9 s# n* ]6 d( f ②Removing stop words:stop words呢,就是text里面那些没有太大意义的词,就像语法中我们学到的冠词这些(a, the, is...)可以事先列一个list决定stop words包括哪些。 $ S0 P( }8 c: f- J
接下来两步就是变成残疾人的核心步骤了,简单理解,③Stemming就是从各种变化形态变成原型(base word/ stem)(values, valued -> value);而④Lemmatization就是从原型再缩减到词根形式(morphological root/ lemma)(value -> valu)。 5 U* E( K8 i$ P3 C/ V" f
这两步可以减少那些低频、不常见的tokens(也叫data sparseness),让机器学习的模型变得更简单。
5 p5 p; K* g4 ? BOW(Bag-of-Words)
5 q n" f! w' p, G5 i 一篇文章的tokens们,整理到一起,就形成了BOW(Bag-of-Words),这样的形式更便于进一步的分析。标准化后的BOW越来越小。
2 g5 M4 j# G1 v" v" U% ^
: g$ l- P. y% p; @- w& N( S1 R DTM(Document Term Matrix) 4 A5 M( C) J2 L5 _
将BOW中不同的tokens(行row)在不同的text(列column)出现的频率列成一个表,这个表就是DTM(Document Term Matrix)。
( i' p4 z' p$ _$ M `0 I
5 g- o# s, ] L4 e* Z/ R$ @ 这一步更关键的意义是将text data转化成structed data,以便于更好的Machine Learning input。 4 f/ \) o4 T6 |' M/ P' J
参考资料: CFA Level II <Quantitative Methods> 1 [8 E, O( O) l0 @5 ~+ {6 t$ X7 e; u
文 by / 杨翊守 公众号:拂晓Palpitate
. N0 p M8 Z5 Z4 e% ?! `' x! G7 w5 X) b1 M, ^
9 h9 k0 i2 e$ h3 J0 d+ h* I& J4 a. C6 O2 M+ R
1 X* J' | i& }+ U* D- J9 t( \1 K) h- e |