大数据分析与应用实验任务十二

news2025/1/18 6:57:33

大数据分析与应用实验任务十二

实验目的:

  • 通过实验掌握spark机器学习库本地向量、本地矩阵的创建方法;

  • 熟悉spark机器学习库特征提取、转换、选择方法;

实验任务:

一、逐行理解并参考编写运行教材8.3.1、8.3.3节各个例程代码,查看向量或本地矩阵结果请用.toArray()方法。

1、本地向量

首先安装numpy,否则会报错“ImportError: No module named ‘numpy’”

sudo pip3 install numpy

所有本地向量都以 pyspark.ml.linalg.Vectors 为基类,DenseVector 和 SparseVector 分别是它的两个继承类,故推荐使用 Vectors 工具类下定义的工厂方法来创建本地向量。如果要使用 pyspark.ml 包提供的向量类型,则需要显式地引入 pyspark.ml.linalg.Vectors 这个类。

from pyspark.ml.linalg import Vectors,Vector 
#创建一个稠密本地向量的方法
vector = Vectors.dense(2.0,0.0,8.0) 
#第一种创建一个稀疏本地向量的方法
#方法中的第二个参数是一个序列,其中每个元素都是一个非零值的元组:(index,elem) 
vector = Vectors.sparse(3, [(0, 2), (2.0, 8.0)]) 
#第二种创建稀疏本地向量的方法
#方法中的第二个参数是一个序列,其中每个元素都是一个非零值的元组:(index:elem) 
vector = Vectors.sparse(3, {0: 2.0, 2: 8.0}) 
#第三种创建稀疏本地向量的方法
#方法中的第二个参数数组指定了非零元素的索引,而第三个参数数组则给定了非零元素值
vector = Vectors.sparse(3, [0, 2], [2.0, 8.0])

image-20231214110257588

2、本地矩阵

本地矩阵的基类是 pyspark.ml.linalg.Matrix,DenseMatrix 和 SparseMatrix 均是它的继承类。与本地向量类似,spark.ml 包也为本地矩阵提供了相应的工具类 Matrices,调用工厂方法即可创建实例。

使用如下代码创建一个稠密矩阵:

from pyspark.ml.linalg import Matrix,Matrices #引入必要的包
#创建一个 3 行 2 列的稠密矩阵[ [1.0,2.0], [3.0,4.0], [5.0,6.0] ] 
#注意,这里的数组参数是列优先的,即按照列的方式从数组中提取元素
Matrix_lzy = Matrices.dense(3, 2, [1.0, 3.0, 5.0, 2.0, 4.0, 6.0])
Matrix_lzy.toArray()

image-20231214110655502

使用如下代码继续创建一个稀疏矩阵:

#创建一个 3 行 2 列的稀疏矩阵[ [9.0,0.0], [0.0,8.0], [0.0,6.0]] 
#第一个数组参数表示列指针,即每一列元素的开始索引值
#第二个数组参数表示行索引,即对应的元素是属于哪一行
#第三个数组即是按列优先排列的所有非零元素,通过列指针和行索引即可判断每个元素所在的位置
Matrix_lzy = Matrices.sparse(3, 2, [0, 1, 3], [0, 2, 1], [9, 6, 8])
Matrix_lzy.toArray()

image-20231214110533254

通过上述代码就创建了一个 3 行 2 列的稀疏矩阵[ [9.0,0.0], [0.0,8.0], [0.0,6.0]]。在Matrices.sparse 的参数中,3 表示行数,2 表示列数。第 1 个数组参数表示列指针,其长度=列数+1,表示每一列元素的开始索引值;第二个数组参数表示行索引,即对应的元素是属于哪一行,其长度193第 8 章 Spark MLlib =非零元素的个数;第三个数组即是按列优先排列的所有非零元素。在上面的例子中,(0,1,3)表示第 1 列有 1 个(=1-0)元素,第 2 列有 2 个(=3-1)元素;第二个数组(0, 2, 1)表示共有 3 个元素,分别在第 0、2、1 行。因此,可以推算出第 1 个元素位置在(0,0),值是 9.0。

二、逐行理解并参考编写运行教材8.5.1特征提取中的TF-IDF实例。

首先,对于一组句子,使用分解器 Tokenizer,把每个句子划分成由多个单词构成的“词袋”;然后,对每一个“词袋”,使用 HashingTF 将句子转换为特征向量;最后,使用 IDF 重新调整特征向量。这种转换通常可以提高使用文本特征的性能。具体步骤如下。

第一步:导入 TF-IDF 所需要的包。代码如下:

from pyspark.ml.feature import HashingTF,IDF,Tokenizer

第二步:创建一个集合,每一个句子代表一个文件。代码如下:

sentenceData = spark.createDataFrame([(0, "I heard about Spark and I love Spark"),(0, "I wish Java could use case classes"),(1, "Logistic regression models are neat")]).toDF("label", "sentence")

第三步:用 Tokenizer 把每个句子分解成单词。代码如下:

tokenizer = Tokenizer(inputCol="sentence", outputCol="words") 
wordsData_lzy = tokenizer.transform(sentenceData) 
wordsData_lzy.show()

image-20231214111417926

从打印结果可以看出,Tokenizer 的 transform()方法把每个句子拆分成了一个个单词,这些单词构成一个“词袋”(里面装了很多个单词)。

第四步:用 HashingTF 的 transform()方法把每个“词袋”哈希成特征向量,这里设置哈希表的桶数为 2000。代码如下:

hashingTF = HashingTF(inputCol="words", outputCol="rawFeatures", numFeatures= 2000) 
featurizedDatalzy = hashingTF.transform(wordsData_lzy) 
featurizedDatalzy.select("words","rawFeatures").show(truncate=False)

image-20231214111807537

可以看出,“词袋”中的每一个单词被哈希成了一个不同的索引值。

第五步:调用 IDF 方法来重新构造特征向量的规模,生成的变量 idf 是一个评估器,在特征向量上应用它的 fit()方法,会产生一个 IDFModel(名称为 idfModel)。代码如下:

idf = IDF(inputCol="rawFeatures", outputCol="features") 
idfModel = idf.fit(featurizedDatalzy)

第六步:调用 IDFModel 的 transform()方法得到每一个单词对应的 TF-IDF 度量值。代码如下:

rescaledData = idfModel.transform(featurizedDatalzy) 
rescaledData.select("features", "label").show(truncate=False)

image-20231214111901602

三、逐行理解参考编写并运行教材8.5.2节中三种重要的特征转换方法,即StringIndexer、IndexToString以及VectorIndexer方法。

1、StringIndexer

首先,引入需要使用的类。代码如下:

from pyspark.ml.feature import StringIndexer

其次,构建一个 DataFrame,设置 StringIndexer 的输入列和输出列的名字。代码如下:

df_lzy = spark.createDataFrame([(0, "a"), (1, "b"), (2, "c"), (3, "a"), (4, "a"), (5, 
"c")],["id", "category"]) 
indexer_lzy = StringIndexer(inputCol="category", outputCol="categoryIndex")

最后,通过 fit()方法进行模型训练,用训练出的模型对原数据集进行处理,并通过 indexed.show()进行展示。代码如下:

model = indexer_lzy.fit(df_lzy) 
indexed_lzy = model.transform(df_lzy) 
indexed_lzy.show()

image-20231214112238904

2、IndexToString

与 StringIndexer 相反,IndexToString 用于将标签索引的一列重新映射回原有的字符型标签。IndexToString 一般与 StringIndexer 配合使用。先用 StringIndexer 将字符型标签转换成标签索引,进行模型训练,然后在预测标签的时候再把标签索引转换成原有的字符标签。当然,Spark 允许使用自己提供的标签。实例代码如下:

from pyspark.ml.feature import IndexToString, StringIndexer 
toString = IndexToString(inputCol="categoryIndex", outputCol="originalCategory") 
indexString = toString.transform(indexed_lzy) 
indexString.select("id", "originalCategory").show()

image-20231214112848774

3、VectorIndexer

首先,引入所需要的类,并构建数据集。代码如下:

from pyspark.ml.feature import VectorIndexer 
from pyspark.ml.linalg import Vector, Vectors 
df_lzy = spark.createDataFrame([(Vectors.dense(-1.0, 1.0, 1.0),), (Vectors.dense(-1.0, 3.0, 1.0),), (Vectors.dense(0.0, 5.0, 1.0), )], ["features"])

其次,构建 VectorIndexer 转换器,设置输入和输出列,并进行模型训练。代码如下:

indexer_lzy = VectorIndexer(inputCol="features", outputCol="indexed", maxCategories= 2) 
indexerModel = indexer_lzy.fit(df_lzy)

此处设置 maxCategories 为 2,即只有种类小于 2 的特征才被视作类别型特征,否则被视作连续型特征。

再次,通过 VectorIndexerModel 的 categoryMaps 成员来获得被转换的特征及其映射,可以看到,共有两个特征被转换,分别是 0 号和 2 号。代码如下:

categoricalFeatures_lzy = indexerModel.categoryMaps.keys() 
print ("Choose"+str(len(categoricalFeatures_lzy))+"categorical features:"+str(categoricalFeatures_lzy)) 

image-20231214113036704

最后,将模型应用于原有的数据,并打印结果。代码及结果如下:

indexed = indexerModel.transform(df_lzy) 
indexed.show()

image-20231214113134093

四、逐行理解并参考编写运行教材8.5.3节中特征选择的卡方选择案例。

卡方选择是统计学上常用的一种有监督特征选择方法,它通过对特征和真实标签进行卡方检验,来判断该特征与真实标签的关联程度,进而确定是否对其进行选择。

与 spark.ml 包中的大多数学习方法一样,spark.ml 包中的卡方选择也是以“评估器+转换器”的形式出现的,主要由 ChiSqSelector 和 ChiSqSelectorModel 两个类来实现。

首先,进行环境的设置,引入卡方选择器所需要使用的类。代码如下:

from pyspark.ml.feature import ChiSqSelector, ChiSqSelectorModel 
from pyspark.ml.linalg import Vectors

其次,创造实验数据,这是一个具有 3 个样本、4 个特征维度的数据集,标签有 1 和 0 两种,我们将在此数据集上进行卡方选择。代码如下:

df_lzy = spark.createDataFrame( [ \ 
... (1, Vectors.dense(0.0, 0.0, 18.0, 1.0), 1), \ 
... (2, Vectors.dense(0.0, 1.0, 12.0, 0.0), 0), \ 
... (3, Vectors.dense(1.0, 0.0, 15.0, 0.1), 0) \ 
... ], ["id", "features", "label"])
df_lzy.show()

image-20231214113438428

再次,用卡方选择进行特征选择器的训练,为了便于观察,我们设置只选择与标签关联性最强的一个特征(可以通过 setNumTopFeatures(…)方法进行设置)。代码如下:

selector = ChiSqSelector( \ 
... numTopFeatures = 1, \ 
... featuresCol = "features", \ 
... labelCol = "label", \ 
... outputCol = "selected-feature")

最后,用训练出的模型对原数据集进行处理,可以看到,第三列特征被选出作为最有用的特征列。代码如下:

selector_model = selector.fit(df_lzy) 
result_lzy = selector_model.transform(df_lzy) 
result_lzy.show()

image-20231214113650469

实验心得

通过大数据分析与应用实验任务十二,我深入了解了Spark机器学习库在向量和矩阵创建、特征提取、转换和选择方面的应用。我学习了如何在pyspark编程环境中创建文件夹并保存代码,参考教材中的例子编写和运行了各个例程代码,熟悉了Spark机器学习库中的向量和矩阵操作。同时,我也参考教材的内容编写并运行了TF-IDF特征提取、StringIndexer、IndexToString和VectorIndexer特征转换以及卡方选择特征选择的案例。通过这次实验,我深入了解了Spark机器学习库的使用,并学会了如何创建本地向量和本地矩阵,进行特征提取、转换和选择。这些技能对于我的未来数据分析和机器学习工作非常有帮助。

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

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

相关文章

linux脚本中 #!/bin/sh、#!/bin/bash

我们通常看到的脚本文件总是有以下这样的开头: #!/bin/bash本文解释一下这是什么,以及为什么要写它。 首先解释一下 #! ,因为 #!有个专有的名词,叫 shebang 发音类似中文的 “蛇棒” 。为什么叫 shebang 呢? 首先 #…

【面向对象】C++/python/java的多态比较

一、面向对象的主要特点 封装:封装是把数据和操作数据的方法绑定在一起,对数据的访问只能通过已定义的接口。这可以保护数据不被外部程序直接访问或修改,增强数据的安全性。继承:继承是一种联结类的层次模型,并且允许…

1850_emacs_org-download在Windows上的使用

Grey 全部学习内容汇总: https://github.com/greyzhang/g_org 1850_emacs_org-download在Windows上的使用 对我来说,使用emacs很大的一个挑战是在Windows上,emacs的配置会比Linux上麻烦一些。而且,通常来说Windows上的体验会差…

SQL进阶理论篇(九):为什么不存在完美的索引

文章目录 简介索引片和过滤因子如何通过宽表避免回表什么是过滤因子理想索引设计:三星索引为什么很难存在理想的索引设计?参考文献 简介 本节将主要介绍以下部分: 什么是索引片,什么是过滤因子?设计索引的时候&#…

Python装饰器新境界:详解装饰器重载内置操作

更多Python学习内容:ipengtao.com 大家好,我是彭涛,今天为大家分享 Python装饰器新境界:详解装饰器重载内置操作,全文3900字,阅读大约15分钟。 Python装饰器重载内置操作,我们通常指的是使用装饰…

Sqoop安装与配置-shell脚本一键安装配置

文章目录 前言一、使用shell脚本一键安装1. 复制脚本2. 增加执行权限3. 执行脚本4. 加载用户环境变量5. 查看是否安装成功 总结 前言 本文介绍了如何使用Shell脚本一键安装Sqoop。Sqoop是一个用于在Apache Hadoop和结构化数据存储(如关系数据库)之间传输…

Source Insight使用

之前一直使用VS code阅读kernel源码,有时候函数跳转有些问题。最近换成了Source Insight软件,发现真不错。就是需要一些学习成本,简单记录一下如何使用吧。 1、下载安装: 首先肯定是要下载安装,这个就不写了&#xf…

FFmpeg——在Vue项目中使用FFmpeg(安装、配置、使用、SharedArrayBuffer、跨域隔离、避坑...)

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…

滑动窗口训练

1.原理 我们用这道题目 LCR 008. 长度最小的子数组 来讲解“滑动窗口”的解法。 1.1.暴力解法 遍历每一个子数组(都要大于等于 7),最统计出最小的数组。 这样做的话,划分左右区间(left 和 right)就需要…

怎样长时间保持SSH会话连接不断开?

操作场景 使用SSH方式登录CentOS Stream操作系统的云服务器时,过一段时间就会自动断开连接。 该文档适用于CentOS/EulerOS系统。 操作方法 编辑/etc/ssh/sshd_config文件设置心跳,保持连接。 编辑/etc/ssh/sshd_config,添加配置项&#x…

Flink系列之:监控反压

Flink系列之:监控反压 一、反压二、Task 性能指标三、示例四、反压状态 Flink Web 界面提供了一个选项卡来监控正在运行 jobs 的反压行为。 一、反压 如果你看到一个 task 发生 反压警告(例如: High),意味着它生产数…

Android动画

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 目录 一、导读二、概览三、动画实现3.1 帧动画资源文件中实现…

Linux线程的设计

文章目录 一.理解Linux线程的本质进程地址空间是进程访问系统资源的窗口Linux系统中,线程是比进程更轻量级的执行流 二.Linux线程独立运行的原理三.基础线程控制 一.理解Linux线程的本质 进程地址空间是进程访问系统资源的窗口 Linux系统中,线程是比进程更轻量级的执行流 线程…

IIS如何本地部署网站,作为局域网内的服务器

文章目录 IIS本地部署WebService1.使用IIS及WebService的原因:2.相关文件说明及网络条件说明:(1)文件说明:(2)网络条件说明: 3.IIS安装与配置:第一步:安装第二步&#xf…

全国职业院校技能大赛“大数据应用开发”赛项说明

1、赛项介绍 (1)赛项名称 全 国 职 业 院 校 技 能 大 赛 “大数据应用开发” 赛 项 职业院校技能大赛官网 (vcsc.org.cn)https://www.vcsc.org.cn/ 大赛组织机构介绍 全国职业院校技能大赛(以下简称大…

Python 爬虫开发完整环境部署,爬虫核心框架安装

Python 爬虫开发完整环境部署 前言: ​ 关于本篇笔记,参考书籍为 《Python 爬虫开发实战3 》 笔记做出来的一方原因是为了自己对 Python 爬虫加深认知,一方面也想为大家解决在爬虫技术区的一些问题,本篇文章所使用的环境为&#x…

网络攻击1——网络安全基本概念与终端安全介绍(僵尸网路、勒索病毒、木马植入、0day漏洞)

目录 网络安全的基本术语 黑客攻击路径 终端安全 僵尸网络 勒索病毒 挖矿病毒 宏病毒 木马的植入 0day漏洞 流氓/间谍软件 网络安全的基本术语 网络安全的定义(CIA原则) 数据的保密性Confidentiality(对称/非对称秘钥) …

mysql innodb知识记录

官方文档 官网架构图 innodb 特性 内存 buffer pool 采用优化后的LRU算法, 3/8 of the buffer pool is devoted to the old sublist.The midpoint of the list is the boundary where the tail of the new sublist meets the head of the old sublist.When In…

C语言-Makefile

Makefile 什么是make? make 是个命令,是个可执行程序,用来解析 Makefile 文件的命令这个命令存放在 /usr/bin/ 什么是 makefile? makefile 是个文件,这个文件中描述了我们程序的编译规则咱们执行 make 命令的时候, m…

[DroneCAN]CAN-Convertor控制CAN电调电机

简介 CAN电调电机是一类通过CAN协议控制转速的电调电机,和传统的PWM电调电机不同在于,CAN协议有网络性和抗干扰性,因此其性能比PWM更好,占用的端口数也会更少。在apm或者px4等基于dronecan的飞控来说,想要控制第三方的…