coursera用python玩转数据_4 数据预处理之数据变换 - Python数据统计与挖掘Python Data Statistics and Mining | Coursera...

数据整理好以后 处理过程当中或者最终结果的查看时 常常需要浏览数据 有的时候会发现程序的结果不对 这个时候可能会跟程序死磕 痛不欲生 夜不能寐 所以为了避免这种悲催事情的发生 赶紧来看一下 数据预处理的常见任务数据变换需要做的工作吧 数据变换是数据预处理的重要步骤 简单来说就是把数据变换成合适的形式 常见的方式有规范化 连续属性离散化 特征二值化等 还可以做一些属性构造等 先来看数据规范化 因为数据一般有多个属性构成 简单来说 多个属性就是多个数据列 不同属性之间可能存在量纲不同例如身高是厘米 体重是公斤 范围也可能不一样 这样的不同会让数据不可比较 所以需要先将各属性指标进行无量纲化操作 消除量纲还有数据取值范围影响后 再将它们运用在各类算法模型和实际应用中 规范化的常用方法有最小-最大规范化 也称为离差标准化 z-score规范化 也称为零-均值规范化或我们常说的标准化 还有小数定标规范化 不同类型的模型和应用常需要选择不同的规范化方法 例如像聚类 因为需要用距离来度量相似性 所以用z-score规范化会表现更好一些 下面我们以波士顿房价数据集为例 来说明数据规范化的做法 波士顿房价数据集与鸢尾花iris数据集一样 也是机器学习的经典数据集 主要用于回归分析 它统计的是20世纪70年代中期 波士顿郊区房价的中位数 共有 506 条记录 包括房屋以及房屋周围的详细信息 如城镇犯罪率CRIM 一氧化氮浓度NOX 住宅平均房间数RM等13 个特征属性 以及房价中位数这1个目标属性MEDV 我们来看一下具体的载入方式 载入方式与载入iris数据集一样 然后使用datasets的load_boston()这个函数 把结果赋给变量boston 通过它的data属性可以看到具体的数据记录 共有506行13列 13列的特征属性可以通过对象的feature_names属性获得 通过对象的target属性 可以看到目标属性MEDV即房价中位数具体的值 具体这些属性的信息可以直接输出boston看到 有详细的属性介绍 为了便于观察 我们选择NOX、RM和AGE这3个特征做规范化处理 我们选择NOX、RM和AGE这3个特征做规范化处理 分别表示一氧化氮浓度 平均每居民房数 和在1940年之前建成的所有者占用单位的比例 我们来构建一个这3个特征的DataFrame 它们位于第4、5和6这3列 先导入pandas模块 简单一点我们把这个DataFrame命名为df 对这个数组做切片操作 并给它添加columns的值 看一下这个df 正确选择了我们需要的3列 这样这个DataFrame就构建好了 下面我们基于它来做各种规范化处理 先来看规范化中的最小-最大规范化 它的计算公式很简单 该值减去该值所在属性的最小值 除以所在属性的最大值和最小值的差 因为DataFrame对象支持矢量计算 所以手工写出代码是不是也很简单 我们来写一下 是不是这样写就行了 (df-df.min())/(df.max()-df.min()),min()和max()方法 分别用来求最小值和最大值 这就是处理结果的前6条记录 可以很容易看出 这样处理后数据值都落在了[0,1]区间内 这种规范化形式比较适合不涉及距离度量的场景 它的问题是如果将来的数字超过min或max范围 会越界 需要重新定义 另外如果某个数很大则规范化后的值相近且均接近0 来试一下 这就是规范化的结果 除手工写代码处理外 也常用sklearn中preprocessing模块来做规范化 preprocessing模块中有很多功能强大的函数 可以完成各种预处理任务 例如最小-最大规范化我们可以这样来处理 先导入使用preprocessing中的minmax_scale(函数) 可以看到 结果是正确的 接着看z-score规范化 它的计算公式是该值与该值所在属性的均值之差 除以该属性的标准差 这种标准化方式使用最多 处理后数据的均值为0 标准差为1 这个公式手工写代码是不是也很简单 (df-df.mean())/df.std() 来运行一下看看 来写一下这个公式 这就是标准化的结果 同样我们可以利用sklearn预处理模块中函数来处理 比较方便的是直接使用scale()函数 这样就可以了 再来看小数定标规范化 这是原始的数据 常见的是让数据落在[-1,1]区间内 这是这样的形式 这种方式是通过移动小数点位置来实现的 移动的位数取决于属性绝对值的最大值 例如假设AGE属性的绝对值最大值为90 它的位数为2 该属性所有值只要除以10的2次方100就可以 让数据落在[-1,1]区间内 公式就是这样 怎样写出这个公式呢 主要是表示这个移动位数j 想一想 我们是不是可以利用numpy模块的log10()这样的函数 求10的多少次方是属性绝对值的最大值 当然这样求出来是一个小时 只要使用向上取整函数ceil()就可以了 例如原来是1.95,ceil()函数处理后就变成2 完整的公式就是这样 大家再好好理解一下 再看处理后的数据 这列数据肯定是除以了10 这列数据就是除以了100 接下来再来看第二种常见的数据变换方式 连续属性离散化 常见的方法是用分箱法binning和聚类 我们来看一下分箱法 分箱法除了可以平滑噪声外 也可以用来做连续属性的离散化 有等宽法和等频法之分 从名字应该可以听出来 等宽法是把数据区间按设定的箱子数等分 而等频法则要求放进每个箱子的记录数相同 落到同一箱子中的数据 不管哪一种方法数据的标签都是一样的 我们常使用pandas的cut()和qcut()函数 进行等宽和等频的连续属性离散化 我们来执行一下 假设我们要处理的是波士顿房价数据集的AGE属性 两种方法我们都把数据分成5个箱子 每个箱子的标签都是0到4 先来看等宽法 5是箱子的个数 就是bins参数的值 标签假设是0到4 这就是等宽法的结果 可以看到这种方法同一区域标签个数可能不一样多 从显示出来的数据来看似乎0这一类出现的很少 另外还可以通过设定bins参数值 实现更细粒度的范围确定 例如我们刚才设定的bins值是5 也可以这样设定bins = [1, 2, 3, 4, 5] 假设原始的数据范围是1到5 不包含1,包含5 它表示将数据范围划分为4个 分别是(1,2],(2,3],(3,4],(4,5] 左开右闭的区间 然后在pd.cut()函数中 将这个变量bins赋值给参数bins就可以了 当然这种设定需要一定的数据相关领域的经验 再来看等频法 只要把cut改成qcut就可以了 等频法的处理结果看上去似乎每一类的个数都是均衡的 为了更好地说明问题 我们可以只看前20条记录 大家观察一下 我们不仔细去数了 但应该可以发现每一个类别 它包含的记录条数都是一样的 都包含4条记录 顺便再基于20条记录实现一下等宽法 可以看到有3个0,3个1 与等频法不一样 这两种方法都比较常用 也比较简单 它们首先都需要有一定经验确定箱子的个数 另外也有一些缺点 例如等宽法容易受异常值的影响 分箱后可能有的区域值很多 有的很少 等频法则容易将相同的值分到不同的箱中 这些缺点对模型来说有时会不是特别友好 数据变换的另一种常见方式是特征二值化 我们来简单看一下它的含义 特征二值化的核心是设定一个阈值threshold 大于阈值的赋值为1 小于等于阈值的赋值为0 很适合用于目标属性 将多分类问题转换成二分类问题 例如假设有一个电影数据集 数据集中包含多部电影的多个特征属性 如电影题材 上映月份 国产片还是外语片等 目标属性为多个用户对电影评分的均值 均值范围假设为[0,10] 如果我们要判断某一部新电影是否会被推荐 我们就可以基于经验 将用户评分转换成两个分类——推荐和不推荐 例如6分以上推荐 标签为1 如这样的记录 6分以下不推荐 标签为0 标签确定后就可以使用具体的分类算法 当然也可以用于聚类等算法 要看实际的数据和任务 怎么实现这样的特征二值化呢 我们同样可以利用sklearn的preprocessing模块 方法有很多 例如可以使用Binarizer()或LabelEncoder()函数 例如我们来看Binarizer()函数 简单起见我们用波士顿房价的目标属性来实现一下 虽然因为任务不同 这个目标属性一般不做二值化处理 我们只要先准备好数据 然后设定Binarizer()函数的阈值 threshold参数值就可以进行学习了 用fit_transform()方法 运行一下 这就是二值化的结果 这里要说明的是 boston.target目标属性中是房价的中位数 我们刚才设定的阈值是20 也就是假设大于20的为一类 小于等于20的为另一类 这个类可能是高价和非高价房 另外要说明的是 刚才我们在程序中写了reshape()方法 为什么呢 因为原始数据boston.target是1行506列 因为我们要对应每一条记录有一个类别 所以需要把它转换成506行 我们只要用reshape(-1,1)就可以了 结果就是我们需要的维度 如果要分成不止两类例如三类该如何处理呢 下一章我们会有完整的案例来谈这个问题 也会介绍一些其他常用的函数和方法 这就是数据变换的三种常见方式 规范化 连续属性离散化 特征二值化 我们列举了一些常用的方法 这些都是后续大家要解决实际问题时可能会需要完成的工作 方法可能会有很多 也可能有变化 最重要的是我们需要有数据变换的意识

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值