4.4 数据规约
在大数据集上进行复杂的数据分析和挖掘需要很长的时间,数据规约产生更小但保持原数据完整性的新数据集。在规约后的数据集上进行分析和挖掘将更有效率。
数据规约的意义在于:
降低无效、错误数据对建模的影响,提高建模的准确性;
少量且具代表性的数据将大幅缩减数据挖掘所需的时间;
降低储存数据的成本。
4.4.1 属性规约
属性规约通过属性合并来创建新属性维数,或者直接通过删除不相关的属性(维)来减少数据维数,从而提高数据挖掘的效率、降低计算成本。属性规约的目标是寻找出最小的属性子集并确保新数据子集的概率分布尽可能地接近原来数据集的概率分布。属性规约常用方法见表4-6。
表4-6 属性规约常用方法
逐步向前选择、逐步向后删除和决策树归纳是属于直接删除不相关属性(维)方法。主成分分析是一种用于连续属性的数据降维方法,它构造了原始数据的一个正交变换,新空间的基底去除了原始空间基底下数据的相关性,只需使用少数新变量就能够解释原始数据中的大部分变异。在应用中,通常是选出比原始变量个数少,能解释大部分数据中的变量的几个新变量,即所谓主成分,来代替原始变量进行建模。
主成分分析[6]的计算步骤如下。
1)设原始变量X1,X2,…,Xp的n次观测数据矩阵为:
2)将数据矩阵按列进行中心标准化。为了方便,将标准化后的数据矩阵仍然记为X。
3)求相关系数矩阵R,R=(rij)p×p,rij的定义为:
其中,rij=rji,rii=1。
4)求R的特征方程det(R-λE)=0的特征根λ1≥λ2≥λp>0。
5)确定主成分个数m:,α根据实际问题确定,一般取80%。
6)计算m个相应的单位特征向量:
7)计算主成分:
在Python中,主成分分析的函数位于Scikit-Learn下:
sklearn.decomposition.PCA(n_components = None, copy = True, whiten = False)
参数说明:
(1)n_components
意义:PCA算法中所要保留的主成分个数n,也即保留下来的特征个数n。
类型:int或者string,缺省时默认为None,所有成分被保留。赋值为int,比如n_compo-nents=1,将把原始数据降到一个维度。赋值为string,比如n_components='mle',将自动选取特征个数n,使得满足所要求的方差百分比。
(2)copy
类型:bool,True或者False,缺省时默认为True。
意义:表示是否在运行算法时,将原始训练数据复制一份。若为True,则运行PCA算法后,原始训练数据的值不会有任何改变,因为是在原始数据的副本上进行运算;若为False,则运行PCA算法后,原始训练数据的值会改,因为是在原始数据上进行降维计算。
(3)whiten
类型:bool,缺省时默认为False。
意义:白化,使得每个特征具有相同的方差。
使用主成分分析降维的程序如代码清单4-6所示。
代码清单4-6 主成分分析降维代码
import pandas as pd #参数初始化 inputfile = '../data/principal_component.xls' outputfile = '../tmp/dimention_reducted.xls' #降维后的数据 data = pd.read_excel(inputfile, header = None) #读入数据 from sklearn.decomposition import PCA pca = PCA() pca.fit(data) pca.components_ #返回模型的各个特征向量 pca.explained_variance_ratio_ #返回各个成分各自的方差百分比
代码详见:demo/code/principal_component_analyze.py
运行上面的代码可以,得到下面的结果。
>>> pca.components_ #返回模型的各个特征向量 array([[-0.56788461, -0.2280431 , -0.23281436, -0.22427336, -0.3358618 , -0.43679539, -0.03861081, -0.46466998], [-0.64801531, -0.24732373, 0.17085432, 0.2089819 , 0.36050922, 0.55908747, -0.00186891, -0.05910423], [-0.45139763, 0.23802089, -0.17685792, -0.11843804, -0.05173347, -0.20091919, -0.00124421, 0.80699041], [-0.19404741, 0.9021939 , -0.00730164, -0.01424541, 0.03106289, 0.12563004, 0.11152105, -0.3448924 ], [ 0.06133747, 0.03383817, -0.12652433, -0.64325682, 0.3896425 , 0.10681901, -0.63233277, -0.04720838], [-0.02579655, 0.06678747, -0.12816343, 0.57023937, 0.52642373, -0.52280144, -0.31167833, -0.0754221 ], [ 0.03800378, -0.09520111, -0.15593386, -0.34300352, 0.56640021, -0.18985251, 0.69902952, -0.04505823], [ 0.10147399, -0.03937889, -0.91023327, 0.18760016, -0.06193777, 0.34598258, 0.02090066, -0.02137393]]) >>> pca.explained_variance_ratio_ #返回各个成分各自的方差百分比(贡献率) array([ 7.74011263e-01, 1.56949443e-01, 4.27594216e-02, 2.40659228e-02, 1.50278048e-03, 4.10990447e-04, 2.07718405e-04, 9.24594471e-05])
从上面的结果可以得到特征方程det(R-E)=0有7个特征根、对应的7个单位特征向量以及各个成分各自的方差百分比(也称为贡献率)。其中,方差百分比越大,说明向量的权重越大。
当选取前4个主成分时,累计贡献率已达到97.37%,说明选取前3个主成分进行计算已经相当不错了,因此可以重新建立PCA模型,设置n_components=3,计算出成分结果。
#接代码清单4-5 pca = PCA(3) pca.fit(data) low_d = pca.transform(data) #用它来降低维度 pd.DataFrame(low_d).to_excel(outputfile) #保存结果 pca.inverse_transform(low_d) #必要时可以用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维,关系式由公式(4-27)确定,同时这3维数据占了原始数据95%以上的信息。
4.4.2 数值规约
数值规约指通过选择替代的、较小的数据来减少数据量,包括有参数方法和无参数方法两类。有参数方法是使用一个模型来评估数据,只需存放参数,而不需要存放实际数据,例如回归(线性回归和多元回归)和对数线性模型(近似离散属性集中的多维概率分布)。无参数方法就需要存放实际数据,例如直方图、聚类、抽样(采样)。
(1)直方图
直方图使用分箱来近似数据分布,是一种流行的数据规约形式。属性A的直方图将A的数据分布划分为不相交的子集或桶。如果每个桶只代表单个属性值/频率对,则该桶称为单桶。通常,桶表示给定属性的一个连续区间。
这里结合实际案例来说明如何使用直方图做数值规约。图4-7所示的数据是某餐饮企业菜品的单价表(按人民币取整)从小到大排序。
3,3,5,5,5,8,8,10,10,10,10,15,15,15,22,22,22,22,22,22,22,22,22,25,25,25,25,25,25,25,25,25,30,30,30,30,30,35,35,35,35,35,39,39,40,40,40。
图4-7使用单桶显示了这些数据的直方图。为进一步压缩数据,通常让每个桶代表给定属性的一个连续值域。在图4-8中每个桶代表长度为13元(人民币)的价值区间。
图4-7 使用单桶的价格直方图—每个单桶代表一个价值/频率对
图4-8 价格的等宽直方图—每个桶代表一个价格区间/频率对
(2)聚类
聚类技术将数据元组(即记录,数据表中的一行)视为对象。它将对象划分为簇,使一个簇中的对象相互“相似”,而与其他簇中的对象“相异”。在数据规约中,用数据的簇替换实际数据。该技术的有效性依赖于簇的定义是否符合数据的分布性质。
(3)抽样
抽样也是一种数据规约技术,它用比原始数据小得多的随机样本(子集)表示原始数据集。假定原始数据集D包含N个元组,可以采用抽样方法对D进行抽样。下面介绍常用的抽样方法。
s个样本无放回简单随机抽样:从D的N个元组中抽取s个样本(s<N),其中D中任意元组被抽取的概率均为1/N,即所有元组的抽取是等可能的。
s个样本有放回简单随机抽样:该方法类似于无放回简单随机抽样,不同在于每次一个元组从D中抽取后,记录它,然后放回原处。
聚类抽样:如果D中的元组分组放入M个互不相交的“簇”,则可以得到s个簇的简单随机抽样,其中s<M。例如,数据库中元组通常一次检索一页,这样每页就可以视为一个簇。
分层抽样:如果D划分成互不相交的部分,称作层,则通过对每一层的简单随机抽样就可以得到D的分层样本。例如,可以得到关于顾客数据的一个分层样本,按照顾客的每个年龄组创建分层。
用于数据规约时,抽样最常用来估计聚集查询的结果。在指定的误差范围内,可以确定(使用中心极限定理)估计一个给定的函数所需的样本大小。通常样本的大小s相对于N非常小。而通过简单地增加样本大小,这样的集合可以进一步求精。
(4)参数回归
简单线性模型和对数线性模型可以用来近似描述给定的数据。(简单)线性模型对数据建模,使之拟合一条直线。以下介绍一个简单线性模型的例子,对对数线性模型只进行简单介绍。
把点对(2,5),(3,7),(4,9),(5,12),(6,11),(7,15),(8,18),(9,19),(11,22),(12,25),(13,24),(15,30),(17,35)规约成线性函数y=wx+b。即拟合函数y=2x+1.3线上对应的点可以近似看作已知点。如图4-9所示。
图4-9 将已知点规约成线性函数y=wx+b
其中,y的方差是常量13.44。在数据挖掘中,x和y是数值属性。系数2和1.3(称作回归系数)分别为直线的斜率和y轴截距。系数可以用最小二乘方法求解,它使数据的实际直线与估计直线之间的误差最小化。多元线性回归是(简单)线性回归的扩充,允许响应变量y建模为两个或多个预测变量的线性函数。
对数线性模型:用来描述期望频数与协变量(指与因变量有线性相关并在探讨自变量与因变量关系时通过统计技术加以控制的变量)之间的关系。考虑期望频数m取值在0到正无穷之间,故需要进行对数变换为f(m)=lnm,使它的取值在-∞与∞之间。
对数线性模型:
对数线性模型一般用来近似离散的多维概率分布。在一个n元组的集合中,每个元组可以看作是n维空间中的一个点。可以使用对数线性模型基于维组合的一个较小子集,估计离散化的属性集的多维空间中每个点的概率,这使得高维数据空间可以由较低维空间构造。因此,对数线性模型也可以用于维规约(由于低维空间的点通常比原来的数据点占据较少的空间)和数据光滑(因为与较高维空间的估计相比,较低维空间的聚集估计较少受抽样方差的影响)。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论