ML组件
ML的标准API使用管道(pipeline)这样的方式,可以将多个算法或者数据处理过程整合到一个管道或者一个流程里运行,其中包含下面几个部分:
1. dataFrame:用于ML的dataset,保存数据
2. transformer:将一个dataFrame按照某种计算转换成另外一个dataFrame,例如把一个包含特征的dataFrame通过模型预测,生成一个包含特征和预测的dataFrame
3. estimator:根据训练样本进行模型训练(fit),并且得到一个对应的transformer
4. pipeline:将多个transformer和estimator串成一个ML的工作流
5. parameter:transformer和estimator共用一套API来确定参数
spark的机器学习包有两个,一个是ML,一个是MLlib,前者是基于dataFrame的API实现的,后者是基于RDD的API实现的,官网推荐用前者,使用比较方便。
transformer
一个transformer包含特征转换和已学习得到的数据模型,它实现了一个方法transform()
例如:一个特征transformer可能将一个dataFrame的某些列映射成新的列,然后输出处理后的新的dataFrame;一个学习得到的模型将读取一个包含特征的dataFrame,对每个样本进行预测,并且把预测结果附加到这个dataFrame,得到一个新的dataFrame
Estimators
主要用于训练模型,实现了一个方法fit(),接受一个包含特征的dataFrame,然后训练得到一个模型,那个模型就是一个transformer
例如:一个LogisticRegression是一个estimator,然后通过调用fit(),得到一个LogisticRegressionModel,这是一个transformer。
每个transformer和estimator都有一个唯一ID,用于保存对应的参数
pipeline
例如一个文本挖掘包含以下三个步骤:
1. 将文本切分成词
2. 将词转换成特征向量
3. 训练得到一个模型,然后用于预测
spark ML将这样一个工作流定义为pipeline,一个pipeline包含多个PipelineStages (transformer和estimator),通过dataFrame在各个stage中进行传递。
这是一个训练模型的例子,包含了三个步骤,蓝色的是指transformer,红色是estimator
这是一个使用已训练模型预测样本的例子,
Parameters
一个Paramap包含多个(parameter, value)的键值对
有两种方法将参数传给算法:
1. 将参数设置到算法的一个实例,例如lr是LogisticRegression的一个实例,则他可以调用lr.setMaxIter(10)来设置训练循环次数
2. 将paramap作为输入参数,给fit()或者transform(),这些参数会都会覆盖掉原来set的值
我们可以将paramap传给不同实例,例如lr1和lr2是LogisticRegression的两个实例,我们可以建立ParamMap(lr1.maxIter -> 10, lr2.maxIter -> 20)的参数列表,即将两个实例的参数都放在paramMap中
spark1.6的版本可以使用import/export导出模型或者pipeline到磁盘上
范例1
import org.apache.spark.ml.classification.LogisticRegression
import org.apache.spark.ml.param.ParamMap
import org.apache.spark.mllib.linalg.{Vector, Vectors}
import org.apache.spark.sql.Row
val training = sqlContext.createDataFrame(Seq(
(1.0, Vectors.dense(0.0, 1.1, 0.1)),
(0.0, Vectors.dense(2.0, 1.0, -1.0)),
(0.0, Vectors.dense(2.0, 1.3, 1.0)),
(1.0, Vectors.dense(0.0, 1.2, -0.5))
)).toDF("label", "features")
//创建一个LogisticRegression实例,这是一个Estimator.
val lr =