数据预处理技术研究 | 冰水数据智能专题 | 1st

2020-08-04 16:10:17 浏览数 (1)

1 数据预处理解决什么问题

数据预处理是数据挖掘的重要一环,要使挖掘方案挖掘出丰富的知识,就必须为它提供干净、准确、简洁的数据。然而实际应用系统中收集到的原始数据是“脏”的,不完全的、冗余的和模糊的,很少能直接满足数据挖掘算法的要求。在海量的实际数据中无意义的成分也很多,严重影响了数据挖掘算法的执行效率,其中的噪声干扰还会造成无效的归纳。预处理已经成为数据挖掘系统实现过程中的关键问题。

数据通常存在以下几方面的问题:

(1)杂乱性

原始数据是从各个实际应用系统中获取的(多种数据库、多种文件系统),由于各应用系统的数据缺乏统一标准和定义,数据结构也有较大的差异,因此各系统间的数据存在较大的不一致性,往往不能直接拿来使用。

(2)重复性

重复性是指对于同一个客观事物在数据库中存在其两个或两个以上完全相同的物理描述。由于应用系统实际使用中存在的一些问题,几乎所有应用系统中都存在数据的重复和信息的冗余现象。

(3)不完整性

由于实际系统设计时存在的缺陷以及一些使用过程中人为因素所造成的影响,数据记录中可能会出现数据属性的值丢失或不确定的情况,还可能缺少必须的数据而造成数据不完整。实际使用的系统中,存在大量的模糊信息,有些数据设置还具有一定的随机性质。

2 数据预处理在数据挖掘中的定位

一个完整的数据挖掘系统必须包含数据预处理模块。它以发现任务作为目标,以领域知识作为指导,用全新的“业务模型”来组织原来的业务数据,摈弃一些与挖掘目标不相关的属性,为数据挖掘内核算法提供干净、准确、更有针对性的数据,从而减少挖掘内核的数据处理量,提高了挖掘效率,提高了知识发现的起点和知识的准确度。数据挖掘中的预处理主要是接受并理解用户的发现要求,确定发现任务,抽取与发现任务相关的知识源,根据背景知识中的约束性规则对数据进行检查,通过清理和归纳等操作.生成供挖掘核心算法使用的目标数据,即知识基。知识基是原始数据库经数据汇集处理后得到的二维表,纵向为属性〔Attributes或Fields 〕,横向为元组(Tuples或Records}它汇集了原始数据库中与发现任务相关的所有数据的总体特征,是知识发现状态空间的基底,也可以认为是最初始的知识模板。

数据预处理应该包括以下几方面的功能:

(1)数据集成〔Data Integration)

数据集成主要是将多文件或多数据库运行环境中的异构数据进行合并处理,解决语义的模型性。该部分主要涉及数据的选择、数据的冲突问题以及不一致数据的处理问题。 用于进行知识发现的数据可能来自多个实际系统,因而存在着异构数据的转换问题。另外,多个数据源的数据之间还存在许多不一致的地方,如命名、结构、单位、含义等。因此,数据集成并非是简单的复制过程。它需要统一原始数据中的所有矛盾之处,如字段的同名异义、异名同义、单位不统一、字长不一致等,从而把原始数据在最低层次上加以转换、提炼和聚集,形成最初始的知识发现状态空间。 数据集成中还应考虑数据类型的选择问题,应尽量选择占物理空间较小的数据类型,在大规模数据集来说将会减少系统开销。

(2)数据清洗(Data Cleaning )

数据清洗要去除源数据集中的噪声数据和无关数据,处理遗漏数据和清洗脏数据,去除空白数据域和知识背景的白噪声,考虑时间顺序和数据变化等。主要包括重复数据处理和缺值数据处理,并完成一些数据类型的转换。 数据清洗可以分为有监督和无监督两类。有监督过程是在领域专家的指导下,分析收集的数据,去除明显错误的噪声数据和重复记录,填补缺值数据;无监督过程是用样本数据训练算法,使其获得一定的经验,并在以后的处理过程中自动采用这些经验完成数据清洗工作。

(3)数据变换( Bata Trartsformstian }

数据变换主要是找到数据的特征表示,用维变换或转换方式减少有效变量的数目或找到数据的不变式,包括规格化、归纳、切换、旋转和投影等操作。规格化指将元组集按规格化条件进行合并,也就是属性值量纲的归一化处理。规格化条件定义了属性的多个取值到给定虚拟值的对应关系。对于不同的数值属性特点,一般可以分为值连续和取值分散的数值属性问题;归纳指元组属性值之间的语义关系。规格化和归纳能大量减少元组个数,提高计算效率,同时,规格化和归纳过程提高了知识发现的起点,使得一个算法能够发现多层次的知识,适应不同应用的需要。可以用多维数据立方(Data Cube)来组织数据,采用数据仓库中的切换、旋转和投影技术,把初始的知识状态空间按照不同的层次、粒度和维度进行抽象和聚集(即数据泛化),从而生成在不同抽象级别上的知识基。

(4)数据简化(Data, }eduetio})

有些数据属性对发现任务是没有影响的,这些属性的加入会大大影响挖掘效率,甚至还可能导致挖掘结果的偏差。因此,有效的缩减数据是很有必要的。数据简化是在对发现任务和数据本身内容理解的基础_仁,寻找依赖于发现目标的表达数据的有用特征,以缩减数据规模,从而在尽可能保持数据原貌的前提下最大限度地精简数据量。它主要有两个途径:属性选择和数据抽样,分别针对数据库中的属性和记录。

3 数据预处理方法

数据科学的数据预处理,一些编程语言是专为数据科学项目而设计,或者是对它有非常好的支持,特别是R 和Python 。它们包含了机器学习算法的各种实现,诸如过滤或提取的预处理功能,以及诸如缩放、归一化或混洗(shuffle)的数据科学功能。数据科学家需要编写相对底层的代码来进行探索性数据分析与准备。与使用Java或C#的传统编程相反,使用R或Python进行数据预处理时,你不需要编写太多的代码;它更多地是让你了解统计概念以及算法的数据和经验,这些数据和经验可用于数据预处理和模型构建。

这些编程语言是为数据科学家准备数据和构建分析模型而建立,它们并不适用于企业部署(将分析模型部署到具有高规模和高可靠性的新数据中)。因此,市场上提供了商业的enterprise runtime帮助你实现企业部署。通常,它们支持相同的源代码,因此你不需要为企业部署重写任何东西。对于R,你可以使用开源的Microsoft R Open (之前的Revolution R ),或TIBCO Enterprise Runtime for R 。后者具有不受GPL开源许可证限制的优势,因此你可以使用在任何嵌入式或外部环境里。

下面的代码摘录于一个不错的 R 教程 ,它演示了如何使用基本的R语言来预处理和分析Titanic数据集:

### 使用基本的R语言进行数据预处理:

# 存活是“是/否”

# =>类型转换:没有numeric值和对应的数据处理/分析

data.combinedSurvived <- as.factor(data.combined

# 从全称里解析出姓和头衔

data.combined[1:25, "Name"]

name.splits <- str_split(data.combined$Name, ",")

name.splits[1]

last.names <- sapply(name.splits, "[", 1)

last.names[1:10]

# 特征工程:创建家庭大小特征

#(兄弟姐妹/配偶 父母/孩子 1)

temp.SibSp <- c(train

temp.Parch <- c(train

data.combined$FamilySize <- as.factor(temp.SibSp temp.Parch 1)

除了对预处理的基本支持外,这些编程语言还提供了许多额外的数据科学软件包。例如,许多数据科学家利用R 中 非常强大的caret 包 来简化数据准备和减少代码量。该软件包简化了复杂回归和分类问题的模型准备与训练过程。它为数百个现有的R模型实现(在底层使用了各种各样的API)提供了一个通用接口。以下代码段使用了caret的通用API对Titanic数据集进行预处理:

### 使用R caret包进行数据预处理:

# 利用caret的preProcess函数对数据做归一化

preproc.data.combined <- data.combined[, c("ticket.party.size", "avg.fare")]

preProc <- preProcess(preproc.data.combined, method = c("center", "scale"))

# ->你看到的是相对值而非绝对值(即彼此之间的关系):

postproc.data.combined <- predict(preProc, preproc.data.combined)

另一个用于数据预处理的R包是dplyr 包。它不像caret包那样强大,并且只专注于操作、清洗和汇总(summarize)非结构化数据。 Dplyr旨在为数据操作的每个基本动作都提供一个函数 :

• filter()(和slice())

• arrange()

• select()(和rename())

• distinct()

• mutate()(和transmute())

• summarise()

• sample_n (和sample_frac())

因此,学习和理解许多数据操作任务变得容易。对于data.table 包也是这样。正如你所见的,在R语言里你有许多方法来预处理数据集。

(1)数据科学家或开发者的大数据集预处理

诸如R或Python这样的编程语言可用于处理小数据集。但是,它们并不是为处理真正的大数据集而创建;与此同时,我们经常需要分析几个GB、TB甚至PB级别的数据。类似于Apache Hadoop 或Apache Spark 的大数据框架则是为处于边缘的(即数据所在位置)弹性扩展(elastic scalability)和数据预处理而创建。

这些大数据框架侧重于“底层”编码,并且配置起来比R或Python环境要复杂得多。商业软件,如Hortonworks 、Cloudera 、MapR 或Databricks 可以帮助解决此问题。通常,数据科学家与开发人员相互合作来完成大数据项目。后者负责集群配置、部署和监控,而数据科学家则利用R或Python API编写用于数据预处理和构建分析模型的代码。

源代码通常看起来与仅使用R或Python的代码非常相似,但数据预处理是在整个集群上并行完成的。下面的示例演示了如何使用Spark的Scala API对 Titanic 数据集进行预处理和特征工程 :

### 使用Scala和Apache Spark API进行数据预处理:

# 特征工程:创建家庭大小特征

# (兄弟姐妹/配偶 父母/孩子 1)

val familySize: ((Int, Int) => Int) = (sibSp: Int, parCh: Int) => sibSp parCh 1

val familySizeUDF = udf(familySize)

val dfWithFamilySize = df.withColumn("FamilySize", familySizeUDF(col("SibSp"), col("Parch")))

// 为年龄列填充空值

val avgAge = trainDF.select("Age").union(testDF.select("Age"))

.agg(avg("Age"))

.collect() match {

case Array(Row(avg: Double)) => avg

case _ => 0

}

当然,你可以使用Spark的Java或Python API做同样的事情。

(2)平民数据科学家的数据预处理

通常,你想要敏捷并且快速得到结果。这常常需要在准备和分析数据集时大量地试错。你可以利用现存的各种快捷易用的数据科学工具。这些工具提供了:

• 开发环境和运行/执行服务器

• 使用拖放与代码生成的可视化“编码”

• 集成各种数据科学框架,如R、Python或更强大的(诸如Apache Hadoop、Apache Spark或底层的H2O.ai )大数据框架

数据科学家可以使用这些工具来加速数据预处理和模型建立。此外,该类工具还帮助解决了数据预处理和机器学习算法的实现,因此没有太多项目经验的平民数据科学家也可以使用它们。一些工具甚至能够提出建议,这些建议有助于用户预处理、显示和分析数据集。这些工具在底层人工智能的驱动下变得越来越智能。

下面的例子展示了如何使用两个开源数据科学工具KNIME和RapidMiner 来预处理Titanic数据集:

使用KNIME来预处理Titanic数据集

使用RapidMiner来预处理Titanic数据集,你可以使用可视化IDE来配置预处理,而非如前所述的用R或Scala编写源代码。对大多数用户来说,这使得数据准备和分析变得更容易,并且数据的维护和移交也变得更容易。

参考:

http://www.infoq.com/cn/articles/ml-data-processing

0 人点赞