中欧数据挖掘掘中的数据清洗

&&&&&&&& 上一节我们通过爬虫工具爬取了近七万条二手房数据,那么这一节就对这些数据进行预处理,也就是所谓的ETL(Extract-Transform-Load)
& & 一.ETL工具的必要性
&&&&&&&&& 数据分析的前提是数据清洗。不论如何高大上的算法,遇到错误数据,一个异常抛出来,绝对尸横遍野。而你不能指望核心算法为你处理错误或者短缺的数据。所以,数据清洗(ETL)就变得必不可少了。 如果数据分析是炒菜阶段,那么清洗就是洗菜,绝对是非常重要的一环。&&
&&&&&&&&& 而实际上,ETL工具可以很简单,也可以很复杂。简单到只需要把字符串转换为数字或者提供正则表达式。而复杂的ETL需要建立完整的错误日志机制,智能处理,自动汇总,还要做成工作流,脚本等复杂的形式。我决定做一个折中,提供最需要和差不多够用的功能。如果真有对ETL特别强烈而复杂的需求,那就只能借助专业的ETL工具了。
&&& 二.ETL插件
在本系统中,ETL以插件的形式存在,可供系统进行调用。这些ETL工具包括了常见的场景:
正则表达式提取
数据类型转换,包括时间格式等
随机数和范围数生成
数据分割,排序和筛选
字符串转数字编号
高级的模块 如 分词,文本情感分析等
同时所有的模块都可以支持二次扩展。可为了新的场景增加新的模块。 模块分为两类:
无监督工具:不需要之前的数据,直接生成新数据,如噪声产生器
有监督工具:需根据之前的数据生成,如正则提取
这些ETL插件可以形成一个处理队列,以队列的形式依次处理数据,形成职责链。这样就能应对绝大多数的ETL需求。
&&& 三. 使用介绍
下面,我们就以北京房价样例数据为例,进行ETL清洗。这些数据爬虫来自于网络,具体的爬取过程可参考前一节内容。
1. 数据导入和观察
首先在数据管理器上点击&导入&按钮,导入XML数据文件,如下图所示:
之后可以普通列表的形式,查看这些数据:
会发现这些数据非常有规律。我们可制定如下方案:
& 筛选出正常的数据,因为有些数据是残缺的,比如&面积&一栏是空的。
& 其价格是XXXXX元/平米,为了进行统计,需要通过正则进行提取
& &属性3& 楼层数,可通过/ ,进行分割,取第二个项就好,最后一项是板楼或塔楼
& 在&属性3&中,可通过正则匹配提取年份
& 可在&坐标&一项中,通过分割,方便地提取编号,地理位置,所在小区和其他信息。
&&&&&&&&&& 2.编写数据筛选脚本
&&&&&&&&&&&& 首先进行数据筛选,将&数据筛选&插件拖入算法框中:
&&&&&&& 同时进行配置,为了方便,我们仅提取前1000条数据作为分析目标。
&&&&&&&& 最重要的是,编写筛选的自定义函数脚本。与C#的语法相同:
&&&&&&& 点击开始处理,即可筛选出满足条件的前1000条数据。
&&&& 3.进行ETL配置:
&&&&&&&&& 与上一步类似,将&数据生成与预处理&模块拖到算法管理器中。
&&&&&&&& 将该模块的数据源,选为&全部&:
&&&&&&&& 点击命令列,可对ETL所需的插件进行配置:
&&&&& 集合编辑器中,列举了系统加载的所有ETL插件,我们首先将价格提取出来:
&&&& 选择原始列名,填入新列名,如果不勾选&添加到新列&,则原始数据就会被覆盖。同时填写正则表达式 \d+ ,用于提取价格中的房价。同时,将目标类型选择为INT,转换完成后,数据的类型就会变为INT
&&&& 类似的,可提取建设年份。
&&&&& 由于转换后,建设年份为STRING类型,可再添加一个字符串转时间的工具,方便转换为DateTime,直接将原有的数据覆盖就好。
&&&& 接下来提取地理坐标: 观察这些坐标,同样可以使用正则匹配,此处从略。
&&&& 接下来是所在的片区,它位于&坐标&这一属性中。使用正则匹配并不方便,因此采用数列分割的方法,即通过字符对该属性进行分割,提取出固定位置的项。通过观察, 可通过符号,进行分割,正好位于第4项
&& 类似的,可以提取小区名称,与所在行政区的唯一区别在于匹配编号,要填2
&& 最终完成的ETL流程如下图所示:
&&& 这些ETL插件会顺次执行。如果一个插件的结果依赖于前一个插件,则一定要排在依赖插件的后边。
&&& 之后点击开始处理,ETL流程即可启动,所有的错误日志都会保存到一个专门的数据集中,用于再次分析和处理。这次处理没有错误,系统提示ETL流程成功结束,下面就是经过ETL后得到的新列:
&& 为了保险起见,我们将这次加载的所有设置保存为一个任务,名字为&ETL清洗任务&,如果遇到同样的数据,可以进行相同的任务,而无需进行再次配置。
&&& 可以在生成的系统配置文件中,看到此次任务所保存的XML文件:
&Doc Name="ETL数据清洗任务" Description="任务描述" Group=""&
&Children X="-2.01" Y="0" Z="0" Group="0" Key="数据筛选_1" Weight="1"&
&Data Collection="全部" Name="数据筛选" NewDataSetName="" ScriptCode="return String.IsNullOrEmpty(item['价格']) ;
// 1表示筛选该数据,否则表示不筛选" CanRemove="True" Start="0" End="1000" Layer="0" /&
&/Children&
&Children X="3" Y="0" Z="0" Group="1" Key="数据生成和预处理_2" Weight="1"&
&Data Collection="全部" Name="数据生成和预处理" Size="1001" Layer="0"&
&Children Type="正则过滤器" CollumName="价格" NewCollumName="新价格" IsAddNewCollum="True" TargetDataType="INT" ScriptCode="\d+" Index="0" /&
&Children Type="正则过滤器" CollumName="属性3" NewCollumName="年份" IsAddNewCollum="True" TargetDataType="STRING" ScriptCode="\d{4}" Index="0" /&
&Children Type="字符串转时间" CollumName="年份" NewCollumName="" IsAddNewCollum="False" TargetDataType="DATETIME" Format="yyyy" /&
&Children Type="数列分割" CollumName="坐标" NewCollumName="片区" IsAddNewCollum="True" TargetDataType="STRING" SplitChar="," Index="3" SplitPause="SplitPause" /&
&Children Type="数列分割" CollumName="坐标" NewCollumName="小区名" IsAddNewCollum="True" TargetDataType="STRING" SplitChar="," Index="2" SplitPause="SplitPause" /&
&Children Type="正则过滤器" CollumName="坐标" NewCollumName="lag" IsAddNewCollum="True" TargetDataType="DOUBLE" ScriptCode="\d{2}.\d+" Index="0" /&
&Children Type="正则过滤器" CollumName="坐标" NewCollumName="Lng" IsAddNewCollum="True" TargetDataType="DOUBLE" ScriptCode="\d{3}.\d+" Index="0" /&
&/Children&
&&&&&&& 三.总结
&&&&&&&&& 本节主要介绍了如何使用该工具进行ETL清洗,下一节我们将正式进入数据分析的流程。敬请期待。
阅读(...) 评论()
$(function(){ $("input[name=article_support]").click(function(){ $("textarea[class=comment_textarea]").val("文章不错,支持一下!"); ; }); $("input[name=article_pass]").click(function(){ $("textarea[class=comment_textarea]").val("飘过~~"); ; }); </script当前位置: >
关于几个数据挖掘问题的回答
16:48 来源:
什么是数据挖掘,数据挖掘要解决什么问题?大家都知道数据挖掘最花时间就是在变量清洗上,如何清洗变量?如何将挖掘成果很好的展示给用户?这些问题也许通过下面这些问答你可以找到自己的答案。
1.如何定位挖掘目标?
答:数据挖掘的目的是为了解决所提出的业务问题,因此,只要把所要解决的业务问题加以清晰化,应该不难将之转化为相应的挖掘目标。
2.确定目标后如何选择算法?
答:确立了数据挖掘的目标,就可以基本上明确需要建立什么样的数据挖掘模型了。不同的模型,使用的挖掘算法不同,客户分群常用聚类分析(最常用的是K-means),分类预测模型(如客户流失、客户响应,欺诈检测)则使用决策树、Logistic回归以及神经网络等算法,关联分析(如交叉销售)一般使用经典的Apriori算法。另外,数据本身对挖掘算法的选用有一定的影响,例如K-means算法就对异常值很敏感。
3.算法选择后如何确定变量?
答:我个人认为,变量的选取,特别是衍生变量,需要一定的业务知识,以及对挖掘问题的一个准确的把握。
通常我们研究分析的对象都是客户(或手机号、帐号),所获得的数据大体上有客户基本属性、客户行为数据、客户交易数据等等。一般都需要根据这些数据衍生出新的变量,以支持建模。创建衍生变量,通常依据业务实际情况以及经验判断。目前,使用较广的一种衍生变量的方法是RFM分析。
在建模之前所确定的变量,并不一定是模型最终用来训练的变量,也就是说,并不一定是对模型显著的变量。可以采取一些方法删除一些不显著的变量,例如变量聚类、主成分分析、相关性分析等。当然,也可能会手动删除变量,如看到缺失值占大部分或只有一个值的变量,就可删除该变量。
4.变量确定后如何对挖掘结果进行展示?也就是如何让客户理解挖掘的结果?
答:在建模之后很重要的一步就是结果解释,也就是说,需要将模型结果翻译成让业务人员明白的结果。就软件来说,不同模型得到的模型结果一般不同,就Logistic回归模型来说,模型结果包括:模型参数,以及ROC等几种评估曲线
对应原始宽表,得到新的数据表,其中包含目标变量的预测值。就聚类模型来说,模型结果包括:
模型参数分成几类,各类的特征,以及相应的可视化结果对应原始宽表,得到新的数据表,其中包含模型得出的类标号
5.采样的目的是什么,如何进行模型的数据采样?
答:当可用的数据量非常庞大时,模型训练的效率就会降低,甚至机器崩溃。这时,抽取有代表性的样本来建模是很有必要的。
一般是根据目标变量值的情况来选择,通常使用随机抽样。当然也有系统抽样、欠抽样、过抽样等等。
例如,在不均衡分类模型(如客户流失),一般所感兴趣的目标变量值(即为1,流失)仅占总体的5%左右,这时,可采取过抽样的方法来抽取样本,抽样之后,值为0的个数与值为1的个数之比为1:1,这样就均衡了,建模效果会好一些。当然,一般抽取总体的多少来做样本进行建模,不同行业可能有不同的标准,更多的还是依据过往经验来决定。
6.采样是否是为了得到变量值(连续变量、分类变量)?
答:抽样是为了提高建模效率,并不是为了得到变量值。
7.什么是模型训练?模型训练的结果是否就是得到变量值?
答:在建模过程中,通常采取交叉验证的方法,将数据挖掘宽表拆分成两个(或三个)部分,一个是用来拟合初步的模型,称为训练集,另一个是用来验证模型的准确性,也可用来调整模型;还可以分为三部分,除前面两个数据集之外,还有一个测试集,它是针对模型的错误率的,可以用来得到最终的无偏估计。
一般分为两部分。
所谓模型训练,就是使用训练集的数据来拟合得到一个初步的模型,但这个模型并未经过验证评估。
模型训练的结果,准确来说,是一个模型,一些模型规则。
(责任编辑:中国统计网)
本文链接:
关键字:|||
版权声明:本站内容部分来自互联网,转载请注明原文链接和作者,如有侵权或出处有误请和我们联系。

我要回帖

更多关于 中欧数据挖掘混合 的文章

 

随机推荐