赞
踩
本文将接上文提到,数据预处理中的数据违约、主要预处理函数,例如主成分分析法。
在大数据集上进行复杂的数据分析和挖掘需要很长的时间,数据规约产生更小但保持原数据完整性的新数据集。在规约后的数据集上进行分析和挖掘将更有效率。
数据规约的意义在于:
a、属性规约
属性规约通过属性合并来创建新属性维数,或者直接通过删除不相关的属性(维)来减少数据维数,从而提高数据挖掘的效率、降低计算成本。属性规约的目标是寻找出最小的属性子集并确保新数据子集的概率分布尽可能地接近原来数据集的概率分布。
常见的方法:
属性规约的方法 | 方法描述 |
---|---|
合并属性 | 将一些旧属性合为新属性 |
逐步向前选择 | 从一个空属性集开始,每次从原来属性集合中选择一个当前最优的属性添加到 当前属性子集中。直到无法选择出最优属性或满足一定阈值约束为止 |
逐步向后删除 | 从一个全属性集开始,每次从当前属性子集中选择一个当前最差的属性并将其从当前属性子集中消去。直到无法选择出最差属性为止或满足一定阈值约束为止 |
决策树归纳 | 利用决策树的归纳方法对初始数据进行分类归纳学习,获得一个初始决策树, 所有没有出现在这个决策树上的属性均可认为是无关属性,因此将这些属性从初始集合中删除,就可以获得一个较优的属性子集 |
主成分分析 | 用较少的变量去解释原始数据中的大部分变量,即将许多相关性很 高的变量转化成彼此相互独立或不相关的变量 |
逐步向前选择、逐步向后删除和决策树归纳是属于直接删除不相关属性(维)方法。主成分分析是一种用 于连续属性的数据降维方法,它构造了原始数据的一个正交变换,新空间的基底去除了原始空间基底下数据的相关性,只需使用少数新变量就能够解释原始数据中的大部分变异。在应用中,通常是选出比原始变量个数少,能解释大部分数据中的变量的几个新变量,即所谓主成分,来代替原始变量进行建模。
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
意义:白化,使得每个特征具有相同的方差
实例:
主成分分析降维
#-*- coding: utf-8 -*- #主成分分析 降维 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) print(pca.components_) #返回模型的各个特征向量 print("*"*50) print(pca.explained_variance_ratio_) #返回各个成分各自的方差百分比(贡献率)
[[ 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]] ************************************************** [7.74011263e-01 1.56949443e-01 4.27594216e-02 2.40659228e-02 1.50278048e-03 4.10990447e-04 2.07718405e-04 9.24594471e-05] Process finished with exit code 0
对上述代码进行续写:
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()函数覆盖数据
print(low_d)
结果:
降维效果如下:
[[ 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]] Process finished with exit code 0
原始数据从8维降到了3维,同时这3维数据占了原始数据95%以上的信息。
b、数值规约
数值规约指通过选择替代的、较小的数据来减少数据量,包括有参数方法和无参数方法两类。有参数方法是使用一个模型来评估数据,只需存放参数,而不需要存放实际数据,例如回归(线性回归和多元回归)和对数线性模型(近似离散属性集中的多维概率分布)。无参数方法就需要存放实际数据,例如直方图、聚类、抽样(采样)。
(1)直方图
直方图使用分箱来近似数据分布,是一种流行的数据规约形式。属性A的直方图将A的数据分布划分为不相交的子集或桶。如果每个桶只代表单个属性值/频率对,则该桶称为单桶。通常,桶表示给定属性的一个连续区间。
(2)聚类
聚类技术将数据元组(即记录,数据表中的一-行) 视为对象。它将对象划分为簇,使一个簇中的对象相互“相似”,而与其他簇中的对象“相异”。在数据规约中,用数据的簇替换实际数据。该技术的有效性依赖于簇的定义是否符合数据的分布性质。
(3)抽样
抽样也是一种数据规约技术,它用比原始数据小得多的随机样本(子集)表示原始数据集。假定原始数据集D包含N个元组,可以采用抽样方法对D进行抽样。
(4)参数回归
简单线性模型和对数线性模型可以用来近似描述给定的数据。(简单)线性模型对数据
建模,使之拟合一条直线。
函数名 | 函数功能 | 所属拓展库 |
---|---|---|
interpolate | 一维、高维数据插值 | Scipy |
unique | 去除数据中的重复元素,得到单值元素列表,它是对象的方法名 | Pandas/Numpy |
isnull | 判断是否为空 | Pandas |
notnull | 判断是否非空 | Pandas |
PCA | 对指标变量矩阵进行主成分分析 | Scikit-Learn |
random | 生成随机矩阵 | Numpy |
(1)interpolate
功能: interpolate是Scipy的一一个子库,包含了大量的插值函数,如拉格朗日插值、样条插值、高维插值等。使用前需要用from scipy.interpolate import *引入相应的插值函数,可以根据需要到官网查找对应的函数名。
使用格式:
f = scipy.interpolate.lagrange(x,y)
这里仅仅展示了一维数据的拉格朗日插值的命令,其中x, y为对应的自变量和因变量数据。插值完成后,可以通过f(a) 计算新的插值结果。类似的还有样条插值、多维数据插值等,此处不一一展示。
(2)unique
功能: 去除数据中的重复元素,得到单值元素列表。它既是Numpy库的一个函数(np.unique()),也是Series对象的一个方法。
使用格式:
实例:
求向量A中的单值元素,并返回相关索引
D = pd.Series([1, 1, 2, 3, 5])
print(D.unique())
print(np.unique(D))
结果:
[1 2 3 5]
[1 2 3 5]
Process finished with exit code 0
(3) isnull / notnull
功能: 判断每个元素是否空值 / 非空值
使用格式: D.isnull()/ D.notnull()。这里的D要求是Series对象,返回一个布尔Series。可以通过D [ D.isnull()]或D[D.notnull()]找出D中的空值 / 非空值。
(4)random
功能: random是Numpy的一个子库(Python本身也自带了random,但Numpy的更加强大),可以用该库下的各种函数生成服从特定分布的随机矩阵,抽样时可使用。
使用格式:
(5)PCA
功能: 对指标变量矩阵进行主成分分析,使用前需要用from sklearn.decomposition import PCA引入该函数。
使用格式: model = PCA()。 注意,Scikit-Learn 下的PCA是一个建模式的对象,也就是说,一般的流程是建模,然后是训练model.fit(D),D为要进行主成分分析的数据矩阵,训练结束后获取模型的参如.components_获取特征向量,以及.explained_ variance. _ratio_获取各个属性的贡献率等。
实例:
使用PCA()对一个10 * 4 维的随机矩阵进行主成分分析
from sklearn.decomposition import PCA
D = np.random.randn(10, 4)
pca = PCA()
pca.fit(D)
PCA(copy=True, n_components=None, whiten=False)
print(pca.components_) # 返回模型的各个特征向量
print("*" * 50)
print(pca.explained_variance_ratio_) # 返回各个成分个字的方差百分比
结果:
[[-0.73391691 0.22922579 -0.13039917 0.62595332]
[-0.41771778 0.57241446 -0.02724733 -0.70506108]
[ 0.22012336 0.49807219 0.80277934 0.24293029]
[-0.48828633 -0.60968952 0.58120475 -0.22815825]]
**************************************************
[0.50297117 0.28709267 0.14575757 0.06417859]
Process finished with exit code 0
本次介绍了数据预处理的4个主要任务:数据清洗、数据集成、数据变换和数据规约。数据清洗主要介绍了对缺失值和异常值的处理,延续了第三天的缺失值和异常值分析的内容,本次所介绍的处理缺失值的方法分为3类:删除记录、数据插补和不处理,处理异常值的方法有删除含有异常值的记录、不处理、平均值修正和视为缺失值;数据集成是合并多个数据源中的数据,并存放到一个数据存储的过程,对该部分的介绍从实体识别问题和冗余属性两个方面进行;数据变换介绍了如何从不同的应用角度对已有属性进行函数变换;数据规约从属性(纵向)规约和数值(横向)规约两个方面介绍了如何对数据进行规约,使挖掘的性能和效率得到很大的提高。通过对原始数据进行相应的处理,将为后续挖掘建模提供良好的数据基础。
★学习Python数据挖掘纯属个人爱好,如有不足或错误请指出谢谢。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。