数据数理和分析前需要进行数据的选择 现实中的数据往往有多个列和行 Python中常常用一两个函数就可以选择出其中最有代表性的部分列和行 很厉害吧,让我们来看一下具体它们是怎么样来实现的 数据规约data reduction是数据预处理中的重要步骤 现实中我们遇到的数据集的维度 也就是属性或特征有时会有几百维 高维度会带来了维数灾难 会让数据样本稀疏 稀疏简单理解就是样本中出现大量的0 以及距离计算困难等问题 所以我们需要通过降维 或称为属性规约来缓解维数灾难 除了维度 数据中包含的记录数也常常会非常多 因此我们也常需要从数据集中选择部分数据 这被称为数值规约 属性规约和数值规约是数据规约的两个部分 对属性和数值进行规约能获得一个 比原数据集小的多的规约表示 当然这是理想状态 不管是选择部分属性还是部分数据 都希望能够接近原数据的完整性 在规约后的数据集上挖掘 能够产生近乎相同的分析结果 属性规约常用的方法有 向前选择、向后删除、决策树和PCA 向前选择是从一个空属性集开始 每次选一个当前最优的属性加入 直到选不到最优属性 或满足一定的阈值约束后停止 向后删除是相反的 是从当前属性集中选择一个最差的删除 直到无法删除或满足一定的阈值后停止 决策树是机器学习专门的算法 PCA也就是主成分分析 它是最常用的线性降维方法 它通过某种线性投影将高维数据映射到低维空间表示 并且期望在所投影的维度上数据的方差最大 选择出较少的维度也就是主成分 忽略对数据描述不重要的成分 并可以尽可能多地保留原始数据的特征 数值规约包含有参方法和无参方法 有参方法使用模型来评估数据 只需存放参数而不需要存放实际的数据 常用的有回归法和对数线性模型 无参方法则需要存放实际的数据 常用的有直方图histogram、聚类和抽样方法 同样基于课程基础考虑 我们在本小节讲述属性规约中的PCA算法 和数值规约无参法中的直方图和抽样方法 先来看PCA主成分分析方法 具体的数学计算步骤大家可以自己去探索 我们主要来看如何利用Python中的函数 实现PCA算法完成降维 在Python中 可以利用sklearn.decomposition模块中的PCA()函数 来进行属性的规约 来进行实际操作 首先导入PCA()函数 这里数据我们还是使用波士顿房价数据集 先将不包含目标属性的数据做标准化处理 然后调用PCA()函数 PCA()函数的参数中最常用的是n_components 可以用它来设定 算法中要保留的主成分个数也就是特征数 默认值为None 即保留所有的特征 如果将它的值设为2 表示只保留2个特征 表示只保留2个特征 而如果将它的值设为'mle' 则算法将自动选择满足所要求的方差百分比的特征个数 这里我们把要保留的主成分个数设为5 然后用数据X训练PCA模型 用fit()方法 再来这里的一个非常重要的属性 属性explained_variance_ratio_返回的是 各个成分各自的方差百分比也就是变量的方差贡献率 方差百分比越大向量的权重就越大 来计算一下 和是0.8073 也就是说前5个成分解释了数据中80.73%的变化 而如果发现少于实际选择的成分 个数的累计贡献率已经很高 那就可以根据合理的 主成分个数重新设定n_components的值来计算 例如如果设置了n_components参数值为5 但计算发现3个特征就可以解释数据中99%的变化 那参数值设为3就可以 当然也可以将n_components参数的值 设为'mle'让算法自动选择主成分 我们来试一下 可以看到13个特征选择了12个 算一下累计贡献率 0.995 真的很严格 介绍完属性规约我们来看数值规约 先来看直方图 直方图与条形图外形很相似 但概念不同 直方图的本质就是分箱 前面我们介绍连续属性离散化时讲过分箱 先来用一组数据绘制一个直方图 基于图来理解它的本质 例如基于这样的50个[1,10]之间的随机整数 例如基于这样的50个[1,10]之间的随机整数 来实际操作一下 先来生成50个随机整数 然后基于这组数据用pyplot模块中的hist()函数 来绘制一个直方图 观察生成的直方图 猜一猜X轴和Y轴的值和含义 我们对应着数据来看 是不是已经看出来了 直方图的每一个箱子 也称为桶其实代表了一个属性-频率对 例如这里代表属性9 对应的箱子高度也就是Y值为3 就表示9在数据集中出现了3次 用直方图规约数据就是把图中的箱子个数 由观测值的数量n减少到k个 让数据变成一块一块的呈现 进一步hist()函数也有如之前pandas中的cut() 和qcut()函数一样的一个bins参数 bins的含义与之前讲的类似 例如我们要将数据data放进2个箱子中 我们可以这样来设置bins的值 可以利用linspace()函数找到2个箱子的3个分割点 从最小值到最大值 包含终止值 可以把bins输出来看一下 bins的值是[1, 5, 9] 如果把这个值传给hist()函数的bins参数 会如何解释呢 是这样的 基于1,5,9这3个点把区间分成两个 一个是[1,5) 另一个是[5,9] 左闭右开 起始值和终止值都包含在内 当然如果能够确定分割点 也可以直接写出这样的列表 我们利用新的bins参数值来重新绘制直方图 并且设定箱子的宽度和边缘颜色 可以看到 数据被分到了两个箱子中 属性1、2、3、4大约有27~28个 属性5、6、7、8、9大约有22~23个 可以对比看一下 大家也可以试一试将数据装到例如3个箱子中的做法 抽样是数值规约中非常常见的做法 通过从原始数据集中 随机采集样本构成子集 从而降低数据规模达到数据规约的目的 常见的方式有随机抽样 聚类抽样和分层抽样 随机抽样又分为不放回和放回两种 思想与我们之前介绍的numpy 数组的不放回和放回随机抽样一样 分层抽样则是指将数据集划分成互不相交的部分也就是层 然后对每一层进行随机抽样获得结果 以iris数据集为基础来说 DataFrame对象的随机抽样和分层抽样的方法 先来看随机抽样 可以使用DataFrame对象的sample()方法 方便地实现随机抽样 其中replace参数值设为True表示有放回 每一次抽样可能选到相同的记录 默认replace参数值为False 表示无放回 每一次抽样不会选到相同的记录 来实际试一下 先来产生数据 将iris数据转换成一个DataFrame 利用DataFrame对象的sample()方法 随机抽样时常使用两个参数 第一个是n 用来指定抽样记录的个数 例如要不放回抽样10条记录 只要写成这样就可以了 还可以通过frac参数 指定抽样数据集数据的百分比 例如抽取30%的数据可以这样写 共45条记录 如果要进行有放回抽样 只要将参数replace设为True 我们来试试有放回抽取10条记录 这样的写法可能会抽取到相同的记录 再来看分层抽样 分层抽样第一步工作是分层 后续的抽样依然可以使用sample()方法来完成 例如我们要从iris数据集中类别名称是0 也就是iris.target值是0的数据子集中 抽取出30%共15条记录该如何做呢 我们先把目标属性加入iris_df中 先获取需要的数据然后再抽样 做法很多 简单的写法可以利用DataFrame对象的筛选功能 这样就选择出了iris_df.target等于0的50条记录 然后用sample()方法就可以了 很简单吧 如果要继续抽取类别值为1的所有数据中20%的数据 是不是这样写就可以了 共10条记录 假设要把这两层的抽样结果合起来怎么实现呢 很简单 假设将第一层的结果赋给变量A 第二层的结果赋给变量B 我们用append()方法返回组合后的数据 DataFrame对象也有像列表一样的append()方法 惊不惊喜 后面我们有专门的环节介绍这些高级的数据处理方法 这一小节我们介绍了属性规约和数据规约 有没有发现Python中的函数和方法确实很厉害 又简单又好用 人生苦短 让我们用Python吧