当前位置: 代码迷 >> 综合 >> 【Trick】数据预处理的常用方法
  详细解决方案

【Trick】数据预处理的常用方法

热度:54   发布时间:2023-12-16 22:48:56.0

前言

本篇博文将介绍数据预处理的常用方法,这些方法仅根据本人接触过的数据挖掘项目中总结而来,如有疏漏或不合适的,望大佬们提出。

数据预处理

与我们从课本中获得的数据集不同,实际应用中遇到的数据集常常是带有噪声、带有缺失值、不符合相应的数据挖掘模型的,我们首先要做的事情就是对数据进行预处理,据统计,在整个数据挖掘过程中,数据的预处理过程常常会占到整个生命周期的60%-70%,还经常有一句话:Trash In Trash Out,意思是在数据挖掘过程中,如果预处理做的不好,模型中输入的数据带有噪声、异常值等Trash,那么模型输出的结果也将是Trash,由此可见数据预处理的重要性。
本文算是我自己的一个总结,方便以后查阅。

文本预处理

对于文本的数据挖掘,常常要进行预处理,尤其是对段落、句子进行的挖掘,常用的基本方法有:中文分词、机械去重、停用词过滤、关键词提取等。jieba是一个非常优秀的中文分词Python第三方程序库,相应的R中有jiebaR库,以此可实现中文分词;在机械去重阶段,需要注意根据项目的实际情况确定是否需要进行去重处理,如果你只是要统计每个句子之间的关系,而不考虑句子中单词出现的次数,就需要进行机械去重,但是如果你想要得到句子的情感程度,重复的表达情感的单词则显得尤为重要,因此在此阶段遵循的原则只有一个:具体情况具体分析!停用词过滤很常用,像正常文本中的“了”、“的”等词,在实际建模过程中并没有对模型有任何影响,这类词就可以认为是停用词,判断停用词的方法常用的有两种:一是基于字典的,这种方法就比较普遍,常见的停用词都会出现在字典中,只需比对样本语句和字典,相同的删除即可;二是针对特有数据集自己推导出停用词,停用词的特点就是:你有我有全都有,在每个预料中都会出现,而它本身又不带有多少信息,根据这个特点,可以采用类似TF-IDF算法进行判断,正常的TF-IDF算法是求语句相关程度的,可以把它应用在每个分词中,如果分词在单个语料中词频很高,在每个预料中都有涉及,则说明这些分词是共有的,带有的信息较少,可以将其认为是停用词。

图片数据预处理

之前实习接触过些深度学习的项目,处理的主要是计算机视觉的相关问题,输入为图片,主要是基于卷积神经网络实现图片处理,输入图片经常需要进行预处理,主要的操作有:数据增强、设置batch size、BN、灰度处理等操作。

数据增强

数据增强(Data Augment)作为深度学习中最常用的数据预处理方法,具有多种优势,其基本思想是通过对图片的翻转、平移、剪裁、缩放等操作,从而增加数据量。对于卷积神经网络而言,增大数据量可以缓解过拟合,提高模型的泛化能力,从而提升准确率。

设置batch size

设置批处理(batch size),每次输入到模型中训练的并不是全部数据,考虑到模型的复杂度和计算量,如果将全部数据一次性地输入模型中可能会造成I/O过载,不可取,而设置批处理,每次只输入训练集或测试集的一个子集,模型对输入的特征把握并不会太低,计算量又不至于太高。

BN

批标准化(batch normalization,BN),常用在卷积神经网络的图像处理中。

灰度处理

数值型数据预处理

对于数值型数据的预处理,可分为多种情况:缺失值的处理、异常值/离群点检测、数据标准化、文本数值化、数据不均匀等,接下来将依次介绍。

缺失值处理

实际接触的数据集,常存在的问题是存在缺失值,处理缺失值的方法很多,本文介绍常用的几种:
(1)用均值填充。
(2)用中位数填充。
(3)用众数填充。
(4)应用时序模型填充。对于时间序列数据,可以根据时间序列应用指数平滑、趋势外推等方法对缺失值进行预测。
(5)删除属性。看似暴力的方法,对于那些单个属性存在很多缺失值,上述方法不能很好填补缺失值时使用。

异常值/离群点检测

异常值/离群点对于某些算法,如聚类算法等具有距离测度属性的算法,如logistic回归等异常值敏感的算法,很容易受其影响。
(1)画图观察
在样本点不是很多的情况下,可以直接plot出散点图直接观察,使用python的matplotlib库就可以轻松实现
(2)LOF离群点检测

数据标准化

(1)z-score规范化
假设样本空间为 X X ,则z-score标准化的公式如下:

z _ s c o r e ( x i ) = x i ? μ ( X ) σ ( X )

其中, μ μ 表示样本的平均数, σ σ 表示样本标准差,z-score标准化实际上就是样本点减去样本均值后除以样本标准差的结果。
基于Python实现z-score标准化的代码如下:

sklearn.preprocessing.scale(X)

(2)最小最大规范化
最小最大规范化将数据范围压缩到[0,1]之间,假设样本空间为 X X 对于样本属性 x x 存在如下转化公式:

m i n _ m a x _ s c a l e ( x ) = x ? m i n ( X ) m a x ( X ) ? m i n ( X )

最小最大规范化保持了数据原有的基本特征,将其映射到小的范围空间中,这种方法在聚类分析中经常使用,下面给出基于Python的代码,非常简单:

# pip install scikit-learn
import sklearn
min_max_scaler = sklearn.preprocessing.MinMaxScaler()
min_max_scaler.fit_transform(X_train)

(3)二值化

binarizer = sklearn.preprocessing.Binarizer(threshold=1)
binarizer.transform(X)
文本数值化

对于文本属性,在合适时候可以转换成为数值型,比如我在之前的一个web招聘数据分析项目,其中有一个对招聘企业的评分,涉及到一个属性是企业状态:天使、A、B、C、D轮融资、不需要融资、即将上市、已上市等,对于这些数据,可以将其进行数值化,分别数值化成1、2、3、4、5、6、7、8,之后进行评分建模分析。

数据不均匀

数据不均匀问题很常见,也很容易被忽视掉,数据不均匀会导致模型精度下降,需要重视,假设有一个数据集,是一个二分类数据集,包含的正负样本的比例为10:1,可以采用如下中的一种进行处理:
(1)从正样本中随机抽取十分之一与负样本组成训练集。这种情况需要注意:一定要保证是在数据量足够大的情况下,如果数据本身就很少,这样做反而会更加麻烦。
(2)赋予负样本十倍于正样本权重。由于负样本比较少,这时增加负样本权重,会弥补由于负样本数量少带来的影响。
(3)将负样本数据额外复制9份,并添加极小噪声。
下面是一个实例介绍数据不均匀会带来的影响,可能有点极端,但用来解释这个问题很合适。数据集:正样本9900个,负样本100个,合计10000个样本点,用来进行二分类研究,如果直接进行建模,可能出现的一种情况是:模型将所有输入都预测为正样本,最终依旧会得到很高(99%)的准确率,而对于负样本的召回率为0,如果只是对模型精度进行判断根本检查不出异常,但这样的模型又是万万不能在实际中应用的。

总结

数据预处理方法多种多样,在不同的业务背景、不同的数据特征下使用的方法也不同,所以最保险的方法就是多了解各种数据预处理方法,然后根据实际的数据特征选择适合的处理方法,这样才能最大程度的发挥数据特征带来的优势。