Spark ML Pipeline模型选择及超参数评估调优深入剖析 -Spark商业ML实战

版权声明:本套技术专栏是作者(秦凯新)平时工作的总结和升华,通过从真实商业环境抽取案例进行总结和分享,并给出商业应用的调优建议和集群环境容量规划等内容,请持续关注本套博客。版权声明:禁止转载,欢迎学习。QQ邮箱地址:[email protected],如有任何商业交流,可随时联系。 https://blog.csdn.net/shenshouniu/article/details/84197012

本套技术专栏是作者(秦凯新)平时工作的总结和升华,通过从真实商业环境抽取案例进行总结和分享,并给出商业应用的调优建议和集群环境容量规划等内容,请持续关注本套博客。版权声明:禁止转载,欢迎学习。QQ邮箱地址:[email protected],如有任何商业交流,可随时联系。

1 燃烧吧!模型选择

  • 模型选择可以针对单个Estimtor进行,比如:逻辑回归,决策树等。
  • 模型选择同样可以基于整套流水线进行参数调优,从而避免了对PipeLine中的每一个元素进行单独调优。
  • Estimtor:用户调优的算法或者Pipeline。
  • ParamMap: 用于参数选择,支持多参数如:迭代次数,正则化等。
  • Evaluator:衡量模型在测试数据上的最终拟合程度,给出评估结果。

2 放飞吧!参数网格

  • ML目前支持交叉验证(CrossValidator)和训练验证拆分法(TranValidationSplit)

3 燃烧吧!模型训练流程

  • 训练集和测试集进行切分。
  • 根据参数网格,对每一个测试数据和训练数据进行迭代,最后根据Evaluator来评估模型的性能。
  • 选择最好的参数集合生成最优模型。

4 燃烧吧!Evaluator 评估器

  • RegressionEvaluator 用于回归问题,
  • BinaryClassificationEvaluator 用于二分类
  • MulticlassClassificationEvaluator 用于多类问题。
  • 用于选择最佳值ParamMap的默认度量指标可以被evaluators的setMetricName方法覆盖。

5 ML交叉验证PipeLine案例实战

5.1 CrossValidator 训练查分验证法

  • CrossValidator 先将数据集划分为多组(比如:3组),每一组有训练集和测试集组成,因此就会有3个训练集和3个测试集。
  • 3折交叉验证,每一组数据是2/3用来训练,1/3用来测试。
  • 为了评估出一个组特殊的paramMap,crossValidator会通过Estimator在三组不同数据集上调用fit产生的3个模型的平均评估指标。
  • 确定最佳ParamMap后,CrossValidator最后使用最佳ParamMap和整个数据集重新拟合Estimator。
举例如下:

选择2折交叉验证,参数网格中有两个参数:hashingTF.numFeatures有3个值 以及lr.regParam有2个值。那么有多少模型用于训练呢?
(3×2)×2=12,也即12个模型用于训练,因此可见代价还是非常高的。

5.2 CrossValidator官方案例实战
import org.apache.spark.ml.Pipeline
import org.apache.spark.ml.classification.LogisticRegression
import org.apache.spark.ml.evaluation.BinaryClassificationEvaluator
import org.apache.spark.ml.feature.{HashingTF, Tokenizer}
import org.apache.spark.ml.linalg.Vector
import org.apache.spark.ml.tuning.{CrossValidator, ParamGridBuilder}
import org.apache.spark.sql.Row
//准备训练数据,格式(id,text,label)
val training = spark.createDataFrame(Seq(
 (0L, "a b c d e spark", 1.0),
 (1L, "b d", 0.0),
 (2L, "spark f g h", 1.0),
 (3L, "hadoop mapreduce", 0.0),
 (4L, "b spark who", 1.0),
 (5L, "g d a y", 0.0),
 (6L, "spark fly", 1.0),
 (7L, "was mapreduce", 0.0),
 (8L, "e spark program", 1.0),
 (9L, "a e c l", 0.0),
 (10L, "spark compile", 1.0),
 (11L, "hadoop software", 0.0)
)).toDF("id", "text", "label")

//配置一个ML pipeline,总共有三个stages:tokenizer, hashingTF, and lr
val tokenizer = new Tokenizer()
 .setInputCol("text")
 .setOutputCol("words")
val hashingTF = new HashingTF()
 .setInputCol(tokenizer.getOutputCol)
 .setOutputCol("features")
val lr = new LogisticRegression()
 .setMaxIter(10)//输入label,features,prediction均可采用默认值名称。
val pipeline = new Pipeline()
 .setStages(Array(tokenizer, hashingTF, lr))

//用ParamGridBuilder构建一个查询用的参数网格
//hashingTF.numFeatures有三个值,lr.regParam有两个值,
//该网格将会有3*2=6组参数被CrossValidator使用
val paramGrid = new ParamGridBuilder()
 .addGrid(hashingTF.numFeatures, Array(10, 100, 1000))
 .addGrid(lr.regParam, Array(0.1, 0.01))
 .build()

猜你喜欢

转载自blog.csdn.net/shenshouniu/article/details/84197012