模型选择, 超参调整
ML Tuning
: model selection
(模型选择) and hyperparameter tuning
(超参调整)
本节介绍如何使用MLlib的工具来调整ML算法和管道。内置的交叉验证和其他工具允许用户优化算法和管道中的超参数。
Model selection(又叫hyperparameter tuning)
ML中的一个重要任务是Model Selection
(选择模型),或者使用数据为给定任务找到最佳模型或参数。这也被称为Tuning
(调整)。调整可以是以针对三个Estimators算子如LogisticRegression进行调整,也可以对整个Pipeline进行调整。用户可以一次对Pipeline整体进行调整,而不是对Pipeline的每个元素单独进行调整。
MLlib支持使用CrossValidator和TrainValidationSplit的工具进行模型选择。这些工具需要下列项目:
- Estimator: 需要调整的算法或Pipeline
- Set of ParamMaps: 可供选择的参数,有时称为“parameter grid”来搜索
- Evaluator: 度量标准,衡量一个拟合Model在测试数据上的表现
在较高层面上,这些模型选择工具的工作如下:
- 他们将输入数据分成单独的训练和测试数据集。
- 对每组训练数据与测试数据对,对参数表集合,用相应参数来拟合估计器,得到训练后的模型,再使用评估器来评估模型表现。
- 选择最好的一组参数生成的模型。
其中,对于回归问题评估器可选择RegressionEvaluator
,二值数据可选择BinaryClassificationEvaluator
,多分类问题可选择MulticlassClassificationEvaluator
。评估器里默认的评估准则可通过setMetricName
方法重写。
用户可通过ParamGridBuilder构建参数网格。
Cross-Validation
CrossValidator
将数据集划分为若干子集分别地进行训练和测试。如当k=3时,CrossValidator产生3个训练数据与测试数据对,每个数据对使用2/3的数据来训练,1/3的数据来测试。对于一组特定的参数表,CrossValidator计算基于三组不同训练数据与测试数据对训练得到的模型的评估准则的平均值。确定最佳参数表后,CrossValidator最后使用最佳参数表基于全部数据来重新拟合Estimator。
示例:
注意对参数网格进行交叉验证的成本是很高的。如下面例子中,参数网格hashingTF.numFeatures
有3个值,lr.regParam
有2个值,CrossValidator使用2折交叉验证。这样就会产生(3*2)*2 = 12
中不同的模型需要进行训练。在实际的设置中,通常有更多的参数需要设置,且我们可能会使用更多的交叉验证折数(3折或者10折都是经使用的)。所以CrossValidator的成本是很高的,尽管如此,比起启发式的手工验证,交叉验证仍然是目前存在的参数选择方法中非常有用的一种。
Examples
有关API的更多详细信息,请参阅CrossValidatorPython文档。
1 | from pyspark.ml import Pipeline |
output:
1 | Row(id=4, text='spark i j k', probability=DenseVector([0.627, 0.373]), prediction=0.0) |
Find full example code at “examples/src/main/python/ml/cross_validator.py” in the Spark repo.
Train-Validation Split
除了交叉验证以外,Spark还提供 TrainValidationSplit
用以进行超参数调整。和交叉验证评估K次不同, TrainValidationSplit
只对每组参数评估一次。因此它计算代价更低,但当训练数据集不是足够大时,其结果可靠性不高。
与交叉验证不同, TrainValidationSplit
仅需要一个训练数据与验证数据对。使用训练比率参数将原始数据划分为两个部分。如当训练比率为0.75时,训练验证分裂使用75%数据以训练,25%数据以验证。
与交叉验证相同,确定最佳参数表后,训练验证分裂最后使用最佳参数表基于全部数据来重新拟合Estimator。
Examples
有关API的更多详细信息,请参阅TrainValidationSplitPython文档。
1 | from pyspark.ml.evaluation import RegressionEvaluator |
output:
1 | +--------------------+--------------------+--------------------+ |
Find full example code at “examples/src/main/python/ml/train_validation_split.py” in the Spark repo.
更多相关信息请查阅Spark ml-tuning