一个完整的机器学习应用通过构建机器学习流水线的方式实现,它可以用于创建、调优和检验机器学习工作流程序等。机器学习流水线可以帮助用户更加专注于项目中的大数据需求和机器学习任务,而不是把时间和精力花在基础设施和分布式计算领域上。
机器学习工作流通常包括一系列的数据处理和学习阶段。机器学习数据流水线常被描述为由若干个计算阶段组成的序列,每个阶段可以是一个转换模块,或者估计模块。这些阶段会按顺序执行,输入数据在流水线中流经每个阶段时会被处理和转换。一个典型的流水线如图所示。
每个步骤的细节如下:
1)数据导入:从不同数据源中导入数据,数据规模是GB、TB甚至PB。数据源通常具有分布式、异构性(包括数据格式和存储介质等)、易变性等特点。
2)特征工程,包括以下几个步骤。
- 数据预处理:数据清洗,也称为数据清理或数据转换,是数据分析流水线中的第一步,主要是要把输入数据转换成结构化数据,以方便后续的数据处理和预测性分析。由于原始数据总会存在各种各样的质量问题,比如数据不完整,数据项不正确或不合法等,数据清洗过程使用各种不同的方法,包括补全默认值、数据格式转换等,对数据完成清洗任务。
- 特征抽取:根据模型的需要,对清洗后的数据抽取有用的特征,通常会用到特征哈希(Hashing Term Frequency)和Word2Ⅴec等技术。
- 特征转换:转化数据,使之成为有效的特征。常用的方法是标准化、归一化、特征的离散化等。
- 特征选择:选择最适合模型的特征,常用的方法包括方差选择法、相关系数法、卡方检验等。
3)模型训练:机器学习模型训练包括学习算法和训练数据两部分。学习算法会从训练数据中发现模式,并生成输出模型。
4)模型验证:该环节包括模型评估和调整,以衡量用它来做预测的有效性。
5)模型选择:模型选择指让转换器和估计器用数据去选择参数。这在机器学习流水线处理过程中也是关键的一步。
6)模型部署:一旦选好了正确的模型,我们就可以开始部署,输入新数据并得到预测性的分析结果。
机器学习库拥有丰富的开源实现。从单机的Scikit-learn到分布式的MLLib,它们各有特色,被广泛应用在各种数据处理场景。
- Scikit-learn是单机版的机器学习算法库,通常只能处理小规模的数据集。当输入数据集增大到单机难以容纳或单机处理时间过长时,必须借助分布式机器学习算法库。随着分布式计算框架的流行,越来越多的机器学习算法被分布式化,进而产生了丰富的机器学习库,包括MapReduce之上的Mahout、Spark之上的MLLib、Flink之上的FlinkML等。
- Apache Mahout是最经典的分布式机器学习库,它最初构建在MapReduce上,之后逐步迁移到Spark、Flink等更高效的DAG计算引擎之上,目前Mahout通过引入面向机器学习的声明式DSL—Samsara,将机器学习算法转化成可运行在特定计算引擎之上的程序,进而朝着多计算引擎的方向发展。