机器学习-数据清洗

作者:golang 时间:20160319 阅读:139
**欢迎大家前往[腾讯云+社区](https://cloud.tencent.com/developer/?fromSource=waitui),获取更多腾讯海量技术实践干货哦~** > 本文由[brzhang](https://cloud.tencent.com/developer/user/1203298)发表 # 数据清洗 ## 首先,为何需要对数据进行清洗 数据清洗的工作绝壁是非常枯燥的,做数据研究的的人绝对无法避开这个环节,其根本原因是因为我们从各种渠道拿到的数据可能会出现: 1、不合理的数据,你比如,样本中有些人的年龄超过了120岁,楼层的高度达到了1000层,以及其他的一些非常不合理的场景。 2、错误的类型,你比如,样例中,几乎所有的数据都是整形,然而,有一些是字符串类型,如果不进行处理,将这些数据直接喂给算法,一般情况下是要崩溃的。 3、计算机对于处理字符串类型比较吃力,有时候,需要我们将他转化为数字类型,这样就设计到一个映射关系,比如,样例性别,【男,女】,我们可以转化为1,2,房屋的类型【单间,一房一厅,二房一厅,三房一厅,商铺】可以对应的枚举出来,比如我在处理房屋朝向上的示例 ```js #提取房屋的朝向 def parse_orientation(row): if '朝西南' in row: return 1 elif '朝东北' in row: return 2 elif '朝东' in row: return 3 elif '朝南' in row: return 4 elif '朝西北' in row: return 5 elif '朝北' in row: return 6 elif '朝东南' in row: return 7 elif '朝南北' in row: return 8 elif '朝西' in row: return 9 else: return 10 ``` 等等等等,我想说的是绝对还有很多你意想不到的场景,需要你耐心的打磨数据,将搜集到的原始数据,清洗成为可用的数据。 ## 数据清洗需要掌握哪些黑科技 通常我们拿到的数据数据都可以简化为表格模型,无用你是xsl也好,csv亦或json数组也好,都可以利用pandas来读取,读取之后,接下来的工作基本上就是借助在pandas的一些api来做数据清洗工作了,如下,我读取了一份房价信息的数据表,这份数据当然是我自己根据上一篇文章,利用scrapy做了一个爬虫爬取的咯。 ![img](https://ask.qcloudimg.com/draft/1203298/3oflgcrno0.png?imageView2/2/w/1620)jupyter笔记 为了让我们能够更好的玩数据清洗,我也不吝啬的贡献出了一份非常全面的pandas的操作[Cheatsheet](https://github.com/pandas-dev/pandas/blob/master/doc/cheatsheet/Pandas_Cheat_Sheet.pdf)一份,以及后面你一定会用到一个万能的[CheatSheet](http://www.utc.fr/~jlaforet/Suppl/python-cheatsheets.pdf)。 来来,简单的了解一下pandas的一些常用的api了,举例就用: ![img](https://ask.qcloudimg.com/draft/1203298/c35ogyi6fi.png?imageView2/2/w/1620)示例数据一行 1、取子集常用操作 ![img](https://ask.qcloudimg.com/draft/1203298/a8kykbnfdb.png?imageView2/2/w/1620)取子集 其中,loc是支持按照列名字符串的方式来取子集,iloc支持的是使用数组索引(从0开始)的方式来取子集,通常,逗号前面是行相关的一些条件限制,逗号右边则是列相关的限制。比如,我取得 ![img](https://ask.qcloudimg.com/draft/1203298/32axfooj4q.png?imageView2/2/w/1620)我就取前两列 2、处理空白数据行 ![img](https://ask.qcloudimg.com/draft/1203298/pjqx4h8p05.png?imageView2/2/w/1620)处理空白数据 这种就很简单愉快了,一个api就可以删除或者填充有空白数据的样本了。 这个就不演示了,因为我是爬虫爬取数据,所以在爬取的过程中,我已经对数据进行了一些基础的处理,程序控制不可能出现空白数据了,所以,我也是建议,自己写爬虫去获取数据,这些减轻数据清洗环节的压力。 3、apply系列 apply其实有比较多兄弟,比如applymap,map,他们的能力各有不同,总的来说就是apply()是一种让函数作用于列或者行操作,applymap()是一种让函数作用于DataFrame每一个元素的操作,而map是一种让函数作用于Series每一个元素的操作,如下所示,我这里对ege列进行处理了一了,将数字和文本归一化为数字。 ![img](https://ask.qcloudimg.com/draft/1203298/tg94809j7x.png?imageView2/2/w/1620)apply示例 实际上,这个操作完全可用map来做: ```js df['ege'] = df['ege'].map(parse_house_age) df.head(5) ``` 结果完全一样,因为我们只取了一列。 ## 数据清洗比较高级的方式,使用各种图表 1、使用散点图 ![img](https://ask.qcloudimg.com/draft/1203298/wpntvt2qzf.png?imageView2/2/w/1620)房屋总面积对应总价图 2、房价热力值图: ![img](https://ask.qcloudimg.com/draft/1203298/z4fvxv3ajm.png?imageView2/2/w/1620)房价区间热力图 图描述了房间分布区间,可以清洗看出一些问题。 3、频率直方图帮助我们迅速找到一些特例独行的猪,因为他出现的次数少嘛,不得不让人怀疑这种数据的真实性。 ![img](https://ask.qcloudimg.com/draft/1203298/giuc2ql4vc.png?imageView2/2/w/1620)利用直方图快速找出毛刺点 ok,总的来说,这个过程需要开动自己的脑经,把你拿到的原始数据,慢慢慢慢的,变成可以给你下面算法需要的数据。 >**相关阅读** >[【每日课程推荐】机器学习实战!快速入门在线广告业务及CTR相应知识](https://cloud.tencent.com/developer/edu/course-1128?fromSource=waitui) **此文已由作者授权腾讯云+社区发布,更多原文请[点击](https://cloud.tencent.com/developer/article/1365667?fromSource=waitui )** **搜索关注公众号「云加社区」,第一时间获取技术干货,关注后回复1024 送你一份技术课程大礼包!**


公众号:程序员资源社区

扫码回复:源码,获取网站教程源码

编程网盘资料/视频分享群(免费)

微信扫码进群领取资料