【pyspark学习从入门到精通14】MLlib_1

目录

包的概览

加载和转换数据


在前文中,我们学习了如何为建模准备数据。在本文中,我们将实际使用这些知识,使用 PySpark 的 MLlib 包构建一个分类模型。

MLlib 代表机器学习库。尽管 MLlib 现在处于维护模式,即它不再积极开发(并且很可能会在未来被弃用),但至少覆盖库的一些特性是有必要的。此外,MLlib 目前是唯一支持流式训练模型的库。

在这一部分中,你将学习如何执行以下操作:
- 使用 MLlib 为建模准备数据
- 执行统计测试
- 使用逻辑回归预测婴儿的生存机会
- 选择最可预测的特征并训练一个随机森林模型

包的概览

在高层次上,MLlib 提供了三个核心的机器学习功能:
- 数据准备:特征提取、转换、选择、分类特征的哈希以及一些自然语言处理方法
- 机器学习算法:实现了一些流行和先进的回归、分类和聚类算法
- 实用工具:描述性统计、卡方测试、线性代数(稀疏和密集矩阵和向量)以及模型评估方法等统计方法

正如你看到的,可用功能的范围允许你执行几乎所有基本的数据科学任务。

我们将构建两个分类模型:线性回归和随机森林。我们将使用我们从 http://www.cdc.gov/nchs/data_access/vitalstatsonline.htm 下载的 2014 年和 2015 年美国出生数据的一部分;在总共 300 个变量中,我们选择了 85 个特征来构建我们的模型。此外,在总共近 799 万条记录中,我们选择了一个平衡的样本,共有 45,429 条记录:22,080 条报告婴儿死亡的记录和 23,349 条婴儿存活的记录。

加载和转换数据

尽管 MLlib 设计时以 RDD 和 DStreams 为重点,为了便于转换数据,我们将读取数据并将其转换为 DataFrame。

我们首先指定数据集的模式。
这是代码:

import pyspark.sql.types as typ
labels = [('INFANT_ALIVE_AT_REPORT', typ.StringType()),('BIRTH_YEAR', typ.IntegerType()),('BIRTH_MONTH', typ.IntegerType()),('BIRTH_PLACE', typ.StringType()),('MOTHER_AGE_YEARS', typ.IntegerType()),('MOTHER_RACE_6CODE', typ.StringType()),('MOTHER_EDUCATION', typ.StringType()),('FATHER_COMBINED_AGE', typ.IntegerType()),('FATHER_EDUCATION', typ.StringType()),('MONTH_PRECARE_RECODE', typ.StringType()),...('INFANT_BREASTFED', typ.StringType())
]
schema = typ.StructType([typ.StructField(e[0], e[1], False) for e in labels])

接下来,我们加载数据。.read.csv(...) 方法可以读取未压缩或(像我们的情况)GZipped 逗号分隔值。将 header 参数设置为 True 表示第一行包含标题,我们使用 schema 指定正确的数据类型:

births = spark.read.csv('births_train.csv.gz', header=True, schema=schema)

我们的数据集中有许多以字符串形式表示的特征。这些大多是我们需要以某种方式转换为数字形式的分类变量。

我们将首先指定我们的重新编码字典:

recode_dictionary = {'YNU': {'Y': 1,'N': 0,'U': 0}
}

我们这一章的目标是预测 'INFANT_ALIVE_AT_REPORT' 是否为 1 或 0。因此,我们将丢弃所有与婴儿相关的特征,并将仅基于与其母亲、父亲和出生地相关的特征来尝试预测婴儿的生存机会:

selected_features = ['INFANT_ALIVE_AT_REPORT', 'BIRTH_PLACE', 'MOTHER_AGE_YEARS', 'FATHER_COMBINED_AGE', 'CIG_BEFORE', 'CIG_1_TRI', 'CIG_2_TRI', 'CIG_3_TRI', 'MOTHER_HEIGHT_IN', 'MOTHER_PRE_WEIGHT', 'MOTHER_DELIVERY_WEIGHT', 'MOTHER_WEIGHT_GAIN', 'DIABETES_PRE', 'DIABETES_GEST', 'HYP_TENS_PRE', 'HYP_TENS_GEST', 'PREV_BIRTH_PRETERM'
]
births_trimmed = births.select(selected_features)

在我们的数据集中,有许多特征具有是/否/未知的值;我们只会将“是”编码为 1;其他所有值将被设置为 0。

母亲的吸烟数量编码也有一个小问题:0 表示母亲在怀孕前或怀孕期间没有吸烟,1-97 表示实际吸烟的香烟数量,98 表示 98 或更多,而 99 标识未知;我们将假设未知为 0 并相应地重新编码。

接下来,我们将指定我们的重新编码方法:

import pyspark.sql.functions as func
def recode(col, key):return recode_dictionary[key][col] 
def correct_cig(feat):return func \.when(func.col(feat) != 99, func.col(feat))\.otherwise(0)
rec_integer = func.udf(recode, typ.IntegerType())

重新编码方法查找 recode_dictionary 中的正确键(给定键)并返回更正后的值。correct_cig 方法检查特征 feat 的值是否不等于 99,并(在那种情况下)返回特征的值;如果值等于 99,我们得到 0,否则。

我们不能直接在 DataFrame 上使用重新编码函数;它需要被转换为 Spark 能理解的 UDF。rec_integer 就是这样一个函数:通过传递我们指定的 recode 函数并指定返回值数据类型,然后我们就可以使用它来编码我们的是/否/未知特征。

那么,让我们开始吧。首先,我们将更正与吸烟数量相关的特征:

births_transformed = births_trimmed \.withColumn('CIG_BEFORE', correct_cig('CIG_BEFORE'))\.withColumn('CIG_1_TRI', correct_cig('CIG_1_TRI'))\.withColumn('CIG_2_TRI', correct_cig('CIG_2_TRI'))\.withColumn('CIG_3_TRI', correct_cig('CIG_3_TRI'))

.withColumn(...) 方法将列名作为其第一个参数,转换作为第二个参数。在前面的案例中,我们没有创建新列,而是重用了相同的列。

现在,我们将专注于更正是/否/未知特征。首先,我们将找出这些特征,如下所示:

cols = [(col.name, col.dataType) for col in births_trimmed.schema]
YNU_cols = []
for i, s in enumerate(cols):if s[1] == typ.StringType():dis = births.select(s[0]) \.distinct() \.rdd \.map(lambda row: row[0]) \.collect() if 'Y' in dis:YNU_cols.append(s[0])

首先,我们创建了一个包含列名和相应数据类型的元组列表(cols)。接下来,我们遍历所有这些并计算所有字符串列的不同值;如果返回的列表中有 'Y',我们将列名添加到 YNU_cols 列表中。

DataFrame 可以批量转换特征,同时选择特征。为了说明这个想法,考虑以下示例:

births.select(['INFANT_NICU_ADMISSION', rec_integer('INFANT_NICU_ADMISSION', func.lit('YNU')) \.alias('INFANT_NICU_ADMISSION_RECODE')]).take(5)

这是我们得到的返回结果:

我们选择 'INFANT_NICU_ADMISSION' 列,并将特征名称传递给 rec_integer 方法。我们还重命名新转换的列为 'INFANT_NICU_ADMISSION_RECODE'。这样,我们还将确认我们的 UDF 是否按预期工作。

所以,为了一次性转换所有的 YNU_cols,我们将创建这样的转换列表,如下所示:

exprs_YNU = [rec_integer(x, func.lit('YNU')).alias(x) if x in YNU_cols else x for x in births_transformed.columns
]
births_transformed = births_transformed.select(exprs_YNU)

让我们检查一下我们是否正确得到了它:

births_transformed.select(YNU_cols[-5:]).show(5)

这是我们得到的:

看起来一切都按照我们的预期工作,那么让我们更好地了解我们的数据。
 

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

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

相关文章

从 IDC 到云原生:稳定性提升 100%,成本下降 50%,热联集团的数字化转型与未来展望

作者:金峰(项良)、朱永林、赵世振(寰奕) 公司简介 杭州热联集团股份有限公司成立于 1997 年 10 月,是隶属杭州市实业投资集团的国有控股公司。公司专业从事国际、国内钢铁贸易黑色大宗商品及产业服务&…

若依springboot 删除一直转 问题处理

src\main\resources\static\ruoyi\js\ry-ui.js submit方法1578行添加 $.operate.successCallback(result); 在线体验 admin/admin123陆陆续续收到一些打赏,为了更好的体验已用于演示服务器升级。谢谢各位小伙伴。 演示地址:http://ruoyi.vip 文档地址…

面向未来的智能视觉参考设计与汽车架构,思尔芯提供基于Arm技术的创新方案

引言: 随着科技的飞速发展,智能视觉IoT已成为科技领域的热门话题,为智能家居、智慧城市等领域带来新机遇。然而,物联网市场的碎片化特性对智能视觉芯片设计构成挑战。同时,汽车行业正经历技术驱动的变革,软…

Multiple instance learning with graph neural networks文献笔记

基本信息 文章链接:[1906.04881] Multiple instance learning with graph neural networks 将每个包视为一个图,利用GNN学习包的嵌入,以探索包中实例之间有用的结构信息。最终的图表示被送入分类器进行标签预测。 具体方法 输入&#xff…

Elasticsearch是如何实现Master选举的?

大家好,我是锋哥。今天分享关于【Elasticsearch是如何实现Master选举的?】面试题。希望对大家有帮助; Elasticsearch是如何实现Master选举的? Elasticsearch 使用 Zen Discovery 插件(在较新的版本中是基于 Zen2&…

WEB-通用漏洞SQL注入CTF二次堆叠DNS带外

知识点: 1、数据库堆叠注入 根据数据库类型决定是否支持多条语句执行 数据库支持多条语句执行就是堆叠,如: 2、数据库二次注入 应用功能逻辑涉及上导致的先写入后组合的注入 3、数据库Dnslog注入 解决不回显(反向连接&#…

上生产时连接mysql数据库总是被拒绝

背景: 本地项目连接数据正常 测试环境也正常 到生产上就一直报错 且生产上使用mysql连接工具可以正常连接 报错信息:Connections refused: connect 调查: 数据库版本: 本地 mysql5.7.24 测试 8.3 生产5.7.36 连接驱动&#xf…

20241121买深圳保障房还是租保租房小思考?

1. 我的买深圳保障房或租保租房的出发点? 我的需求:主要是小孩读书 如果买深圳保障房例如人才房和安居房,会有购房合同,则读书积分等同有红本积分,相当于可以选择一些不错的公办学校 如果租保租房,由于查…

鸿蒙生态崛起

1.鸿蒙生态:开发者的新蓝海 从开发者角度看,鸿蒙生态带来了巨大机遇。其分布式能力实现了不同设备间的无缝体验,如多屏协同,让应用能跨手机、平板、智能穿戴和车载设备流畅运行。开发工具也有显著提升,方舟编译器等极大…

使用Python3实现Gitee码云自动化发布

仓库信息 https://gitee.com/liumou_site/ip 实现代码 import osimport requests from loguru import loggerdef gitee(ver, message, prerelease: bool False):"""在 Gitee 上创建发布版本:param ver: 版本号:param message: 发布信息:param prerelease: 是…

第75期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练Transformer(GPT)、人工智能生成内容(AIGC)以及大语言模型(LLM)等安全领域应用的知识。在这里,您可以找…

常见网络厂商设备默认用户名/密码大全

常见网络厂商的默认用户名/密码 01 思科 (Cisco) 设备类型:路由器、交换机、防火墙、无线控制器 默认用户名:cisco 默认密码:cisco 设备类型:网管型交换机 默认用户名:admin 默认密码:admin 02 华…

DICOM图像解析:深入解析DICOM格式文件的高效读取与处理

引言 在医学影像领域,DICOM(Digital Imaging and Communications in Medicine)标准已成为信息交换和存储的核心规范。掌握DICOM文件的读取与解析,对于开发医学影像处理软件至关重要。本文将系统地解析DICOM文件的结构、关键概念,并提供高效的读取与显示方法,旨在为开发者…

例题10-4 冒泡排序 字符串排序

void SortString(char str[][MAX_LEN], int n) {int i,j;char temp[MAX_LEN];for(i0;i<n-1;i){for(ji1;j<n;j){if(strcmp(str[i],str[j])<0) {strcpy(temp,str[i]);strcpy(str[i],str[j]);strcpy(str[j],temp);}}} } //升序排列 和 降序排列可能不只是 判断条件…

嵌入式硬件电子电路设计(六)LDO低压差线性稳压器全面详解

引言&#xff1a; LDO&#xff08;Low Dropout Regulator&#xff0c;低压差线性稳压器&#xff09;是一种常用的电源管理组件&#xff0c;用于提供稳定的输出电压&#xff0c;同时允许较小的输入电压与输出电压之间的差值。LDO广泛应用于各种电子设备中&#xff0c;特别是在对…

STM32H7开发笔记(2)——H7外设之多路定时器中断

STM32H7开发笔记&#xff08;2&#xff09;——H7外设之多路定时器中断 文章目录 STM32H7开发笔记&#xff08;2&#xff09;——H7外设之多路定时器中断0.引言1.CubeMX配置2.软件编写 0.引言 本文PC端采用Win11STM32CubeMX4.1.0.0Keil5.24.2的配置&#xff0c;硬件使用STM32H…

OpenCV从入门到精通实战(九)——基于dlib的疲劳监测 ear计算

本文实现Python库d和OpenCV来实现眼部闭合检测&#xff0c;主要用于评估用户是否眨眼。 步骤一&#xff1a;导入必要的库和设置参数 首先&#xff0c;代码导入了必要的Python库&#xff0c;如dlib、OpenCV和scipy。通过argparse设置了输入视频和面部标记预测器的参数。 from…

后端开发详细学习框架与路线

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;后端开发 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 为帮助你合理安排时间&#xff0c;以下是结合上述学习内容的阶段划分与时间分配建议。时间安排灵活&a…

如何在 Ubuntu 上安装 Mosquitto MQTT 代理

如何在 Ubuntu 上安装 Mosquitto MQTT 代理 Mosquitto 是一个开源的消息代理&#xff0c;实现了消息队列遥测传输 (MQTT) 协议。在 Ubuntu 22.04 上安装 MQTT 代理&#xff0c;您可以利用 MQTT 轻量级的 TCP/IP 消息平台&#xff0c;该平台专为资源有限的物联网 (IoT) 设备设计…

Webserver回顾

线程池如何工作&#xff1f; 从请求队列中取出request请求&#xff0c;然后process处理 process是处理业务代码&#xff0c;用于解析http请求的 如何为线程上锁 由于线程共享同一块资源&#xff0c;为了避免线程重复读写资源的数据安全问题 发什么信号 定义信号 信号量如…