Spark机器学习——模型选择与参数调优之交叉验证
时间:2022-05-06
本文章向大家介绍Spark机器学习——模型选择与参数调优之交叉验证,主要内容包括spark 模型选择与超参调优、超参数的选择、评估函数的确定、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
spark 模型选择与超参调优
机器学习可以简单的归纳为 通过数据训练
y = f(x)
的过程,因此定义完训练模型之后,就需要考虑如何选择最终我们认为最优的模型。
如何选择最优的模型,就是本篇的主要内容:
- 模型验证的方法
- 超参数的选择
- 评估函数的选择
模型验证的方法
在《统计学习方法》这本书中,曾经讲过模型验证的方法有三种,分别是简单的交叉验证
,S折交叉验证
,留一交叉验证
简单的交叉验证
即把全部数据按照比例分割成两部分,分别是训练集和测试集。在训练集训练模型,在测试集测试效果,最终选择一个代价比较小的结果。一般是0.75。
S折交叉验证
设置S为一个数,一般是3或者10居多。如果是3,那么前2份作为训练集,最后一份作为测试集。
留一交叉验证
如果S的个数正好是样本的容量,就是留一交叉验证。
PS: 训练集是用于训练模型,测试集适用于判断此次训练效果。
在Spark MLLib中,为我们提供了两种验证方法,分别是
-
Cross-Validation
: S折交叉验证 -
Train-ValidationSplit
:简单交叉验证
超参数的选择
在Spark MLLib中,超参数可以通过上面的验证方法,作为参数传进去:
// 定义超参数集合
val paramGrid = new ParamGridBuilder()
.addGrid(hashingTF.numFeatures, Array(10, 100, 1000))
.addGrid(lr.regParam, Array(0.1, 0.01))
.build()
// 定义验证器
val cv = new CrossValidator()
.setEstimator(pipeline)
.setEvaluator(new BinaryClassificationEvaluator)
.setEstimatorParamMaps(paramGrid)
.setNumFolds(2) // Use 3+ in practice
其中hashingTF给设置了3个参数、lr给了2个参数,如果正常我们想要验证这6个参数的组合,应该需要验证6次。但是在Spark中,基于Validator可以一次性验证出来,并自动选择最后代价最小的那个。
PS
上面S折交叉验证中S的参数为2,因此内部只有一个训练集;如果是3,那么最终运行的训练次数将会是 (3*2)*2 = 12
次。
评估函数的确定
Spark提供了三种评估函数:
-
RegressionEvaluator
用于回归预测的问题 -
BinaryClassificationEvaluator
用于二分类问题 -
MulticlassClassificationEvaluator
用于多分类问题
详细的代码,可以参考: http://spark.apache.org/docs/latest/ml-tuning.html
- mono-3.4.0 源码安装时出现的问题 [do-install] Error 2 [install-pcl-targets] Error 1 解决方法
- 安装 IronPython
- Python 项目实践三(Web应用程序)第一篇
- Centos 7.0 安装Mono 3.4 和 Jexus 5.6
- 第一个IronPython程序(之二)
- Python 项目实践二(下载数据)第四篇
- Python 项目实践二(下载数据)第三篇
- 体验扁平化的WordPress 后台管理界面
- Python 项目实践二(生成数据)第二篇
- 重新审视SqlDataReader的使用
- Python 项目实践二(生成数据)第一篇
- 删除 WordPress 导航菜单的多余 CSS 选择器
- 删除 WordPress 导航菜单的多余 CSS 选择器
- 使用asp.net 2.0的CreateUserwizard控件如何向自己的数据表中添加数据
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- [数据结构] 平衡二叉查找树 (AVL树)
- 写给前端的算法进阶指南,我是如何两个月零基础刷200题
- [Java] 在Java中优雅地进行文件IO操作
- [Java] 日期与时间的一些操作
- 一起来用python实现一下十大经典排序算法
- [数据结构] 稀疏矩阵的存储
- [Python] 关于 asyncio 与 aiohttp 协程并发的探索
- [数据结构]结构体练习之复数运算
- [数据结构] 队列的链式存储实现
- [数据结构] 两个有序线性表的合并
- Spring 简介,带你打开 Spring 的大门
- go test 测试用例那些事(二) mock
- [数据结构]链式存储: 多项式求和
- [Web] CSS 中 Display(显示) 与 Visibility(可见性)的区别与用法
- [数据结构] 二叉搜索树的CURD(增删改查)操作