版权声明:本套技术专栏是作者(秦凯新)平时工作的总结和升华,通过从真实商业环境抽取案例进行总结和分享,并给出商业应用的调优建议和集群环境容量规划等内容,请持续关注本套博客。版权声明:禁止转载,欢迎学习。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()