数据预处理包括哪几步?

.

本文是Python数据挖掘实战的读书笔记。因为数据预处理这部分比较枯燥无趣,所以先手抄一遍主要内容。之前做过很多分析工作,但是对数据预处理这部分没有系统化的梳理,通过阅读这部分内容,感觉能弥补一下之前的方法论短板。

数据预处理的目的,有2个目的,一是为了提高数据的质量,二是为了让数据更好地适应特定的挖掘技术或工具。这部分铺垫工作做好了,后面的模型和算法才能登台唱戏。

数据预处理包含哪几步呢? 其实主要分为4块内容:

  • 数据清洗
  • 数据集成
  • 数据变换
  • 数据规约

一、数据清洗

1.1 缺失值处理
删除记录,数据插补, 不处理。

常用的数据插补方法:
- 均值,中位数,众数插补
- 使用固定值
- 回归方法(预测)
- 插值法(拉格朗日插值法,牛顿插值法等)

拉格朗日插值多项式:

L ( x ) = ∑ i = 0 n ( y i ∏ j = 0 , j ≠ i n x − x j x i − x j ) L(x)=\sum_{i=0}^n({y_i}\prod_{j=0,j\neq{i}}^n\frac{x-x_j}{x_i-x_j}) L(x)=i=0n(yij=0,j̸=inxixjxxj)

分享三篇很详细易懂的拉格朗日插值法推导过程:
https://wenku.baidu.com/view/cdaccdf76137ee06eff918d1.html
https://blog.csdn.net/doyouseeman/article/details/50752378
https://blog.csdn.net/jclian91/article/details/79007751

1.2 异常值处理

  • 剔除含有异常值的记录
  • 视为缺失项
  • 平均值修正
  • 不处理

二、数据集成(合并)

2.1 实体识别

  • 同名异义:字段名相同,但实际是不同的数据
  • 异名同义:字段名虽然不同,但是实际是相同的数据
  • 单位不统一:同一个字段里,用的多个单位

2.2 冗余属性识别

  • 同一属性多次出现
  • 统一属性命名不一致导致多次重复
  • 解决办法:除了手工检查,还可以用相关分析来监测,相关系数接近1的,就需要检查是否是冗余属性,删除其一。

三、数据变换

3.1 简单函数变换

  • 平方

x ′ = x 2 x'=x^2 x=x2

  • 开方

x ′ = x x'=\sqrt{x} x=x

  • 取对数

x ′ = l o g ( x ) x'=log(x) x=log(x)

  • 差分运算

Δ f ( x k ) = f ( x k + 1 ) − f ( x k ) \Delta f(x_k)=f(x_{k+1})-f(x_k) Δf(xk)=f(xk+1)f(xk)

差分符合应该是小三角向下,但是不知道怎么写上去,知道的朋友可留言提示下博主,谢谢

3.2 规范化(归一化)

  • 离差标准化(最小-最大规范化),将源数据映射到[0,1]区间。缺点是数据中的异常值会导致数据分布非常不均匀。

x ′ = x − m i n m a x − m i n x'=\frac{x-min}{max-min} x=maxminxmin

  • 标准差标准化(零-均值规范化),是目前归一化用的最多的方法。

x ′ = x − x ‾ σ x'=\frac{x-\overline{x}}{\sigma} x=σxx

  • 小数定标规范化,是通过移动小数位数,将源数据映射到[-1, 1]区间。移动的小数位数,取决于数据中绝对值最大的那个数。

x ′ = x 1 0 k x'=\frac{x}{10^k} x=10kx

3.3 连续属性离散化
为了适应某些分类算法,需要将连续变量变成分类变量。

  • 离散化的过程:先设置若干离散的划分点,将取值范围划分为一些离散的区间,最后将所有的取值落在对应的区间内。所以离散化可分为两个子任务:确定分类数,以及如何将连续数据映射到这些分类值。
  • 常用的离散化方法:
  • 等宽法:将数据的值域分成具有相同宽度的区间,区间的个数由数据本身的特点决定,或者又用户自己指定,类似于制定频率分布表。
  • 等频法:将相同数量的值放进每个区间。
  • 基于聚类分析的方法:用户指定簇的个数(决定了区间的个数),使用聚类算法(如K-means)将数据进行聚类,然后属于同一个簇的数据都标为同一个标记。

3.4 属性构造
利用已知属性构造新的属性,并加入到属性集合中。

3.5 小波变换
小波变换可以把非平稳信号分解为表达不同层次、不同频带信息的数据序列,即小波系数。选取适当的小波系数,即完成了信号的特征提取。

  • 小波基函数是一种具有局部支集的函数。并且平均值为0,小波基函数满足: ψ ( 0 ) = ∫ ψ ( t ) d t = 0 \psi(0)=\int\psi(t)dt=0 ψ(0)=ψ(t)dt=0
  • 基于小波变换的多尺度空间能量分布特征提取方法。
  • 这部分内容没能一下子搞懂。先放一放。不过先记下小波分析的模块名称叫“pywt”。日后在来理会。

四、数据规约

在大数据集上进行复杂的数据分析和挖掘需要很长时间。数据规约产生更小但保持原数据完整性的新数据集。
数据规约的意义:

  • 降低无效、错误数据对建模的影响,提高建模的准确性;
  • 少量且具有代表性的数据将大幅缩减数据挖掘的时间;
  • 降低存储数据的成本。

4.1 属性规约

  • 合并属性。将一些旧属性合并为较少的新属性。

  • 选出若干最佳属性。

  • 删除最差若干个属性。

  • 决策树归纳。没有出现在决策树上的属性都删掉。

  • 主成分分析。用较少的变量去解释原始数据中的大部分变量。即将很多相关度很高的变量转化成为相互独立的变量。主成分分析的计算推导过程比较复杂,暂时还没完全搞懂。先记下库和用法吧。在sklearn模块下:

    sklearn.decomposition.PCA( n_components = None, copy = True, Whiten = False)

    参数解释:n_components表示要保留下来的特征个数。copy表示是否在原数据上训练数据,为True表示把原数据复制一份然后在副本上训练数据,否则算法运行之后,元数据会被更改。whiten白化,使得每个特征具有相同的方差;默认为False。

4.2 数值规约
数值规约主要目的是通过各种办法减少数据量。包括有参数方法、无参数方法。

  • 有参数方法:只需存放参数,不需要存放原始数据
    • 回归(线性回归和多元回归)
    • 对数线性模型(多维概率分布)
  • 无参数方法
    • 直方图
    • 聚类
    • 抽样(无放回简单随机抽样,放回简单随机抽样、聚类抽样、分层抽样)

五、Python的主要数据预处理函数

interpolate函数:一维、高维数据插值

f = scipy.interpolate.lagrange(x, y)

x, y 为对应的自变量和因变量数据

unique函数:去除数据中的重复元素。有两种用法,既可以是numpy库中的一个函数,也可以是Series对象的方法

# D是一维数组,可以是List, array, Series
np.unique(D)
# D是Series对象
D.unique()

isnull/notnull函数:判断每个元素是否空值/非空值,返回一个布尔Series对象。

# D是Series对象
D.isnull()
D.notnull()

random函数:生成随机矩阵

# 生成一个n x m x k 的随机矩阵
np.random.rand(n, m, k)
# 生成一个n x m x k 的随机矩阵,其元素服从正态分布
np.random.randn(n, m, k)

PCA函数: 对变量矩阵进行主成分分析

from sklearn.decomposition import PCA
model = PCA()
model.fit(D)
model.components_

数据预处理的大概就是这些内容,在数据分析工作中,这部分的工作量也是比较耗时费力的,这也是数据挖掘工作中最不智能的部分,目前来看好像无法被自动化和AI化。

不过最近看到一个开源Python库Featuretools,似乎可能拿来做数据预处理和特征工程的自动化。打算找时间研究下看看。有兴趣的朋友一起~

.

你可能感兴趣的:(学习记录)