数据预处理主要包括数据清洗、数据集成、数据变换和数据规约四个部分。
1. 数据清洗
1.1 缺失值处理
缺失值一般由NA表示,在处理缺失值时要遵循一定的原则。
首先,需要根据业务理解处理缺失值,弄清楚缺失值产生的原因是故意缺失还是随机缺失,再通过一些业务经验进行填补。一般来说当缺失值少于20%时,连续变量可以使用均值或中位数填补;分类变量不需要填补,单算一类即可
当缺失值处于20%-80%之间时,填补方法同上。另外每个有缺失值的变量可以生成一个指示哑变量,参与后续的建模。当缺失值多于80%时,每个有缺失值的变量生成一个指示哑变量,参与后续的建模,不使用原始变量。
在下图中展示了中位数填补缺失值和缺失值指示变量的生成过程。
Pandas提供了fillna方法用于替换缺失值数据,其功能类似于之前的replace方法
pandas数据框对象可以直接调用方法isnull产生缺失值指示变量
发现:通过describe与len直接发现、通过0数据发现
处理:删除、插补(插补的方式主要有:均值插补、中位数插补、众数插补、固定值插补、最近数据插补、回归插补、插值法[拉格朗日插值法,牛顿插值法]等等)
拉格朗日插值法的推导过程可参考下面文献:
1.2 噪声值处理
噪声值指数据中有一个或几个数值与其他数值相比差异较大,又称为异常值、离群值(outlier)
对于大部分的模型而言,噪声值会严重干扰模型的结果,并且使结论不真实或偏颇(结合业务经验视情况而定,不可一味的删除噪声值)。需要在数据预处理的时候清除噪声值。
噪声值的处理方法很多,下面进行详细介绍:
发现:通过散点图发现
处理:对于单变量,常见的方法有盖帽法【3σ标准差】、分箱法;多变量的处理方法为聚类法【如K-means聚类】;滤波器【如中值滤波,非线性滤波/均值滤波,线性滤波;滤波器主要用于平滑图像,去除图像噪声】
盖帽法【3σ标准差】将某连续变量均值上下三倍标准差范围外的记录替换为均值上下三倍标准差值,即盖帽处理
分箱法通过考察数据的“近邻”来光滑有序数据的值。有序值分布到一些桶或箱中。
分箱法包括:
等深分箱:每个分箱中的样本量一致;
等宽分箱:每个分箱中的取值范围一致。直方图其实首先对数据进行了等宽分箱,再计算频数画图。
分箱法将异常数据包含在了箱子中,在进行建模的时候,不直接进行到模型中,因而可以达到处理异常值的目的。
多变量异常值处理-聚类法:
通过快速聚类法将数据对象分组成为多个簇,在同一个簇中的对象具有较高的相似度,而不同的簇之间的对象差别较大。聚类分析可以挖掘孤立点以发现噪声数据,因为噪声本身就是孤立点。
常用检查异常值聚类算法为K-means聚类
1.3 重复值处理
数据录入过程、数据整合过程都可能会产生重复数据,直接删除是重复数据处理的主要方法。pandas提供查看、处理重复数据的方法duplicated和drop_duplicates
1.4 Python 实现数据清洗
from sklearn import preprocessing
import numpy as np
import warnings
warnings.filterwarnings("ignore")
x = np.array(
[[1.,-1.,2.],
[2.,0.,0.],
[0.,1.,3.]])
# 标准化
x_scale = preprocessing.scale(x)
print(x_scale)
print(x_scale.mean(0), x_scale.std(0))
# minmax
scaler = preprocessing.MinMaxScaler()
x_scale = scaler.fit_transform(x)
print(x_scale)
print(x_scale.mean(0), x_scale.std(0))
# MaxAbsScaler 数据归一化到[-1,1]之间
scaler = preprocessing.MaxAbsScaler()
x_scale = scaler.fit_transform(x)
print(x_scale)
print(x_scale.mean(0), x_scale.std(0))
# RobustScaler 根据中位数或者四分位数去中心化数据(适用于数据中有许多异常值
scaler = preprocessing.RobustScaler()
x_scale = scaler.fit_transform(x)
print(x_scale)
print(x_scale.mean(0), x_scale.std(0))
# Noremalization
scaler = preprocessing.Normalizer(norm="l2")
x_scale = scaler.fit_transform(x)
print(x_scale)
print(x_scale.mean(0), x_scale.std(0))
# 二值化 根据一定的阈值,将数据分成0、1
scaler = preprocessinig.Binarizer(threshold=0)
x_scaler = scaler.fit_transform(x)
print(x_scaler)
# one-hot 将类别/离散数据转换为one-hot编码形式
env= preprocessinig.OneHotEncoder(n_values=4,sparse=False)
ans = enc.fit_transform([[1],[2],[3]])
print(ans)
# 缺失数据
imp = preprocessing.Imputer(missing_values='NaN', strategy='mean', axis=0)
# 直接补值
y_img = imp.fit_transform([[np.nan, 2], [6, np.nan], [7, 6]])
print(y_img)
#通过学习补值
imp.fit([[1,2],[np.nan,3],[7,6]])
y_imp = imp.transform([[np.nan, 2], [6, np.nan],[7,6]])
print(y_img)
2. 数据集成
数据集成需要考虑许多问题,
如实体识别问题,主要是匹配来自多个不同信息源的现实世界实体。
冗余是另一个重要问题。如果一个属性能由另一个或另一组属性“导出”,【如果多个属性存在相关关系,那么这些属性是冗余的,保留其中一个属性即可】则此属性可能是冗余的。属性或维命名的不一致也可能导致结果数据集中的冗余。常用的冗余相关分析方法有皮尔逊积距系数、卡方检验、数值属性的协方差等。
3. 数据变换
即对数据规范化处理,主要包括以下几种:
3.1 简单函数变换
平方、开方、取对数、差分等
3.2 数据规范化
数据规范化的常见方法:
1)离差标准化(最小-最大标准化)--消除量纲(单位)影响以及变异大小因素的影响。(最小-最大标准化)
x1=(x-min)/(max-min)
2)标准差标准化--消除单位影响以及变量自身变异影响。(零-均值标准化)
x1=(x-平均数)/标准差
3)小数定标规范化--消除单位影响。
x1= x/10**(k)、k=log10(x的绝对值的最大值)
3.3 数据离散化
为了适应某些分类算法,需要将连续变量变成分类变量。
离散化的过程:先设置若干离散的划分点,将取值范围划分为一些离散的区间,最后将所有的取值落在对应的区间内。所以离散化可分为两个子任务:确定分类数,以及如何将连续数据映射到这些分类值
数据离散化的常见方法:
1)等宽离散化。将数据的值域分成具有相同宽度的区间,区间的个数由数据本身的特点决定,或者由用户自己指定,类似于制定频率分布表。
2)等频率离散化。将相同数量的值放进每个区间
3)基于聚类分析的方法。用户指定簇的个数(决定了区间的个数),使用聚类算法(如K-means)将数据进行聚类,然后属于同一个簇的数据都标为同一个标记。
3.4 属性构造
属性构造即通过现有的一个或多个属性数据经过处理变成新的属性数据。
3.5 小波变换
小波变换可以把非平稳信号分解为表达不同层次、不同频带信息的数据序列,即小波系数。选取适当的小波系数,即完成了信号的特征提取。
4. 数据规约
其实就类似于数据降维,去除贡献度较小的属性,产生更小且保持数据完整性的新数据集。意义在于降低无效、错误数据;降低存储成本;少量且具有代表性的数据大幅加快,主要分为以下两类:
4.1 属性规约
属性合并或删除无关维,目标是寻找最小子集使子集概率分布尽可能与原来相同。
常用方法:
1)合并属性 将就属性合并为新属性 {A1,A2,A3,B1,B2,C}——{A,B,C}
2)逐步向前选择 从空集开始,逐个加入最优属性,直到无最优或满足条件 {}—{A1}—{A1,A4}
3)逐步向后删除 从全集开始,每次删除最差属性,直到无最差或满足阈值
4)决策树归纳 利用决策树归纳能力进行分类,删除未出现的属性,即效果差的属性
5)主成分分析 用少量变量解释大部分变量,保留大部分信息,将相关性高的数据转为彼此独立
4.2 数值规约
数值规约主要目的是通过各种办法减少数据量。包括有参数方法、无参数方法。
通过选择替代的、较小的数据来较少数据量,
有参数方法:回归、对数线性模型
无参数方法:直方图、聚类、抽样
本文地址:https://blog.csdn.net/pantingd/article/details/107296128
如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!