【Spark】模型选择和调优
翻译自:http://spark.apache.org/docs/2.3.2/ml-tuning.html
介绍如何使用MLlib的工具来调整ML算法和Pipelines。 内置的交叉验证和其他工具允许用户优化算法和pipelines中的超参数。
1. 模型选择(亦称 超参数调优)
ML中的一项重要任务是模型选择,或使用数据来查找给定任务的最佳模型或参数。这也称为调整。可以针对单个estimator(例如LogisticRegression)或针对包括多个算法,特征化和其他步骤的整个pipeline进行调整。用户可以一次调整整个pipeline,而不是分别调整管道中的每个元素。
MLlib支持使用CrossValidator和TrainValidationSplit等工具进行模型选择。这些工具需要以下项目:
- Estimator:算法或pipeline调整
- 一组ParamMaps:可供选择的参数,有时也称为“参数网格”(“parameter grid”)来搜索
- 评估器:衡量拟合模型对保持测试数据的效果的度量标准
从较高的层面来看,这些模型选择工具的工作原理如下:
- 他们将输入数据分成单独的训练和测试数据集。
- 对于每个(训练,测试)对,他们遍历ParamMaps集合:
- 对于每个ParamMap,它们使用这些参数拟合Estimator,获得拟合的模型,并使用Evaluator评估模型的性能。
- 他们选择由性能最佳的参数组生成的模型。
Evaluator可以是回归问题的RegressionEvaluator,二进制数据的BinaryClassificationEvaluator,或多类问题的MulticlassClassificationEvaluator。 用于选择最佳ParamMap的默认度量标准可以由每个评估程序中的setMetricName方法覆盖。
为了帮助构造参数网格,用户可以使用ParamGridBuilder。 默认情况下,参数网格中的参数集将按顺序进行评估。 在使用CrossValidator或TrainValidationSplit运行模型选择之前,可以通过设置值为2或更大的并行度(值为1是船型的)来并行完成参数评估。 应谨慎选择并行度的值,以在不超出群集资源的情况下最大化并行性,并且较大的值可能并不总是导致性能提高。 一般来说,对于大多数集群而言,高达10的值应该足够了。
2. 交叉验证
CrossValidator首先将数据集拆分为一组folds,这些folds用作单独的训练和测试数据集。例如,当k = 3倍时,CrossValidator将生成3个(训练,测试)数据集对,每个数据集对使用2/3的数据进行训练,1/3进行测试。为了评估特定的ParamMap,CrossValidator通过在3个不同(训练,测试)数据集对上拟合Estimator来计算3个模型的平均评估度量。
在确定最佳ParamMap之后,CrossValidator最终使用最佳ParamMap和整个数据集重新拟合Estimator。
示例:通过交叉验证选择模型
以下示例演示如何使用CrossValidator从参数网格中进行选择。
请注意,通过参数网格进行交叉验证非常昂贵。例如,在下面的示例中,参数网格具有3个hashingTF.numFeatures值和2个lr.regParam值,CrossValidator使用2个折叠。这乘以(3×2)×2 = 12个正在训练的不同模型。在实际设置中,通常可以尝试更多参数并使用更多折叠(k = 3和k = 10是常见的)。换句话说,使用CrossValidator可能非常昂贵。然而,它也是一种成熟的方法,用于选择比启发式手动调整更具统计学意义的参数。
1 | # -*- coding: utf-8 -*- |
结果如下:
1 | Row(id=4, text=u'spark i j k', probability=DenseVector([0.1702, 0.8298]), prediction=1.0) |
3. 训练集-验证集划分
除了CrossValidator之外,Spark还提供TrainValidationSplit用于超参数调整。
与CrossValidator一样,TrainValidationSplit最终使用最佳ParamMap和整个数据集来拟合Estimator。
示例代码如下:
1 | # -*- coding: utf-8 -*- |
结果如下:
1 | +--------------------+-----+----------+ |
【Spark】模型选择和调优