在ML中一个重要的任务就是模型选择,或者使用给定的数据为给定的任务寻找最适合的模型或参数。这个过程又称调优。调优可以是对单个阶段进行调优,也可以一次性对整个Pipeline进行调优。

MLlib支持使用类似CrossValidator和TrainValidationSplit这样的工具进行模型选择。

这些工具需要以下组件:

  • Estimator:用户调优的算法或Pipeline。
  • ParamMap集合:提供参数选择,有时又称用户查找的参数网格( parameter grid)。参数网格可以使用ParamGridBuilder来构建。
  • Evaluator: 衡量模型在测试数据上的拟合程度。

模型选择工具工作原理如下:

  • 1 )将输人数据划分为训练数据和测试数据。
  • 2)对于每个(训练,测试)对,遍历一组ParamMaps。 用每一个ParamMap参数来拟合估计器,得到训练后的模型,再使用评估器来评估模型表现。
  • 3)选择性能表现最优模型对应参数表。

1.1、交叉验证

   交叉验证( CrossValidator)会将数据集切分成K折数据集合,分别用于训练和测试。例如,K= 3时,CrossValidator 会生成3个(训练数据,测试数据)对,每一个数据对的训练数据占2/3,测试数据占1/3。为了评估一个ParamMap, CrossValidator 会计算这3个不同的(训练,测试)数据集对在Estimator拟合出的模型上的平均评估指标。
  在找出最好的ParamMap后,CrossValidator 会利用此ParamMap在整个训练集上训练(fit) 出一个泛化能力强、误差相对小的最佳模型,整个过程处于流程化管理之中,其工作流程如下图

Spark Cross Validator 流程图

模型调优temperature_模型调优temperature


  虽然利用CrossValidator来训练模型可以提升泛化能力,但其代价也比较高,如选择K= 3、regParam = (0.1 ,0.01)、numIters = (10,20) 这样就需要对模型训练3x2x2= 12 次。然而,对比启发式的手动调优,这是选择参数的行之有效的方法。

1.2、训练-验证切分

  交叉验证的代价比较高昂,为此Spark也为超参数调优提供了训练-验证切分( TrainValidationSplit)。TrainValidationSplit 创建单一的(训练,测试)数据集对。它使用trainRatio参数将数据集切分成两部分。例如,当设置trainRatio= 0.8时,TrainValidation-Split会对数据进行如下切分: 80%作为数据集20%作为验证集,以此来生成训练、测试集对,并最终使用最好的ParamMap和完整的数据集来拟合评估器。

  相对于CrossValidator对每一个参数进行K次评估,TrainValidationSplit 只对每个参数组合评估1次(见下图所示)。因此它的评估代价没有那么高,但是当训练数据集不够大的时候其结果相对不够可信。

模型调优temperature_数据集_02