.
本文是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.csdn.net/doyouseeman/article/details/50752378
https://blog.csdn.net/jclian91/article/details/79007751
1.2 异常值处理
2.1 实体识别
2.2 冗余属性识别
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 规范化(归一化)
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
x ′ = x 1 0 k x'=\frac{x}{10^k} x′=10kx
3.3 连续属性离散化
为了适应某些分类算法,需要将连续变量变成分类变量。
3.4 属性构造
利用已知属性构造新的属性,并加入到属性集合中。
3.5 小波变换
小波变换可以把非平稳信号分解为表达不同层次、不同频带信息的数据序列,即小波系数。选取适当的小波系数,即完成了信号的特征提取。
在大数据集上进行复杂的数据分析和挖掘需要很长时间。数据规约产生更小但保持原数据完整性的新数据集。
数据规约的意义:
4.1 属性规约
合并属性。将一些旧属性合并为较少的新属性。
选出若干最佳属性。
删除最差若干个属性。
决策树归纳。没有出现在决策树上的属性都删掉。
主成分分析。用较少的变量去解释原始数据中的大部分变量。即将很多相关度很高的变量转化成为相互独立的变量。主成分分析的计算推导过程比较复杂,暂时还没完全搞懂。先记下库和用法吧。在sklearn模块下:
sklearn.decomposition.PCA( n_components = None, copy = True, Whiten = False)
参数解释:n_components表示要保留下来的特征个数。copy表示是否在原数据上训练数据,为True表示把原数据复制一份然后在副本上训练数据,否则算法运行之后,元数据会被更改。whiten白化,使得每个特征具有相同的方差;默认为False。
4.2 数值规约
数值规约主要目的是通过各种办法减少数据量。包括有参数方法、无参数方法。
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,似乎可能拿来做数据预处理和特征工程的自动化。打算找时间研究下看看。有兴趣的朋友一起~
.