前言
数据的预处理在人工智能和数据挖掘领域都是恒久的经典话题。现实中,我们所拿到的数据可能有残缺项,可能有离常值等各种问题。类比人类的学习过程,这就像你在挑选习题集的时候,总要买质量好的练习题才能学到真东西,也能更准确地反映自己的学习状态。一个高质量的数据集,能够帮助我们的学习模型更快的了解数据本身的特征。在深度学习和机器学习中,好的预处理有利于稳定初始训练状态,减少触发梯度计算中潜在的爆炸,消失等问题的几率,同时能够方便模型进行寻优。
既然预处理如此重要,那么在机器学习和深度学习的数据预处理中,我们怎样对数据进行预处理呢?又通常需要从哪几个方面出发,做哪些处理工作呢?在这一续章中,我们对机器学习中数据预处理的几个基本问题进行讨论,并对常见的数据预处理方式进行解释说明。这里因为笔者的研究方向主要是计算机视觉,因此对于文本样本数据集的预处理暂不做讨论。我对这方面的了解不多,如果以后有机会学习到了,再和大家一起分享。
数据处理工具
好的处理工具,能够最大限度帮助我们尽快完成数据的处理。那么通常在数据预处理阶段,我们会使用哪些框架或者工具来实现我们的目标呢?我理解的答案是:数据预处理方式往往和你使用的学习框架是相关的,这也能够最大化方便你减少代码的依赖。比如在机器学习领域中,我们通常使用的框架是sklearn,而sklearn中有对应的data preprocessing,能够帮助你批量处理组织好的数据。或者在数据科学专业中,我们通常会使用Pandas这个库对数据进行预处理。
同样,在深度学习领域,不同的框架也有不同的预处理方式,如keras的Preprocessing,pytorch的Transformer等,通过一些参数的设定,能够帮助我们在最短的时间内完成基本的数据预处理工作,而不必手动对其进行操作。除了传统的预处理,我们在这里要解释一个点:在实现迁移学习的过程中,我们对数据进行的预处理,最好要和pretrained model在训练时的预处理保持一致。这样在使用pretrained model进行特征提取的时候,才不会因为数据的预处理不一致,导致预训练模型输出的特征不具备“正确性”,从而后续finetuning的层没有“正确的”features进行学习。那么为了和预训练模型保持一致,许多preprocessing也被集成到finetuning对应的module中,方便大家import。这个在不同框架对应的Documents中都有解释,在学习使用finetuning技巧的时候,一定要采用正确的预处理方式,这意味着你的预处理要和你的预训练模型是对应的,这样你的finetuning结果才可靠。
常见预处理方式
那么常见的数据预处理方式有哪些呢?事实上,数据预处理的主要步骤分为:数据清理、数据集成、数据规约和数据变换。
![](https://i-blog.csdnimg.cn/blog_migrate/79a1a0cbec2b617998a64b3e5fdb7f92.png)
但是实际上我们在进行研究的过程中,笔者个人感觉数据集成这个内容出现的需求并不常见,因此这个方面我们不做过多的讨论。上面的四个专有名词写的有些抽象,我们转换成常听到的词汇:
1)数据清理:离常值,缺失值,噪声数据等的处理。这部分内容在文档 [1]中讲解的十分清楚了,由于内容比较简单且解释类似操作的博文也比较全面了,因此这里不多赘述。
2)数据规约:其实就是数据降维。通常我们分析的数据包括了很多维度的信息,其中部分信息是与挖掘任务不相关的,同时也和其他的特征属性有着密切的关系。因此,我们在分析数据的时候可以将这部分不相关的数据进行删除,在保证有用信息量不减少的情况下,尽可能减少数据分析量,降低由于数据造成的波动和干扰。同时也能够节约模型参数,达到高效分析的目的。
常见的数据规约过程包括:相关系数和卡方检验(变量相关性);回归系数(重要性排序);特征稀疏化Lasso等,这个是从变量的相关性和重要程度进行的分析。同样的,我们也可以将传统的降维算法引入进来进行分析,如常见的PCA,FA,SVD,聚类等。通过这一类方法,我们仍然可以在保证最大信息量的前提下进行数据的降维。
3)数据变换:这个换成熟悉的内容就是常见的规范化处理。如:Z-score标准化,最大最小规范[0, 1],或者常用在生成式对抗网络中的 [-1, 1] 规范化。同时,对于数据量级变化较大的,我们通常采用的对数化也是十分常见的操作。这里提到的规范化,不仅仅限于计算机视觉中,同时也包括数据科学领域的一些预处理。规范化处理在深度学习和机器学习中也是必不可缺的一个环节,具体那哪种表现较好,需要实际的测试才能够有一个准确的判断。但是我们讲,一般情况下,归一化是一种首选的经验操作,也是普遍能够使模型work的预处理方法。
数据变换的另一类是指数据的离散化处理。这一内容在 [1] 的6.3.5节离散化中有十分详细的分析,通常由等频,等宽,聚类等进行离散处理。这里我们不多赘述,具体的例子和代码要认真参考sklearn的官方Document。作者在这里为大家整理了一些非常有用的在线学习资料,也是我个人在学习过程中看到的。[2, 3, 4, 5] 基本上涵盖了所有相关数据预处理和分析的内容,都是我自己读过觉得质量非常高的参考文献。感兴趣的读者可以在这几个链接的基础上进行继续学习。
数据预处理的好处
为什么说在机器学习中,数据预处理是必不可缺的一个重要环节呢?我们在这里引用吴恩达老师的一张经典的幻灯片来解释这一现象。如果将数据的某些维度投影到一个平面,我们可以看到,左边未进行规范化的数据他们的梯度分布不均匀。如果我们菜用随机初始化网络参数,那么这个随机的起始点对于优化的过程影响是很大的。图2中左边的蓝色优化路径是剧烈波动的,同时也是在反复震荡中走向最优点。那么如果对数据进行规范化(预处理的一种),那么情况则大不相同。从图2右边的可以看出,随机的初始点对于优化过程的影响不是很明显同时所有的梯度都是均匀分布的,这意味着在同样学习率的情况下,不会产生巨大的波动导致训练过程缓慢且模型难以收敛。然而相比图2 左边,我们可能需要在学习的过程中动态设置学习率,才能够保证最后的优化结果是最优解。
![](https://i-blog.csdnimg.cn/blog_migrate/abca1a11403d9f269a0a47d6e19dcc97.png)
结束语
到此,我们对数据的预处理进行了简单的讨论,同时对于预处理中基本的一些问题进行了比较通俗的解释和分析。之所以博客的开篇重点花了两篇博文,对数据及其预处理进行阐述,就是为了强调在深度学习和机器学习中:对于数据的分析和探讨是任何一个高质量项目开始的必要过程。我们只有了解我们要处理的东西是什么,才能把这个东西做好做完整。就像做一道菜,你要明白你的原料是什么,你要怎么挑菜(筛选特征数据),处理你的食材(预处理)才能做出最美味的菜。至于炒菜的过程(训练模型)和调味烧制(调参训练),也是需要认真学习的。不然光有好的原材料,也没法做出一道美味的菜。希望这篇博文能帮助大家建立数据预处理的一些意识!如果有任何问题请在博文下方留言。谢谢!
Reference
[1] https://scikit-learn.org/stable/modules/preprocessing.html
[2] https://www.jiqizhixin.com/articles/2019-02-21-15
[3] https://www.ibm.com/developerworks/cn/analytics/library/data-preprocessing-in-detail/index.html
[5] https://zhuanlan.zhihu.com/p/34594982