ML中的一个重要任务是模型选择,或者使用数据为给定任务找到最佳的模型或参数。这也称为调优。可以对单个的估计器(如LogisticRegression)进行调优,也可以对包括多种算法、特性化和其他步骤的整个pipeline进行调优。用户可以一次调优整个Pipeline,而不是分别调优 Pipeline 中的每个元素。
ML中的一个重要任务是模型选择,或者使用数据为给定任务找到最佳的模型或参数。这也称为调优。可以对单个的Estimator(如LogisticRegression)进行调优,也可以对包括多种算法、特性化和其他步骤的整个pipeline进行调优。用户可以一次调优整个Pipeline,而不是分别调优Pipeline中的每个元素。
MLlib支持使用CrossValidator和TrainValidationSplit等工具进行模型选择。这些工具需要具备以下条件:
- 估计器:要调优的算法或管道pipeline
- 一组参数:可选择的参数,有时称为搜索的“参数网格”
- 评估者:度量拟合模型在测试数据上的表现
这些模型选择工具的工作方式如下:
- 他们将输入数据拆分为单独的训练和测试数据集。
- 对于每个(训练、测试)对,它们遍历ParamMap 集合:
对于每个ParamMap,使用这些参数拟合Estimator,得到拟合的Model,并使用Evaluator 评估Model的性能。
- 他们选择Model由表现最好的一组参数产生。
为了帮助构造参数网格,用户可以使用ParamGridBuilder。默认情况下,参数网格中的参数集以串行方式计算。在使用CrossValidator或TrainValidationSplit运行模型选择之前,可以通过将并行度设置为2或更多(1的值将是串行的)来并行地进行参数评估。并行度的值应该谨慎选择,以便在不超过集群资源的情况下最大化并行度,较大的值不一定会提高性能。一般来说,10以上的值对大多数集群来说应该足够了。
交叉验证
CrossValidator交叉验证器首先将数据集分割为一组折叠数据集,这些折叠数据集用作单独的训练数据集和测试数据集。例如,当k=3次时,CrossValidator将生成3对(训练,测试)数据集,每对数据集使用2/3的数据进行训练,1/3的数据进行测试。为了评估一个特定的ParamMap, CrossValidator通过在3个不同的(训练,测试)数据集对上拟合Estimator产生的3个模型计算平均评估度量。
在确定最佳ParamMap之后,CrossValidator最终使用最佳ParamMap和整个数据集重新匹配Estimator。
训练验证拆分
除了 CrossValidator 之外,Spark 还提供了用于超参数调优的 TrainValidationSplit。TrainValidationSplit 只计算每个参数组合一次,而在 CrossValidator 的情况下是k次。因此,它的成本较低,但当训练数据集不够大时,它不会产生可靠的结果。
与 CrossValidator 不同,TrainValidationSplit 创建单个(训练、测试)数据集对。它使用 trainRatio 参数将数据集分成这两部分。例如,当trainRatio=0.75 时,TrainValidationSplit 将生成一个训练和测试数据集对,其中 75% 的数据用于训练,25% 用于验证。
像 CrossValidator 一样,TrainValidationSplit 最终使用最佳 ParamMap 和整个数据集匹配 Estimator。