数据预处理是在使用数据做分析和决策之前非常关键的一步,可以说它是基础设施,会影响最终分析的准确性和决策的正误。
我们面对的原始数据一般存在多的问题。从单个数据源来看,一般会存在缺失、错误。从多个数据源来看,会存在异构和不一致。
数据缺失,也称为数据不完整:表现在某些属性值缺乏统计保存,某些层面的数据由于设计之处没有受到足够重视而没有记录,也有可能是其他原因导致数据丢失。
数据错误,也称为噪声数据:表现为异常数据,离群点数据,多为不正常数据需要剔除。
数据异构:主要指多个数据源使用概念模式的模型不一样。概念的命名不同,分层的层规定不同,概念的搭配不同等等,导致相关的数据源表示相同的东西的时候使用了不同的描述形式。
数据不一致:表现为多个数据源中表征同一个指标的数据发生冲突。
现实中的数据存在的问题会千奇百怪,不胜枚举。我们需要接受这个事实,而后进最大努力和可能去弥补和修复这些缺憾,来保证我们的后继工作能够有保障的进行。
数据预处理更多的是强调一个过程,而要使这个过程有意义,我们必须明确数据预处理的目标。也就是说,我们需要获取什么数据来做分析和决策。
有两种比较不一样的目标:一种是做通用的数据准备,另外一种是做专项的数据抽取。其中第一种目标又可以为第二种服务,当然难度比较大,需要在通用性上做取舍。
数据预处理中涉及到很多概念术语,包括数据清洗、数据集成、数据变换、数据规约。这些概念各有侧重,相互交叠,有的还彼此包含。
但总的来说这个过程是一个把有问题的、粗糙、杂乱的数据集合转变为一个可以为我们的分析挖掘目标服务的可用的一致的完整的数据集。
我将数据预处理的步骤归纳为一下两点:
1. 了解数据,我们可以使用很多策略指标、数据可视化方法来把握数据的现状
2. 数据整理,根据数据现有的问题和我们希望得到的数据集之间的差异,我们采用一些合理的处理方法对数据进行转换整理。
了解数据
数据表示
数据(data)本身是对真实世界中的实体的符号表征(symbolic representation),一般采用名值对的形式(property/attribute | value)表示成某种度量(measurement)。
属性(property/attribute)又可以分出三种类别:
命名型(Nominal scales),强调标签功能,来区分彼此,具体使用什么符号不重要。
序列型(Ordinal scales),强调属性值间的内在排列顺序关系,不关心具体使用什么表征。
数值型(Numerical scales),强调属性的数量,可以进行算数运算。
明确属性的类型有助于后继处理上面的选择策略,进行合理的数据整理和转换。
数据质量
单个属性的数据质量:准确性,正确性,可用性
数据集的数据质量:小方差,小偏置(low variance, low bias)
偏差检测
数据整理
多数据源的数据集成
单数据源的数据清洗
大规模数据的规约转换
“To understand is to perceive patterns” — Isaiah Berlin
“A pattern is the opposite of a chaos. It is a entity vaguely defined, that could be given a name.” — Satoshi Watanabe
“Identification of a pattern as a member of a category we already know, or we are familiar with.” — Anil K. Jain
Pattern recognition is the [...]
文本分类:确定特征,统计特征,计算特征
特征可以出现在任何分类中,但是一般假定一个特征对文本的分类归属的贡献是不一样的,贡献大的则可以视为该分类的突出特征。
对一个问题求其最优解:表示题解,成本函数,随机优化方法。
表示题解:确定解的定义域,确定可行解
成本函数:对每一个可行解,计算其成本(数值化)
随机优化方法:
随机搜索:在可行解中随机挑选N个,算出他们中成本最小的最为最优解的近似
爬山法:从一个随机可行解出发,在其临近找局部最优解
模拟退火算法:在开始阶段以一个较大的概率选择非较优解,此后此概率逐渐变小(p= exp(-(highcost-lowcost)/temperature, temperature逐渐变小)
遗传算法:进化种群N,部分最优(成本小)直接保留,其他有较优解通过交叉和变异补足,直到种群的差异小于阈值或者达到进化次数
1. Crawler
从一个初始网页url集合出发,获取相应的网页内容:
索引网页内容:得到网页中的单词,建立urlid – wordid – location关系,其中location是单词在网页中的位置(第几个)
抽取网页中url:获取超链接,判断其是否被索引,将未索引的url收集起来,添加链接信息(包括链接中的词汇,链接的关系(fromurl, tourl))
2. Index
建立urlid – wordid – location关系,其中location是单词在网页中的位置
3. Query
分解搜索关键字,连表(对自身)查询同时包含所以关键字的文档:(urlid, keyword1id, keyword2id,…)
4. Ranking
评价每个url(文档)的重要程度:
基于内容
单词词频,统计文档中包含关键字的频率
文档位置,对关键字出现的位置求和,小者重要
单词距离,计算关键字之间的最小距离
基于链接结构
Pagerank,对指向该网页的页面的主要性加权求和
链接文本,关键字出现在链接文本中的,入节点的pr
一、基于用户的协调型过滤
1. 使用嵌套字典表达不同人的偏好,构造如下数据集:
DataSet = {
person_1 : {
item_1 : score_1,
item_2 : score_2,
……. }
person_2 : {
item_x : score_x,
item_2 : score_2,
……..}
person_3 : {
item_m : score_m,
item_x : score_x,
………}
………..
}
2. 评价两个人之间的偏好相似度:
A. 欧几里得距离: sum( [ (item_score_i - item_score_j)^2 for item in person_i and j in person_j ])
B. 皮尔逊相关度 :
3. 根据计算某个人与其他人的相似度(similarity),可以找到与自己最相似的topMatches。
如果换个角度,从物品–人–评价的视角来构造一个DataSet,这样可以计算物品的相似度,然后找到与某个物品最相似的topMatches。
4. 做推荐(recommendations):
给人推荐物品(物品非此人现在拥有),综合相似度、评分、评分人次:
sum(similarity_i * score_i) / sum(similarity_i) for item_i not in person’ items
换个视角(物品,人交换),给物品推荐评论人
二、基于物品的协作型过滤
1、构造一个嵌套字典,对每个物品给出一个与之相似的物品字典(similarity, item):
DataSet = [...]