数据预处理一方面要提高数据的质量,另一方面要让数据更好地适应特点的挖掘技术或工具
数据处理的主要内容包括:
数据清洗主要是删除原始数据集中的无关数据、重复数据,平滑噪声数据,筛选掉与挖掘主题无关的数据,处理缺失值、异常值等。
删除记录在缺失值所占比例比较小的情况下,这一方法十分有效。然而,这种方法却又很大的局限性,它是以减少历史数据来换取数据的完备,会造成资源的大量浪费,将丢弃了大量隐藏在这些记录中的信息。在数据集本来就包含很少纪律的情况下,删除少量记录可能会严重影响到分析结果的客观性和正确性。
常用的插补方法:
插补方法 | 方法描述 |
---|---|
均值/中位数/众数插补 | 根据属性值的类型,用该属性取值的平均数/中位数/众数进行插补 |
固定值 | 将缺失的属性值用一个常量替换 |
最近邻插补 | 在记录中找到与缺失样本最接近的样本的该属性值插补 |
回归方法 | 对带有缺失值的变量,根据已有数据和与其有关的其他变量(因变量)的数据建立拟合模型来预测缺失值的属性值 |
插值法 | 利用已知点建立合适的插值函数f(x),未知值由对应点x求出的函数值近似代替 |
在数据预处理时,异常值是否剔除,需视情况而定,因为有些异常值可能蕴含着有用的信息。
异常值处理常用方法:
异常值处理方法 | 方法描述 |
---|---|
删除含有异常值的记录 | 直接将含有异常值的记录删除 |
视为缺失值 | 将异常值视为缺失值,利用缺失值处理的方法进行处理 |
平均值修正 | 可用前后两个观测值的平均值修正该异常值 |
不处理 | 直接在具有异常值的数据集上进行挖掘建模 |
在很多情况下,要先分析异常值出现的可能原因,再判断异常值是否应该舍弃,如果是正确的数据,可以直接在具有异常值的数据集上进行挖掘建模。
数据挖掘需要的数据往往分布在不通过的数据源中,数据集成就是将多个数据源合并存放在一个一致的数据存储(如数据仓库)中的过程。
实体识别是指从不同数据源识别出现实世界的实体,它的任务是统一不同源数据的矛盾之处,常见形式如下:
数据变换主要是对数据进行规范化处理,将数据转换成“适当的”形式,以适用于挖掘任务及算法的需要。
简单函数变换是对原始数据进行某些数学函数变换,常用的变换包括平方、开方、取对数、差分运算等。
数据规范化处理是数据挖掘的一项基础工作。不同评价指标往往具有不同的量纲,数值间的差别可能很大,不进行处理可能会影响到数据分析的结果。为了消除指标之间的量纲和取值范围差异的影响,需要进行标准化处理,将数据按照比例进行缩放,使之落入一个特定的区域。
#数据规范化
import pandas as pd
import numpy as np
datafile = 'G:/Python数据分析与挖掘实战/chapter4/demo/data/normalization_data.xls' #参数初始化
data = pd.read_excel(datafile, header=None) #读取数据
print(data)
print((data - data.min()) / (data.max() - data.min())) #最小-最大规范化
print((data -data.mean()) / (data.std())) #零-均值规范化
print(data / 10**np.ceil(np.log10(data.abs().max()))) #小数定标规范化
输出结果:
原数据:
0 1 2 3
0 78 521 602 2863
1 144 -600 -521 2245
2 95 -457 468 -1283
3 69 596 695 1054
4 190 527 691 2051
5 101 403 470 2487
6 146 413 435 2571
最小-最大规范化:
0 1 2 3
0 0.074380 0.937291 0.923520 1.000000
1 0.619835 0.000000 0.000000 0.850941
2 0.214876 0.119565 0.813322 0.000000
3 0.000000 1.000000 1.000000 0.563676
4 1.000000 0.942308 0.996711 0.804149
5 0.264463 0.838629 0.814967 0.909310
6 0.636364 0.846990 0.786184 0.929571
零-均值规范化:
0 1 2 3
0 -0.905383 0.635863 0.464531 0.798149
1 0.604678 -1.587675 -2.193167 0.369390
2 -0.516428 -1.304030 0.147406 -2.078279
3 -1.111301 0.784628 0.684625 -0.456906
4 1.657146 0.647765 0.675159 0.234796
5 -0.379150 0.401807 0.152139 0.537286
6 0.650438 0.421642 0.069308 0.595564
小数定标规范化:
0 1 2 3
0 0.078 0.521 0.602 0.2863
1 0.144 -0.600 -0.521 0.2245
2 0.095 -0.457 0.468 -0.1283
3 0.069 0.596 0.695 0.1054
4 0.190 0.527 0.691 0.2051
5 0.101 0.403 0.470 0.2487
6 0.146 0.413 0.435 0.2571
连续属性的离散化就是在数据的取值范围内设定若干个离散的划分点,将取值范围划分为一些离散化的区间,最后用不同的符号或整数值代表落在每个子区间中的数据值。
等宽法
将属性的值域分成具有相同宽度的区间,区间的个数由数据本身的特点决定,或者由用户指定,类似于制作频率分布表
等频法
将相同数量的记录放进每个区间
基于聚类分析的方法
首先将连续属性的值用聚类算法进行聚类,然后再将聚类得到的簇进行处理,合并到一个簇的连续属性值并做同意标记。聚类分析的离散化方法也需要用户指定簇的个数,从而决定产生的区间数。
注:
等宽法和等频法,简单易于操作,但需要人为地规定划分区间的个数。同时,等宽法的缺点在于它对离群点比较敏感,倾向于不均匀地把属性值分布到各个区间;等频法虽然避免了上述问题的产生,却可能将相同的数据值分到不同区间以满足每个区间中固定的数据个数。
等宽离散化:
#数据离散化
import pandas as pd
import numpy as np
datafile = 'G:/Python数据分析与挖掘实战/chapter4/demo/data/discretization_data.xls' #参数初始化
data = pd.read_excel(datafile) #读取数据
data = data[u'肝气郁结证型系数'].copy()
k = 4
d1 = pd.cut(data, k, labels=range(k)) #等宽离散化,各个类别依次命名为0,1,2,3
def cluster_plot(d, k): #自定义作图函数来显示聚类结果
import matplotlib.pyplot as plt
%matplotlib
plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
plt.figure(figsize=(8,3))
for j in range(0, k):
plt.plot(data[d==j], [j for i in d[d==j]], 'o')
plt.ylim(-0.5, k-0.5)
return plt
cluster_plot(d1, k).show()
#等频率离散化
w = [1.0*i/k for i in range(k+1)]
w = data.describe(percentiles = w)[4:4+k+1] #使用describe函数自动计算分位数
w[0] = w[0]*(1-1e-10)
d2 = pd.cut(data, w, labels=range(k))
cluster_plot(d2, k).show()
from sklearn.cluster import KMeans
kmodel = KMeans(n_clusters = k, n_jobs=4) #建立模型,n_jobs是并行数,一般等于CPU数较好
kmodel.fit(data.values.reshape((len(data),1))) #训练模型
c = pd.DataFrame(kmodel.cluster_centers_).sort_values(0) #输出聚类中心,并且排序
w = c.rolling(2).mean().iloc[1:] #相邻两项求中点,作为边界点
w = [0] + list(w[0]) + [data.max()] #把首末边界点加上
d3 = pd.cut(data, w, labels=range(k))
分别用等宽法、等频法和(一维)聚类对数据进行离散化,将数据分为4类,然后将每一类记为同一标识,如分别即位A1、A2、A3、A4,再进行建模。
在数据挖掘过程中,为了提取更有用的信息,挖掘更深层次的模式,提高挖掘结果的精度,我们需要利用已有的属性集构造出新的属性,并加入到现有的属性集合中。
能够刻画某个问题的特征量往往是隐含在一个信号中的某个或者某些分量中,小波变换可以把非平稳信号分解为表达不同层次、不同频带信息的数据序列,即小波系数。选取适当的小波系数,即完成了信号的特征提取。
在大数据集上进行复杂的数据分析和挖掘需要很长的时间,数据规约产生更小但保持原数据完整性的新数据集。在规约后的数据集上进行分析和挖掘将更有效率。
属性规约通过属性合并来创建新属性维数,或者直接通过删除不相关的属性(维)来减少数据维数,从而提高数据挖掘的效率、降低计算成本。属性规约的目标是寻找出最小的属性子集并确保新数据子集的概率分布尽可能地接近原来数据集的概率分布。
属性规约方法 | 方法描述 |
---|---|
合并属性 | 将一些旧属性合并为新属性 |
逐步向前选择 | 从一个空属性集开始,每次从原来属性集合中选择一个当前最优的属性添加到当前属性子集中。直到无法选择出最优属性或满足一定阈值约束为止 |
逐步向后选择 | 从一个全属性集开始,每次从原来属性集合中选择一个当前最差的属性并将其从当前属性子集中消去。直到无法选择出最差属性或满足一定阈值约束为止 |
决策树归纳 | 利用决策树的归纳方法对初始数据集进行分类归纳学习,获得一个初始决策树,所有没有出现在这个决策树上的属性均可认为是无关属性,因此将这些属性从初始集合中删除,就可以获得一个较优的属性子集 |
主成分分析 | 用较少的变量是解释原始数据中的大部分变量,即将许多相关性很高的变量转化成彼此相互独立或不相关的变量 |
#主成分分析降维
import pandas as pd
from sklearn.decomposition import PCA
inputfile = 'G:/Python数据分析与挖掘实战/chapter4/demo/data/principal_component.xls'
outputfile = 'G:/Python数据分析与挖掘实战/chapter4/demo/tmp/dimention_reducted.xls' #降维后的数据
data = pd.read_excel(inputfile, header=None) #读入数据
pca = PCA()
pca.fit(data)
pca.components_ #返回模型的各个特征向量
pca_ratio = ['{:f}'.format(item) for item in pca.explained_variance_ratio_] #返回各个成分各自的方差百分
pca_ratio
输出结果:
['0.774011',
'0.156949',
'0.042759',
'0.024066',
'0.001503',
'0.000411',
'0.000208',
'0.000092']
当选取前3个主成分时,累计贡献率已达到97.37%,说明选取前3个主成分进行计算已经相当不错了,因此可以重新建立PCA模型,设置n_components=3,
计算出成分结果。
#选取3个主成分
pca = PCA(3)
pca.fit(data)
low_d = pca.transform(data) #降低维度
pd.DataFrame(low_d).to_excel(outputfile) #保存结果
low_d
pca.inverse_transform(low_d) #必要时可以复原数据
输出结果:
array([[ 8.19133694, 16.90402785, 3.90991029],
[ 0.28527403, -6.48074989, -4.62870368],
[-23.70739074, -2.85245701, -0.4965231 ],
[-14.43202637, 2.29917325, -1.50272151],
[ 5.4304568 , 10.00704077, 9.52086923],
[ 24.15955898, -9.36428589, 0.72657857],
[ -3.66134607, -7.60198615, -2.36439873],
[ 13.96761214, 13.89123979, -6.44917778],
[ 40.88093588, -13.25685287, 4.16539368],
[ -1.74887665, -4.23112299, -0.58980995],
[-21.94321959, -2.36645883, 1.33203832],
[-36.70868069, -6.00536554, 3.97183515],
[ 3.28750663, 4.86380886, 1.00424688],
[ 5.99885871, 4.19398863, -8.59953736]])
原始数据从8维被降维到了3维,同时这3维数据占了原数据95%以上的信息。
数值规约指通过选择替代的、较小的数据来减少数据量,包括有参数方法和无参数方法。
数据预处理的4个主要任务:数据清洗、数据集成、数据变换和数据规约。