学习笔记-数据预处理(数据挖掘)
数据预处理
可在此百度云网盘资源库中获取相关代码及数据文件,并欢迎研究人员及学生下载实践以进一步验证本文方法的有效性。
链接:https://pan.baidu.com/s/1O9DXGSGNlT2fkHX1woBpBA
提取码:m69u
主要内容:
数据清洗
数据集成
数据变换
数据规约
对目标数据集执行以下清理操作:删除与分析主题无关的数据样本;去除重复记录;剔除不符合质量标准的观测值;修复缺失信息;去除离群点干扰
1)缺失值处理
方法:删除记录,数据插补和不处理。
常见的插补法:
基于属性类型的特征...采用该属性取值的算术平均值/中间值/最常见的数值来进行填补
-
使用固定值
将缺失的属性值用一个常量替换。 -
最近临插法
在记录中找到与缺失的样本最接近的样本的该属性值插补 -
回归分析方法
对带有缺失值的自变量问题,则可基于已知数据及其对应的因变量数据构建拟合模型以预测其缺失值属性。 -
插值方法
基于已知数据点构建适当的插值函数f(x), 通过将未知位置处的变量用对应的x_i处的函数值得以替代
拉格朗日插值法:


牛顿插值法:

采用拉格朗日插值法对缺失值进行替代的Python程序。
具体数据位于 demo/data/catering_sale.xls 文件中。
个人在运行代码时经常遇到错误问题,并未能通过网络找到解决方案。
如出现错误问题时,请跳过此段代码。
#拉格朗日插值代码
import pandas as pd #导入数据分析库Pandas
from scipy.interpolate import lagrange #导入拉格朗日插值函数
inputfile = 'catering_sale.xls' #销量数据路径
outputfile = 'sals.xls' #输出数据路径
data = pd.read_excel(inputfile) #读入数据
data[u'销量'][(data[u'销量'] < 400) | (data[u'销量'] > 5000)] = None #过滤异常值,将其变为空值
#自定义列向量插值函数
#s为列向量,n为被插值的位置,k为取前后的数据个数,默认为5
def ployinterp_column(s, n, k=5):
y = s[list(range(n-k, n)) + list(range(n+1, n+1+k))] #取数
y = y[y.notnull()] #剔除空值
return lagrange(y.index, list(y))(n) #插值并返回插值结果
#逐个元素判断是否需要插值
for i in data.columns:
for j in range(len(data)):
if (data[i].isnull())[j]: #如果为空即插值。
data[i][j] = ployinterp_column(data[i], j)
data.to_excel(outputfile) #输出结果,写入文件
AI写代码
运行结果应如下:

数据大于5000还有空值,将其插补,插值结果更符合实际情况。
2)异常值处理
常用方法:
-
删除含有异常值的记录
直接将含有异常值的记录删除 -
视为缺失值
将异常值视为缺失值,利用缺失值处理的方法进行处理 -
平均值修正
可用前后两个观测值的平均值修正该异常值 -
不处理
直接在具有异常值的数据集上进行挖掘建模
通常情况下,在识别出异常值产生的潜在原因后,请确定这些异常值是否需要去除;如果这些数据是正确的,则可以在包含这些异常值的数据集中直接开展建模工作
数据集成
数据集成其本质是将多个数据源整合并存放在一致的数据存储中的过程。
1)实体识别
任务:统一不同的源数据的矛盾之处。
(1)同名异义
(2)异名同义
(3)单位不统一
2)冗余属性识别
数据集成常见地产生数据冗余问题如下:
(1)同一个属性在不同表中多次出现
(2)由于同一属性在不同表中的命名不一致而导致数据重复
数据变换
简单数据变换
x’=x2
x’=\sqrt{x}
x’=log(x)
▽f(x_k)=f(x_k+1)-f(x_k)
简单的函数变换常用来将不具有正态分布的数据变换成具有正态分布的数据。
为了避免由于指标间的量纲与取值范围差异带来的影响,在数据分析过程中需要对数据进行标准化处理。经过标准化处理后对数据按照一定比例进行缩放使其落入预设的范围内从而便于后续的数据综合分析工作
(1)最小-最大规范化(离差标准化)
通过线性变换处理原始数据后,在归一化过程中将数值范围缩放到0至1区间内。
转换公式:
X_{\text{norm}} = \frac{X - X_{\text{min}}}{X_{\text{max}} - X_{\text{min}}}
x*=\frac{x-min}{max-min}

(2)零-均值规范化(标准差标准化)
经过预处理后得到的数据具有零均值特征和单位标准差特性。
转换公式:
x^{'}_i = \frac{x_i - \mu}{\sigma}
其中\mu表示样本均值,
\mu = \frac{1}{m}\sum_{j=1}^{m}x_j
而\sigma表示样本标准差,
\sigma = \sqrt{\frac{1}{m}\sum_{j=1}^{m}(x_j - \mu)^2}.
x*=\frac{x-\overline{x}}{\sigma}
\overline{x}代表原始数据的均值,\sigma即原始数据的标准差,在当前应用中是最常用的数据标准化方法。
(3)小数定标准规划范
采用属性值的小数点位移方式实现归一化处理,在该方案中将所有属性值统一映射至区间[-1,1]内,并规定其小数点位移数量由对应属性的最大绝对值决定以确保数据范围的一致性。
转换公式:
x*=\frac{x}{10^k}
以下通过对一个矩阵使用上面3种规范化的方法处理。
#-*- coding: utf-8 -*-
#数据规范化
import pandas as pd
import numpy as np
datafile = 'normalization_data.xls' #参数初始化
data = pd.read_excel(datafile, header = None) #读取数据
(data - data.min())/(data.max() - data.min()) #最小-最大规范化
(data - data.mean())/data.std() #零-均值规范化
data/10**np.ceil(np.log10(data.abs().max())) #小数定标规范化
print(data)
AI写代码
结果如下:
data #数据源

(data - data.min())/(data.max() - data.min()) #最小-最大规范化

(data - data.mean())/data.std() #零-均值规范化

data/10**np.ceil(np.log10(data.abs().max())) #小数定标规范化

