【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.xdnf.cn/news/19189.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【大模型推理】all-reduce

https://andrew.gibiansky.com/blog/machine-learning/baidu-allreduce/#ref-4 1. ALL reduce , reduce, broadcast 概念 Introduction 在过去的几年中,神经网络已经被证明是解决各种问题的令人难以置信的有效工具,并且在规模和计算需求上都迅速增长。…

opencv(c++)---自带的卷积运算filter2D以及应用

opencv(c)—自带的卷积运算filter2D以及应用 #include <opencv2/opencv.hpp> #include<iostream>using namespace cv; using namespace std;int main() {Mat imgin, imgout;imgin imread("D:/1234.png");if (imgin.empty()){cout << "Could …

C++20中的Concepts与TypeScript

C20中的Concepts与TypeScript 大家好&#xff01;上一篇聊了C20中概念&#xff08;Concepts&#xff09;&#xff0c;这是一个非常赞的特性&#xff0c;极大简化了模板编程&#xff0c;但是如果跳出C去查看一下其他编程语言的特性&#xff0c;就会发现&#xff0c;这样类似的特…

联想thinkpad笔记本哪些配置可以安装win7_联想thinkpad笔记本装win7解析(支持新旧机型)

联想thinkpad笔记本哪些配置可以安装win7&#xff1f;联想ThinkPad L14在安装win7后usb键盘不能使用&#xff0c;并且bios中要关闭安全启动和开启CSM兼容模式&#xff0c;那么联想ThinkPad L14要怎么安装win7系统呢&#xff1f;下面小编就给大家介绍详细的联想ThinkPad L14装wi…

IDEA如何设置编码格式,字符编码,全局编码和项目编码格式

前言 大家好&#xff0c;我是小徐啊。我们在开发Java项目&#xff08;Springboot&#xff09;的时候&#xff0c;一般都是会设置好对应的编码格式的。如果设置的不恰当&#xff0c;容易造成乱码的问题&#xff0c;这是要避免的。今天&#xff0c;小徐就来介绍下我们如何在IDEA…

实习冲刺第二十五天

283.移动零 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 思路详解&#xff1a…

使用QTimer和SIGNAL/SLOT机制来实现系统时间的显示

在Qt中&#xff0c;使用QTimer和SIGNAL/SLOT机制来实现系统时间的显示是一个常见的做法。下面是如何实现这一功能的步骤&#xff1a; 创建定时器&#xff1a; 首先&#xff0c;你需要创建一个QTimer对象。QTimer是一个定时器类&#xff0c;可以在指定的时间间隔后发出信号。 QT…

Win11安装软件被系统阻止安装?解除限制的方法

Windows 11作为最新的操作系统&#xff0c;加入了许多安全性和稳定性的新特性。但也因此&#xff0c;一些用户在安装软件时可能遇到“安装被阻止”或“无法从此位置安装应用程序”的提示。这通常是由于系统的默认安全设置或权限限制导致的。本文将探讨这些限制的原因&#xff0…

三角波生成函数

% 设置时间范围和采样频率 t 0:0.01:2; % 时间从0到2秒&#xff0c;步长为0.01秒% 定义频率 f 和角频率 theta f 5; % 频率为5Hz theta 2 * pi * f * t;% 初始化输出向量 y zeros(size(t));% 根据给定的公式计算 y for k 1:fy y (-1)^(k-1)*(2 /(k * pi)) * sin(k * the…

sglang 部署Qwen2VL7B,大模型部署,速度测试,深度学习

sglang 项目github仓库&#xff1a; https://github.com/sgl-project/sglang 项目说明书&#xff1a; https://sgl-project.github.io/start/install.html 资讯&#xff1a; https://github.com/sgl-project/sgl-learning-materials?tabreadme-ov-file#the-first-sglang…

『大模型笔记』AI自动化编程工具汇总!

『大模型笔记』AI自动化编程工具汇总! 文章目录 一. Bolt.new(开源AI驱动全栈Web开发工具)1.1. Bolt.new介绍1.2. 编程小白如何打造自己的导航网站二. Cursor(人工智能代码编辑器)2.1. Cursor入门教程2.2. Cursor左侧布局设置和VSCode一样一. Bolt.new(开源AI驱动全栈Web开发工…

网页全终端安防视频流媒体播放器EasyPlayer.jsEasyPlayer.js关于多屏需求

EasyPlayer.js网页全终端安防视频流媒体播放器是一款功能强大的H5播放器&#xff0c;支持多种视频协议&#xff0c;包括HTTP、HTTP-FLV、HLS&#xff08;m3u8&#xff09;、WS、WEBRTC、FMP4等&#xff0c;兼容视频直播与点播功能。同时&#xff0c;它支持多种音视频编码格式&a…

大模型外挂知识库优化——如何利用大模型辅助召回

大模型外挂知识库优化——如何利用大模型辅助召回&#xff1f; 一、为什么需要使用大模型辅助召回&#xff1f; 我们可以通过向量召回的方式从文档库里召回和用户问题相关的文档片段&#xff0c;同时输入到LLM中&#xff0c;增强模型回答质量。 常用的方式直接用用户的问题进…

three.js实现地球 外部扫描的着色器

three.js实现地球 外部扫描的着色器 https://threehub.cn/#/codeMirror?navigationThreeJS&classifyshader&idearthScan import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControls.js import { GUI } from three/ex…

STM32 BootLoader 刷新项目 (十一) Flash写操作-命令0x57

STM32 BootLoader 刷新项目 (十一) Flash写操作-命令0x57 1. 引言 嵌入式系统中&#xff0c;BootLoader 是设备启动的第一部分代码&#xff0c;负责硬件初始化和主程序加载。在 STM32F407 中&#xff0c;BootLoader 的另一重要功能是支持应用程序的在线升级&#xff0c;这需要…

Spring IoC——针对实习面试

目录 Spring IoC谈谈你对Spring IoC的理解IoC和DI有区别吗&#xff1f;IoC&#xff08;控制反转&#xff09;DI&#xff08;依赖注入&#xff09;IoC与DI的区别 什么是Spring Bean&#xff1f;作用域有哪些&#xff1f;Bean是线程安全的吗&#xff1f;说一下Spring Bean的生命周…

【H2O2|全栈】MySQL的云端部署

目录 前言 开篇语 准备工作 MySQL移除 为什么需要移除&#xff1f; 移除操作 Yum仓库 yum简介 rpm安装 yum库安装 MySQL安装 使用yum安装 开机自启动 检查运行状态 MySQL配置 初始密码 ​编辑登录 修改root密码 退出MySQL 字符集配置 结束语 前言 开篇语…

数据结构-二叉平衡树

一.平衡二叉树 二叉搜索树插入的次序不同导致不同的深度和平均查找长度ASL 左右子树高度差不超过绝对值1的二叉搜索是二叉平衡树 二.平衡二叉树的调整 在右子树的右子树上的插入做RR插入 把被破坏节点的右子树变成跟节点并把这个右子树的左子树挂载到原来被破坏的结点的右子树…

【PCIE716-0】基于PCIe总线架构的XC7Z100 FPGA高性能实时信号处理平台

板卡概述 PCIE716-0是一款基于PCIe总线架构的XC7Z100 FPGA高性能实时信号处理平台。该平台采用Xilinx的ZYNQ SOC系列产品XC7Z100作为主处理器。 该平台的PL端具有1个FMC&#xff08;HPC&#xff09;接口&#xff0c;1路PCIe x8主机接口&#xff0c;支持1路UART串口、支持1组6…

从0开始的数据结构速过——番外(1)

目录 尝试 思考与架构设置 编写&#xff01; 一些额外知识的补充 可变参数模板 std::common_type std::forward 这是《数据结构从0开始》的一个番外。实际上是介绍一下一些现代C的写法。这里以快速构建std::array作为契机来说明一下一些现代C的语法。 尝试 我们在这里呢…