【pyspark学习从入门到精通21】机器学习库_4

目录

评估模型的性能

保存模型

参数超参数调整

网格搜索


评估模型的性能

显然,我们现在想测试我们的模型表现得如何。PySpark 在包的 .evaluation 部分提供了一些分类和回归的评估方法:

import pyspark.ml.evaluation as ev

我们将使用 BinaryClassficationEvaluator 来测试我们的模型表现如何:

evaluator = ev.BinaryClassificationEvaluator(rawPredictionCol='probability', labelCol='INFANT_ALIVE_AT_REPORT')

rawPredictionCol 可以是估计器产生的 rawPrediction 列,也可以是概率。

让我们看看我们的模型表现如何:

print(evaluator.evaluate(test_model, {evaluator.metricName: 'areaUnderROC'}))
print(evaluator.evaluate(test_model, {evaluator.metricName: 'areaUnderPR'}))

前面的代码产生了以下结果:

ROC 曲线下面积为 74%,PR 曲线下面积为 71%,显示出一个定义良好的模型,但并没有什么非凡之处;如果我们有其他特征,我们可以提高这个数值,但这不是本章(更不用说这本书)的目的。

保存模型

PySpark 允许你保存管道定义以供以后使用。它不仅保存管道结构,还保存所有转换器和估计器的定义:

pipelinePath = './infant_oneHotEncoder_Logistic_Pipeline'
pipeline.write().overwrite().save(pipelinePath)

所以,你可以在以后加载它,并直接使用它来 .fit(...) 和预测:

loadedPipeline = Pipeline.load(pipelinePath)
loadedPipeline \.fit(births_train)\.transform(births_test)\.take(1)

前面的代码产生了相同的结果(正如预期):

然而,如果你想保存估计出的模型,你也可以这样做;而不是保存管道,你需要保存 PipelineModel。

要保存你的模型,请看以下示例:

from pyspark.ml import PipelineModel
modelPath = './infant_oneHotEncoder_Logistic_PipelineModel'
model.write().overwrite().save(modelPath)
loadedPipelineModel = PipelineModel.load(modelPath)
test_reloadedModel = loadedPipelineModel.transform(births_test)

前面的脚本使用 PipelineModel 类的类方法 .load(...) 来重新加载估计出的模型。你可以将 test_reloadedModel.take(1) 的结果与我们之前展示的 test_model.take(1) 的输出进行比较。

参数超参数调整

很少情况下,我们的第一个模型会是我们能做的最好的。仅仅通过观察我们的指标,并因为它通过了我们预先设定的性能阈值而接受模型,这很难说是一种科学的方法来找到最佳模型。

参数超参数调整的概念是找到模型的最佳参数:例如,正确估计逻辑回归模型所需的最大迭代次数或决策树的最大深度。

在这一部分,我们将探讨两种概念,它们允许我们为我们的模型找到最佳参数:网格搜索和训练-验证分割。

网格搜索

网格搜索是一种穷尽算法,它遍历定义的参数值列表,估计单独的模型,并根据某些评估指标选择最佳模型。

这里应该谨慎说明:如果你定义了太多的参数要优化,或者这些参数的值太多,选择最佳模型可能需要很长时间,因为随着参数数量和参数值数量的增加,需要估计的模型数量会迅速增长。

例如,如果你想微调两个参数,每个参数有两个参数值,你将不得不拟合四个模型。增加一个具有两个值的参数将需要估计八个模型,而为我们的两个参数增加一个额外的值(将其带到每个参数的三个值)将需要估计九个模型。正如你所看到的,如果你不小心,这个很快就会失控。请看以下图表进行直观检查:

在这次警示性故事之后,让我们开始微调我们的参数空间。首先,我们加载包的 .tuning 部分:

import pyspark.ml.tuning as tune

接下来,让我们指定我们的模型和我们想要遍历的参数列表:

logistic = cl.LogisticRegression(labelCol='INFANT_ALIVE_AT_REPORT')
grid = tune.ParamGridBuilder() \.addGrid(logistic.maxIter, [2, 10, 50]) \.addGrid(logistic.regParam, [0.01, 0.05, 0.3]) \.build()

首先,我们指定我们想要优化参数的模型。接下来,我们决定我们将优化哪些参数,以及要测试这些参数的哪些值。我们使用 .tuning 子包中的 ParamGridBuilder() 对象,并使用 .addGrid(...) 方法向网格中添加参数:第一个参数是我们要优化的模型的参数对象(在我们的例子中,这些是 logistic.maxIter 和 logistic.regParam),第二个参数是我们想要遍历的值列表。调用 .ParamGridBuilder 上的 .build() 方法构建网格。

接下来,我们需要一种比较模型的方法:

evaluator = ev.BinaryClassificationEvaluator(rawPredictionCol='probability', labelCol='INFANT_ALIVE_AT_REPORT')

所以,再一次,我们将使用 BinaryClassificationEvaluator。现在轮到创建为我们执行验证工作的逻辑了:

cv = tune.CrossValidator(estimator=logistic, estimatorParamMaps=grid, evaluator=evaluator
)

CrossValidator 需要估计器、估计器参数映射和评估器来完成其工作。模型遍历值的网格,估计模型,并使用评估器比较它们的性能。

我们不能直接使用数据(因为 births_train 和 births_test 仍然有未编码的 BIRTHS_PLACE 列),所以我们创建一个纯粹的转换管道:

pipeline = Pipeline(stages=[encoder ,featuresCreator])
data_transformer = pipeline.fit(births_train)

完成这些后,我们准备好为我们的模型找到最优的参数组合了:

cvModel = cv.fit(data_transformer.transform(births_train))

cvModel 将返回估计出的最佳模型。现在我们可以使用它来看看它是否比我们之前的模型表现得更好:

data_train = data_transformer \.transform(births_test)
results = cvModel.transform(data_train)
print(evaluator.evaluate(results, {evaluator.metricName: 'areaUnderROC'}))
print(evaluator.evaluate(results, {evaluator.metricName: 'areaUnderPR'}))

前面的代码将产生以下结果:

正如你看到的,我们得到了一个稍微更好的结果。最佳模型有哪些参数?答案有点复杂,但以下是如何提取它的方法:

results = [([{key.name: paramValue} for key, paramValue in zip(params.keys(), params.values())], metric) for params, metric in zip(cvModel.getEstimatorParamMaps(), cvModel.avgMetrics)
]
sorted(results, key=lambda el: el[1], reverse=True)[0]

前面的代码产生了以下输出:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/479497.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

788页页大型集团财务集中管控平台项目总体规划方案全文深入解读

“大型集团公司财务集中管控平台项目”的总体规划方案,内容全面且详细,主要涵盖以下几个方面: 1. 项目概述:介绍了项目的背景、目标、预期收益、设计思路与方法及原则。项目旨在全面提升财务集中管控能力,提高财务价值…

mac下安装Ollama + Open WebUI + Llama3.1

本文介绍mac下安装Ollama Open WebUI Llama3.1 8b具体步骤。 目录 推荐配置Ollama Open WebUI Llama3.1简介安装Ollama安装Open WebUI 推荐配置 m1以上芯片,16g内存,20g以上硬盘空间 Ollama Open WebUI Llama3.1简介 Ollama: 下载,管理…

C 语言函数递归探秘:从基础概念到复杂问题求解的进阶之路

我的个人主页 我的专栏:C语言,希望能帮助到大家!!!点赞❤ 收藏❤ 目录 什么是函数递归递归的基本组成递归的工作原理递归的优缺点递归的经典案例 5.1 阶乘计算5.2 斐波那契数列5.3 汉诺塔问题5.4 二分查找 递归的高级…

Rust语言俄罗斯方块(漂亮的界面案例+详细的代码解说+完美运行)

tetris-demo A Tetris example written in Rust using Piston in under 500 lines of code 项目地址: https://gitcode.com/gh_mirrors/te/tetris-demo 项目介绍 "Tetris Example in Rust, v2" 是一个用Rust语言编写的俄罗斯方块游戏示例。这个项目不仅是一个简单…

Web开发:使用stackexchange.redis库对redis进行增删改查

一、安装第三方库 二、官网 StackExchange.Redis |通用型 redis 客户端 三、连接示例 private static string redisConnectionString "localhost:6379,passwordyourpassword,defaultDatabase0,syncTimeout10000";private static string redisConnectionString &q…

3分钟快速掌握—— 进制转换,二进制计算【零基础】

1、计算机中的进制 1.1进制的三要素 进制 数码 基数 位权 十进制 0 1 2 3 4 5 6 7 8 9 10 .......10^2 10^1 10^0 10^-1 10^-2 10^-3..... 二进制 0 1 2 .......2^2 2^1 2^0 2^-1 2^-2 2^-3..... 八进制 0 1 2 3 4 5 6 7 8 .......8^2 8^1 8^0 8^-1 8^-2 8^-3.…

HDMI转VGA方案 LT8612UX(HDMI2.0) LT8612SX LT8511EX LT8522EX LT8612EX_e(HDMI1.4)

一、产品概述 LT8612UX是一款高性能的HDMI至HDMI&VGA转换器,由龙迅半导体公司推出。它能够将HDMI2.0数据流转换为HDMI2.0信号和模拟RGB信号,同时输出8通道I2S和SPDIF信号,实现高质量的7.1声道音频。该转换器采用最新的ClearEdge技术&…

华三(HCL)和华为(eNSP)模拟器共存安装手册

接上章叙述,解决同一台PC上同时部署华三(HCL)和华为(eNSP)模拟器。原因就是华三HCL 的老版本如v2及以下使用VirtualBox v5版本,可以直接和eNSP兼容Oracle VirtualBox,而其他版本均使用Oracle VirtualBox v6以上的版本,…

滚动的轮胎css3动画案例

目录 一、介绍 二、思路分析 三、轮胎制作 1.HTML代码 2.css 3.运行结果 四、轮胎动画 五、路的制作 1.HTML 2.css 六、运行结果 七、结束语 一、介绍 本节内容我们来制作一个轮胎滚动的案例,可以当作一个loading,其中我们的轮胎是纯css完成的,…

PointNet++论文复现

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

基础入门-Web应用架构类别源码类别镜像容器建站模版编译封装前后端分离

知识点: 1、基础入门-Web应用-搭建架构上的技术要点 2、基础入门-Web应用-源码类别上的技术要点 一、演示案例-架构类别-模版&分离&集成&容器&镜像 1、套用模版型 csdn / cnblog / github / 建站系统等 安全测试思路上的不同: 一般…

【JMeter性能测试框架篇】Win10下搭建JMeter+Influxdb+Grafana可视化性能测试监控平台

一、前言 平常使用jmeter进行性能测试时,工具自带的监控方式无法清晰直观的查看结果,给我们性能测试带来很多不便。因此我们需要搭建一个可视化性能测试监控平台来实时监控性能测试结果,这里我们采用JMeterInfluxdbGrafana开源免费框架来实现…

Qt桌面应用开发 第八天(综合项目一 飞翔的鸟)

目录 1.鸟类创建 2.鸟动画实现 3.鼠标拖拽 4.自动移动 5.右键菜单 6.窗口透明化 项目需求: 实现思路: 创建项目导入资源鸟类创建鸟动画实现鼠标拖拽实现自动移动右键菜单窗口透明化 1.鸟类创建 ①鸟类中包含鸟图片、鸟图片的最小值下标和最大值…

【Linux庖丁解牛】—软件安装vim!

目录 1、Linux中的软件安装 a、源码安装 b、软件包安装——rpm c、包管理器安装 包管理器的使用演示(Ubuntu) 2、Linux编辑器——vim 2.1 vim的基本概念 2.2 vim的基本操作 2.3 vim正常模式命令集 2.4 vim末行模式命令集 3、vim编辑器环境的一…

【数据结构与算法】排序算法总结:冒泡 / 快排 / 直接插入 / 希尔 / 简单选择 / 堆排序 / 归并排序

1 排序 1.1 冒泡 内排序的交换排序类别 1.1.1 普通实现 public class BubbleSort {/*** 基本的 冒泡排序*/public static void bubbleSort(int[] srcArray) {int i,j; // 用于存放数组下标int temp 0; // 用于交换数值时临时存放值for(i0;i<srcArray.length-1;i){// j …

如何构建SAAS项目

在后台使用JDBC方式动态创建用户输入的数据库信息&#xff08;库名、地址、用户名、密码&#xff09; 执行预先写好的sql文件&#xff08;如mybatis的scriptRunner)执行建表语句及插入基础数据&#xff08;管理员用户、普通用户&#xff09;

MQ高级2:MQ的可靠性

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

transformer学习笔记-神经网络原理

在深度学习领域&#xff0c;transformer可以说是在传统的神经网络的基础上发展而来&#xff0c;着重解决传统神经网络长距离关联、顺序处理、模型表达能力等问题。 在学习transformer之前&#xff0c;我想&#xff0c;有必要先对传统的神经网络做简要的了解。 一、神经网络基本…

【前端】JavaScript中的字面量概念与应用详解

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 &#x1f4af;前言&#x1f4af;字面量1. 数字字面量2. 字符串字面量3. 布尔字面量4. 空值字面量&#xff08;null&#xff09;5. 对象字面量6. 数组字面量7. 正则表达式字面量8. 特殊值字面量9. 函数字…

字节跳动青训营刷题笔记19

问题描述 小R正在组织一个比赛&#xff0c;比赛中有 n 支队伍参赛。比赛遵循以下独特的赛制&#xff1a; 如果当前队伍数为 偶数&#xff0c;那么每支队伍都会与另一支队伍配对。总共进行 n / 2 场比赛&#xff0c;且产生 n / 2 支队伍进入下一轮。如果当前队伍数为 奇数&…