[Spark2.0]ML 调优:模型选择和超参数调优

        本节讲述如何使用MLlib提供的工具来对ML算法和Pipline进行调优。内建的交叉验证和其他工具允许用户在算法和Pipline中优化超参数。

 

 

模型选择(又名超参数调优)

       ML中一个重要的任务就是模型选择,或者使用给定的数据为给定的任务寻找最适合的模型或参数。这也叫做调优。调优可以是对单个的Estimator,比如LogisticRegression,或者是包含多个算法、向量化和其他步骤的整个Pipline。用户可以一次性对整个Pipline进行调优,而不必对Pipline中的每一个元素进行单独的调优。

       MLlib支持使用像CrossValidatorTrainValidationSplit这样的工具进行模型选择。这些工具需要以下的组件:

  • Estimator:用户调优的算法或Pipline
  • ParamMap集合:提供参数选择,有时也叫作用户查找的“参数网格”
  • Evaluator:衡量模型在测试数据上的拟合程度

      

在上层,这些模型选择工具的工作方式如下:

  • 将输入数据切分成训练数据集和测试数据集
  • 对于每一个(训练数据,测试数据)对,通过ParamMap集合进行迭代:
    • 对于每个ParamMap,使用它提供的参数对Estimator进行拟合,给出拟合模型,然后使用Evaluator来评估模型的性能
  • 选择表现最好的参数集合生成的模型

 

       针对回归问题,Evaluator可以是一个RegressionEvaluator;针对二进制数据,可以是BinaryClassificationEvaluator,或者是对于对分类问题的MulticlassClassificationEvaluator。用于选择最佳ParamMap的默认度量方式可以通过评估器的setMetricName方法进行覆盖。

       为了方便构造参数网格,用户可以使用通用的ParamGridBuilder

 

 

交叉验证

       CrossValidator 从将数据集切分成K折数据集合,并被分别用于训练和测试,例如,K=3折时,CrossValidator会生成3个(训练数据,测试数据)对,每一个数据对的训练数据占2/3,测试数据占1/3。为了评估一个ParamMap,CrossValidator 会计算这三个不同的(训练,测试)数据集对在Estimator拟合出的模型上的平均评估指标。

       在找出最好的ParamMap后,CrossValidator 会使用这个ParamMap和整个的数据集来重新拟合Estimator

 

示例:使用交叉验证进行模型选择

       下面示例示范了使用CrossValidator从整个网格的参数中选择合适的参数。

       注意在整个参数网格中进行交叉验证是比较耗时的。例如,在下面的例子中,参数网格有3个hashingTF.numFeatures值和2个lr.regParam值,CrossValidator使用2折切分数据。最终将有(3 * 2) * 2 = 12个不同的模型将被训练。在真实场景中,很可能使用更多的参数和进行更多折切分(k=3k=10都很常见)。换句话说,使用CrossValidator的代价可能会异常的高。然而,对比启发式的手动调优,这是选择参数的行之有效的方法。

[Spark2.0]ML 调优:模型选择和超参数调优_第1张图片

[Spark2.0]ML 调优:模型选择和超参数调优_第2张图片

      可以在Spark仓库的"examples/src/main/scala/org/apache/spark/examples/ml/ModelSelectionViaCrossValidationExample.scala"找到完整的代码。

 

 

训练-验证切分

       作为CrossValidator 的附加,Spark就同样为超参数调优提供了TrainValidationSplit。相对于CrossValidator的K次评估,TrainValidationSplit只对每个参数组合评估一次。因此它的评估代价没有这么高,但是当训练数据集不够大的时候其结果相对不够可信。

       不同于CrossValidator,TrainValidationSplit创建单一的(训练,测试)数据集对。它使用trainRatio参数将数据集切分成两部分。例如,当设置trainRatio=0.75时,TrainValidationSplit将会将数据切分75%作为数据集,25%作为验证集,来生成训练、测试集对。

       CrossValidator相似,TrainValidationSplit最终使用最好的ParamMap和完整的数据集来拟合Estimator

 

示例:通过训练/验证切分选择模型

[Spark2.0]ML 调优:模型选择和超参数调优_第3张图片

可以在Spark仓库的"examples/src/main/scala/org/apache/spark/examples/ml/ModelSelectionViaTrainValidationSplitExample.scala"找到完整的代码。



原文地址:http://spark.apache.org/docs/2.0.0/ml-tuning.html

你可能感兴趣的:(spark)