[数据算法攻城狮]数据准备(大纲向)

Posted on 2018-04-21 16:16  leegendlee  阅读(202)  评论(0)    收藏  举报

首先,需要明确数据准备这一步骤的重要性。

2017年开始,人工智能被吵的热火朝天,又因为Python的易学性和机器学习库及框架所带来的便利性,机器学习和深度学习的入门几乎零门槛,现在人人都跟风搞AI(作为真正致力于数据与算法的博主非常反感这样的现象,但也只能无奈了=。=)。然而,大部分注意力都被集中在了算法与模型的选择上,却忽略了数据准备这一步骤对于算法及模型最后结果的影响。可以说,没有好的数据准备,算法很可能无法充分发挥作用,模型很可能Garbage in, garbage out。其实在模型的选择上,只要不出现理论性的偏差(例如非要把回归当分类处理=。=),最后不同模型结果的差距一般不会很离谱,即模型与算法的选择多半决定结果的上限(例如准确率的提升)。但是下限在哪呢?这就是数据准备的作用,可以理解为数据预处理。如果不把数据处理好,敢问结果的上限能有多好呢?可以说在数据准备->数据分析->数据建模->模型训练->模型优化->模型上线,这样一个流水线下,数据准备所花的精力可能会达到一半。然鹅真的有不少跟风的童鞋们都忽略了这个极其关键的步骤。博主身边有不少刚开始接触算法的童鞋,把西瓜书花书蓝皮书作为读物,的确书中的模型推导是很重要,这确实是一个数据算法工程师的必备技能。但是之所以需要我们推导模型,是因为已经有了数据的支撑。真正的算法工程师并不是只负责手撕算法。。

好了不吐槽了,进入正题。。

本篇为大纲向,暂不深入涉及底层原理。。

可以通俗的将数据准备分为2个大部分:数据清洗、特征工程。

 

数据清洗

也就是平时常说的洗数据。之所以需要这步,是因为现实中得到的数据可能会有各种各样难搞的问题:数据缺失、数据光滑、数据不平衡,数据变换、数据归约、数据分配等等。

数据缺失:常见的处理方式如下:

  直接丢弃该样本:数据量很大的时候可行,数据量小的时候就不适合了,会造成数据过少、数据分布有偏等问题。

  人工填充:不谈了,海量数据怎么可能呢。。

  使用同属性均值、中位数、众数等填充:比较简单的方法,在保证数据完整性与损失数据信息之间取得了一定的平衡。

  使用统计方法估计缺失数据:对该属性的整体数据建模(回归、贝叶斯、EM算法等),估计出最有可能的值,比较不错且科学的方法。

数据光滑:一是对数据去噪,二是针对离群点的处理,常见的处理方式如下:

  回归:去噪的一种,通过拟合来得到光滑数据。

  分箱:去噪的一种,是局部光滑技术。箱的分法有等宽分箱(指取值等宽)、等频分箱(指样本个数等频)等,在箱中用于光滑数据的方法有取箱均值、箱边界、箱中位数等。

  数据可视化:通过绘制数据图表找出离群点的范围,好处是直观,不过不够标准化,而且维度大于3时很难可视化。

  聚类:不在簇集合内的视为离群点,常用。

  数值-均值<=2倍标准差:将与平均值的偏差超过两倍标准差的数据视为离群点,常用。

数据不平衡:即数据量小+正负样本不平衡的各种情况。常见的处理方式如下:

  采样:上采样(小众类反复选取,可能会过拟合,所以加入随机扰动)/下采样(大众类剔除部分,可能会欠拟合,所以有例如EasyEnsemble的方法,类似Random Forest的理念),上采样一般更好。

  加权:类似Boosting的理念,效果一般不如采样。

  数据合成:面对数据量比较小的情况适用,例如SMOTE方法,利用将原有数据视作近邻,加入随机扰动项合成新的数据。

  一分类:在正负样本量悬殊极大的情况下可以将问题转换为一分类问题进行建模,不在该分类内的视为异常点。

数据变换:即将数据变换至需要的形式或范围,常见的处理方式如下:

  最大最小归一化:新值=(原始值-min)/(max-min),可将数据化至[0,1]区间。比较不稳定的地方在于会受异常值的影响,好处是能够反应更多数据中潜在的关系。

  z-score标准化:新值=(原始值-均值)/标准差,可将数据化至均值为0,标准差为1的分布,常用,且能够在计算距离时让不同属性发挥等效的作用。

  小数定标标准化:即将原始值缩小10的N次方(N自取)。

  离散化:其实和数据光滑中的分箱法一个道理。

  聚合:顾名思义,将多种属性聚集在一起视为一种属性。

数据归约:即使用归约技术,得到量更小而不失完整性的数据,常见的处理方式如下:

  数值归约:使用回归、聚类、抽样(放回随机/不放回随机/分层抽样等)等方式得到更小而不失完整性的数据。

  离散化、概念分层:离散化参考数据变换中的离散化;概念分层指用高层次概念替换低层次概念,以此减少特征数量(比较抽象)。

  数据压缩:使用编码变换数据,得到更小的数据。无损压缩:参见音频上的众多无损压缩算法;有损压缩:小波变换、PCA等。

  维度归约:需要检查特征之间的相关性,去除弱相关以下及冗余的特征,可以通过相关系数(连续型)、卡方检验(离散型)等计算相关性。

数据分配:即训练集、验证集、测试集的分配,常见的处理方式如下:

  留出法:将数据分为几个部分,分别用于训练、验证、测试。其实没啥不好的,就是数据量小的时候不太好用。

  交叉验证法:大名鼎鼎的交叉验证,将数据分为若干份(所以也叫k折交叉验证法),循环选取,分别用于训练、验证、测试,由于训练测试了多次,因此最后结果取均值。

 

特征工程

特征工程这部分和上面数据清洗有一部分是重合的,例如将特征分箱、离散化,维度压缩等。但这么写不太好分类,所以在这里也会写上一部分类似的内容。

降维:特征工程里可能最重要的问题在于降维,因此这里先主要说说常见的降维方式:

  正则化:主要是L1范数、L2范数。对于线性回归而言,前者称为Lasso回归,后者称为Ridge回归。其中具有降维性质的是L1。从二维的角度看,L1由于其约束||w||的特殊性,导致损失函数求解的时候有相当一部分参数会取0,因此从这个角度来说,L1范数的确具有降维的作用。

  PCA:传说中的主成分分析,是一种无监督的线性方法(可以使用核方法推广至非线性)。直观的说是一种坐标变换。比如要选取某一个最有效的特征,PCA所采用的方法就是令数据在特征上做投影,投影后样本方差最大的特征即是所求特征。在实际计算时,通过计算特征的协方差矩阵(协方差矩阵一定是方阵)的特征值(该方法是特征值分解,只针对方阵,另一种方法是基于奇异值分解SVD),可以得到所选特征。此外,增量式PCA可以用于一次无法完全读入内存的大数据。

  LDA:线性判别式分析。原理比较好理解,例如对于分类问题而言,即希望选取特征后,不同类别的数据距离尽量大,同一类别的数据距离尽量小,因此是一种有监督的线性方法。

  SVD:传说中的奇异值分解,可以用于非方阵。原理的简单理解是:将原始矩阵分解成3个维度较低的矩阵的乘积,当中的一个矩阵即是奇异值矩阵,奇异值其实就是原始向量经过正交基变换后新向量的模,即相当于对原始矩阵基于向量做了坐标的旋转和缩放。应用在推荐系统上即是利用SVD重构出待推荐物品的矩阵,去除已经评过分的物品,剩下的取最大的前若干个即为推荐的结果。SVD常用于PCA算法,也经常和CF(协同过滤)结合,即利用相似用户对待推荐物品的评分进行推荐。此外,SVD算法的时间复杂度为O(n^3),比较复杂,因此多使用并行计算的方式提高速度。

特征分解与编码:例如将1个多分类特征转化为若干个二分类特征,或将特征编码化,便于后续处理。

特征交叉:主要用于的情况是,有时将若干特征组合起来可以得到更有价值的信息,这时便需要用到特征之间的交叉。

特征缩放:其实和数据标准化一个道理,例如进行PCA、Ridge回归等之前需要对数据进行标准化,才能得出正确的结果。

特征提取:这和特征选择的概念有些不同。特征提取可以在神经网络(例如CNN)的基础上理解,每经过一层神经网络层,都会对原始信息进行一次特征的提取,最后得到所需的结果。其中特征是如何提取的,提取了哪些关键特征等问题其实并不需要人为参与,由神经网络自行完成。

 

 

暂时先写这么多啦,撒花~~~