Python数据分析与数据挖掘day5

初探Python数据分析day5

   自我介绍一下,我是一名大四应届毕业生对数据挖掘方面很感兴趣,最近开始着手系统学习,在这里与大家分享我的学习笔记与心得,如果不足或错误请大家指出,感谢。

4、数据违约

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

数据规约的意义在于:

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

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)参数回归

​    简单线性模型和对数线性模型可以用来近似描述给定的数据。(简单)线性模型对数据
建模,使之拟合一条直线。

5、Python主要数据预处理函数

函数名 函数功能 所属拓展库
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对象的一个方法。

使用格式:

  • np.unique(D) ,D是一维数据,可以是list、array、Series
  • D.unique(),D是Pandas的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的更加强大),可以用该库下的各种函数生成服从特定分布的随机矩阵,抽样时可使用。

使用格式:

  • np.random.randn(k, m, n,…生成一个k * m * n *… 随机矩阵,其元素均匀分布在区间(0,1)上
  • np.random.randn(k, m, n…)_.生成一个k * m * n * …随机矩阵,其元素服从标准正态分布

(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

6、小结

​    本次介绍了数据预处理的4个主要任务:数据清洗、数据集成、数据变换和数据规约数据清洗主要介绍了对缺失值和异常值的处理,延续了第三天的缺失值和异常值分析的内容,本次所介绍的处理缺失值的方法分为3类删除记录、数据插补和不处理,处理异常值的方法有删除含有异常值的记录、不处理、平均值修正和视为缺失值数据集成是合并多个数据源中的数据,并存放到一个数据存储的过程,对该部分的介绍从实体识别问题和冗余属性两个方面进行;数据变换介绍了如何从不同的应用角度对已有属性进行函数变换;数据规约从属性(纵向)规约和数值(横向)规约两个方面介绍了如何对数据进行规约,使挖掘的性能和效率得到很大的提高。通过对原始数据进行相应的处理,将为后续挖掘建模提供良好的数据基础。


★学习Python数据挖掘纯属个人爱好,如有不足或错误请指出谢谢。

发布了25 篇原创文章 · 获赞 5 · 访问量 1503

猜你喜欢

转载自blog.csdn.net/weixin_43656359/article/details/103306010