.
本文是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(yi∏j=0,j̸=inxi−xjx−xj)
分享三篇很详细易懂的拉格朗日插值法推导过程:
https://wenku.baidu.com/view/cdaccdf76137ee06eff918d1.html
https://blog.youkuaiyun.com/doyouseeman/article/details/50752378
https://blog.youkuaiyun.com/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′=max−minx−min
- 标准差标准化(零-均值规范化),是目前归一化用的最多的方法。
x ′ = x − x ‾ σ x'=\frac{x-\overline{x}}{\sigma} x′=σx−x
- 小数定标规范化,是通过移动小数位数,将源数据映射到[-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,似乎可能拿来做数据预处理和特征工程的自动化。打算找时间研究下看看。有兴趣的朋友一起~
.