[Spark2.0]ML 调优:模型选择和超参数调优
Posted yhao浩
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Spark2.0]ML 调优:模型选择和超参数调优相关的知识,希望对你有一定的参考价值。
本节讲述如何使用MLlib提供的工具来对ML算法和Pipline进行调优。内建的交叉验证和其他工具允许用户在算法和Pipline中优化超参数。
模型选择(又名超参数调优)
在ML中一个重要的任务就是模型选择,或者使用给定的数据为给定的任务寻找最适合的模型或参数。这也叫做调优。调优可以是对单个的Estimator,比如LogisticRegression,或者是包含多个算法、向量化和其他步骤的整个Pipline。用户可以一次性对整个Pipline进行调优,而不必对Pipline中的每一个元素进行单独的调优。
MLlib支持使用像CrossValidator和TrainValidationSplit这样的工具进行模型选择。这些工具需要以下的组件:
- 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=3和k=10都很常见)。换句话说,使用CrossValidator的代价可能会异常的高。然而,对比启发式的手动调优,这是选择参数的行之有效的方法。
可以在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。
示例:通过训练/验证切分选择模型
可以在Spark仓库的"examples/src/main/scala/org/apache/spark/examples/ml/ModelSelectionViaTrainValidationSplitExample.scala"找到完整的代码。
原文地址:http://spark.apache.org/docs/2.0.0/ml-tuning.html
以上是关于[Spark2.0]ML 调优:模型选择和超参数调优的主要内容,如果未能解决你的问题,请参考以下文章
Spark2.0机器学习系列之2:基于Pipeline交叉验证ParamMap的模型选择和超参数调优