一、模型选择(a.k.a 参数调优)
ML中一个很重要的任务是模型选择(model selection),或者对于给定任务,使用数据来发现最佳的模型或参数。这被称为参数调优(tuning)。Tuning可以在单个Estimators(比如:LogisticRegression)上进行,也可以在整个Pipeline上(可包含多个算法,特征化及其它步骤)进行。
MLlib支持模型选择工具: CrossValidator 和 TrainValidationSplit。这些工具需要以下的item:
- Estimator:要调优的算法或Pipeline
- ParamMap集合:要选择的参数,有时称为“parameter grid”穷举搜索
- Evaluator:要计算的metric,如何更好地对fit后的Model在测试数据上进行评估
这些模型选择工具按以下步骤工作:
- 将数据split成独立的训练集和测试集
- 对于每个(training,test) pair,迭代整个ParamMap参数空间;对于每个ParamMap,它们都会使用这些参数对Estimator进行fit,得到对应fitted后的Model,然后使用valuator评估该Model的性能。
- 选择最好性能的参数集生成模型
对于回归问题,Evaluator可以是RegressionEvaluator;对于二元分类问题,可以使用 BinaryClassificationEvaluator;对于多分类问题,可以使用MulticlassClassificationEvaluator。缺省的metric用于选择最好的ParamMap,对于每个这样的Evaluator,可以通过setMetricName方法进行override。
为了构建parameter grid,用户可以使用ParamGridBuilder 工具类。
二、Cross-Validation
CrossValidator会将数据集分割成几个folds,它们可以用于独立的训练集和测试集。例如:k=3 folds时,CrossValidator会生成3个(training, test) pair,每个都会使用2/3的数据作为训练集,1/3作为测试集。为了评估一个特定的ParamMap,对于在3个不同的数据pair上使用Estimator 进行fit产生3个模型,CrossValidator会计算三个evaluation metric的平均值。
在选择效果最好的ParamMap之后,CrossValidator最后会使用相应的Estimator,和最好的ParamMap,对整个数据集进行refit。
2.1 示例:通过cross-validation进行模型选择
下例展示了如何使用CrossValidator来选择参数。
注意,在一个参数空间内进行cross-validation是相当昂贵的。例如,在下面的示例中,param grid中的hashingTF.numFeatures具有3个值,而lr.regParam具有2个值,CrossValidator使用2-folds。这会生成(3x2)x2=12种要训练的不同模型。在实际设置中,尝试很多参数、以及使用很多folds(k=3或k=10都很常用)是很常见的。换句话说,使用CrossValidator是非常昂贵的,然后,它也是选择参数的很受认可的方法,它比启发式的手工调参更权威。
完整代码:examples/src/main/scala/org/apache/spark/examples/ml/ModelSelectionViaCrossValidationExample.scala
3. Train-Validation Split
Spark中,除了CrossValidator,还提供了TrainValidationSplit来进行参数调优。TrainValidationSplit只评估一次每次参数组合,而CrossValidator则要进行k次。它的开销更小,当训练数据集不够大时,不会产生可靠的结果。
不像CrossValidator,TrainValidationSplit会创建单个 (training, test) pair。它使用trainRatio参数将数据集split成两部分。例如: trainRatio=0.75,TrainValidationSplit会生成一个训练集(75%)和一个测试集(25%)。
和CrossValidator类似,TrainValidationSplit最后会使用Estimator、以及最好的ParamMap,对整个数据集进行fit。
示例:通过TrainValidationSplit进行模型选择
参考:
1.http://spark.apache.org/docs/latest/ml-tuning.html