python数据分析与挖掘实战—第4章(数据预处理)

数据预处理一方面要提高数据的质量,另一方面要让数据更好地适应特点的挖掘技术或工具
在这里插入图片描述

数据处理的主要内容包括:

  • 数据清洗
  • 数据集成
  • 数据变换
  • 数据归约
    在这里插入图片描述

4.1 数据清洗

数据清洗主要是删除原始数据集中的无关数据、重复数据,平滑噪声数据,筛选掉与挖掘主题无关的数据,处理缺失值、异常值等。

4.1.1 缺失值处理

  • 删除记录
  • 数据插补
  • 不处理

删除记录在缺失值所占比例比较小的情况下,这一方法十分有效。然而,这种方法却又很大的局限性,它是以减少历史数据来换取数据的完备,会造成资源的大量浪费,将丢弃了大量隐藏在这些记录中的信息。在数据集本来就包含很少纪律的情况下,删除少量记录可能会严重影响到分析结果的客观性和正确性。

常用的插补方法:

插补方法方法描述
均值/中位数/众数插补根据属性值的类型,用该属性取值的平均数/中位数/众数进行插补
固定值将缺失的属性值用一个常量替换
最近邻插补在记录中找到与缺失样本最接近的样本的该属性值插补
回归方法对带有缺失值的变量,根据已有数据和与其有关的其他变量(因变量)的数据建立拟合模型来预测缺失值的属性值
插值法利用已知点建立合适的插值函数f(x),未知值由对应点x求出的函数值近似代替

4.1.2 异常值处理

在数据预处理时,异常值是否剔除,需视情况而定,因为有些异常值可能蕴含着有用的信息。
异常值处理常用方法:

异常值处理方法方法描述
删除含有异常值的记录直接将含有异常值的记录删除
视为缺失值将异常值视为缺失值,利用缺失值处理的方法进行处理
平均值修正可用前后两个观测值的平均值修正该异常值
不处理直接在具有异常值的数据集上进行挖掘建模

在很多情况下,要先分析异常值出现的可能原因,再判断异常值是否应该舍弃,如果是正确的数据,可以直接在具有异常值的数据集上进行挖掘建模。

4.2 数据集成

数据挖掘需要的数据往往分布在不通过的数据源中,数据集成就是将多个数据源合并存放在一个一致的数据存储(如数据仓库)中的过程。

4.2.1 实体识别

实体识别是指从不同数据源识别出现实世界的实体,它的任务是统一不同源数据的矛盾之处,常见形式如下:

  • 同名异义
  • 异名同义
  • 单位不统一

4.2.2 冗余属性识别

  • 同一属性多次出现
  • 同一属性命名不一致导致重复
    对于冗余属性要先分析,检测到后再将其删除,有些冗余属性可以用相关分析检测。

4.3 数据变换

数据变换主要是对数据进行规范化处理,将数据转换成“适当的”形式,以适用于挖掘任务及算法的需要。

4.3.1 简单函数变换

简单函数变换是对原始数据进行某些数学函数变换,常用的变换包括平方、开方、取对数、差分运算等。

4.3.2 规范化

数据规范化处理是数据挖掘的一项基础工作。不同评价指标往往具有不同的量纲,数值间的差别可能很大,不进行处理可能会影响到数据分析的结果。为了消除指标之间的量纲和取值范围差异的影响,需要进行标准化处理,将数据按照比例进行缩放,使之落入一个特定的区域。

  • 最小-最大规范化
  • 零-均值规范化
  • 小数定标规范化 :通过移动属性值的小数位数,将属性值映射到[-1,1]之间,移动的小数位数取决于属性值绝对值的最大值。
#数据规范化
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

4.3.3 连续属性离散化

连续属性的离散化就是在数据的取值范围内设定若干个离散的划分点,将取值范围划分为一些离散化的区间,最后用不同的符号或整数值代表落在每个子区间中的数据值。

  • 等宽法
    将属性的值域分成具有相同宽度的区间,区间的个数由数据本身的特点决定,或者由用户指定,类似于制作频率分布表

  • 等频法
    将相同数量的记录放进每个区间

  • 基于聚类分析的方法
    首先将连续属性的值用聚类算法进行聚类,然后再将聚类得到的簇进行处理,合并到一个簇的连续属性值并做同意标记。聚类分析的离散化方法也需要用户指定簇的个数,从而决定产生的区间数。

注:
等宽法和等频法,简单易于操作,但需要人为地规定划分区间的个数。同时,等宽法的缺点在于它对离群点比较敏感,倾向于不均匀地把属性值分布到各个区间;等频法虽然避免了上述问题的产生,却可能将相同的数据值分到不同区间以满足每个区间中固定的数据个数。
等宽离散化:

#数据离散化
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,再进行建模。

4.3.4 属性构造

在数据挖掘过程中,为了提取更有用的信息,挖掘更深层次的模式,提高挖掘结果的精度,我们需要利用已有的属性集构造出新的属性,并加入到现有的属性集合中。

4.3.5 小波变换

能够刻画某个问题的特征量往往是隐含在一个信号中的某个或者某些分量中,小波变换可以把非平稳信号分解为表达不同层次、不同频带信息的数据序列,即小波系数。选取适当的小波系数,即完成了信号的特征提取。

4.4 数据规约

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

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

4.4.1 属性规约

属性规约通过属性合并来创建新属性维数,或者直接通过删除不相关的属性(维)来减少数据维数,从而提高数据挖掘的效率、降低计算成本。属性规约的目标是寻找出最小的属性子集并确保新数据子集的概率分布尽可能地接近原来数据集的概率分布。

属性规约方法方法描述
合并属性将一些旧属性合并为新属性
逐步向前选择从一个空属性集开始,每次从原来属性集合中选择一个当前最优的属性添加到当前属性子集中。直到无法选择出最优属性或满足一定阈值约束为止
逐步向后选择从一个全属性集开始,每次从原来属性集合中选择一个当前最差的属性并将其从当前属性子集中消去。直到无法选择出最差属性或满足一定阈值约束为止
决策树归纳利用决策树的归纳方法对初始数据集进行分类归纳学习,获得一个初始决策树,所有没有出现在这个决策树上的属性均可认为是无关属性,因此将这些属性从初始集合中删除,就可以获得一个较优的属性子集
主成分分析用较少的变量是解释原始数据中的大部分变量,即将许多相关性很高的变量转化成彼此相互独立或不相关的变量
  • 逐步向前选择、逐步向后删除和决策树归纳是属于直接删除不相关属性(维)的方法
  • 主成分分析是一种用于连续属性的数据降维方法
    主成分分析降维:
#主成分分析降维
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.4.2 数值规约

数值规约指通过选择替代的、较小的数据来减少数据量,包括有参数方法和无参数方法。

  • 有参数方法:使用一个模型来评估数据,只需存放参数,而不需要存放实际数据,例如回归和对数线性模型
  • 无参数方法:需要存放实际数据,例如直方图、聚类、抽样(采样)

4.5 小结

数据预处理的4个主要任务:数据清洗、数据集成、数据变换和数据规约。

  • 数据清洗主要介绍了对缺失值和异常值的处理,处理缺失值的方法分为3类:删除记录、数据插补和不处理,处理异常值的方法有:删除含有异常值的记录、不处理、平均值修正和视为缺失值。
  • 数据集成是合并多个数据源中的数据,并存放到一个数据存储的过程,有实体识别和冗余属性两个方面。
  • 数据变换包括对已有属性进行函数变换、规范化、连续属性离散化和小波变换。
  • 数据规约从属性(纵向)和数值(横向)规约两个方面对数据进行规约,使挖掘的性能和效率得到很大的提高。通过对原始数据进行相应的处理,将为后续挖掘建模提供良好的数据基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值