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

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

实验目的:

  • 通过实验掌握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机器学习库的使用,并学会了如何创建本地向量和本地矩阵,进行特征提取、转换和选择。这些技能对于我的未来数据分析和机器学习工作非常有帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

服务器数据恢复-raid5多块磁盘掉线导致上层卷无法挂载的数据恢复案例

服务器数据恢复环境: 一台服务器中有一组由24块FC硬盘组建的raid5磁盘阵列,linux操作系统ext3文件系统,服务器上层部署有oracle数据库。 服务器故障&检测: raid5阵列中有两块硬盘出现故障掉线,导致服务器上层卷无法…

中通快递查询,中通快递单号查询,并进行多次揽收分析

批量查询中通快递单号的物流信息,并将其中的多次揽收件分析筛选出来。 所需工具: 一个【快递批量查询高手】软件 中通快递单号若干 操作步骤: 步骤1:运行【快递批量查询高手】软件,第一次使用的伙伴记得先注册&…

RocketMQ容器化最佳实践

前言 在上一篇文章基于RocketMQ实现分布式事务我们完成基于消息队列实现分布式事务,为了方便后续的开发和环境统一,我们决定将RocketMQ容器化部署到服务器上。所以这篇文章就来演示一下笔者基于docker-compose完成RocketMQ容器化的过程。 本篇文章为了…

移远通信5G智能模组SG520B系列正式上线,为智能终端轻松提供强大多媒体功能

12月13日,全球领先的物联网整体解决方案供应商移远通信宣布,正式推出新一代 5G Sub-6GHz智能模组SG520B系列。 SG520B系列支持5G、Wi-Fi 6E和蓝牙等多种连接技术,且多媒体功能强大,推入市场后将可直接满足智能网关、智慧工业、智慧…

使用CFimagehost源码自建无需数据库支持的PHP图片托管服务

文章目录 1.前言2. CFImagehost网站搭建2.1 CFImagehost下载和安装2.2 CFImagehost网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar临时数据隧道3.2 Cpolar稳定隧道(云端设置)3.3.Cpolar稳定隧道(本地设置) 4.公网访问测…

大数据笔记(待续)

mysql 缓存技术 数据库和缓存双写数据一致性问题常见的解决方案 常见方案通常情况下,我们使用缓存的主要目的是为了提升查询的性能。大多数情况下,我们是这样使用缓存的: 用户请求过来之后,先查缓存有没有数据,如果有…

做数据分析为何要学统计学(2)——如何估计总体概率分布

我们可以通过手头掌握的样本来估计总体的概率分布。这个过程由以下步骤组成。 第一步,我们采用Seaborn软件的histplot函数建立核密度图(一种概率密度图)。 import numpy as np #输入样本数据 xnp.array([2.12906357, 0.72736725, 1.0515282…

如何删除/替换3D模型的材质贴图

在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 在3D设计和动画领域,材质是呈现真实感和逼真效果的关键因…

电脑监控软件丨你能接受在电脑上安装吗

很多人说自己是不能接受老板在电脑上安装电脑监控软件的,怎么说呢,我自己本身是没有任何意见的。 我是可以接受的。 先来说说我的理由: 我是站在企业管理者的角度上,来思考这个问题的。老板花钱雇佣员工不是来公司来上网聊天打游…

【笔试强化】Day 1

文章目录 一、单选1.2.3.4.5.6. (写错)7. (不会)8. (常错题)9.10. (写错) 二、编程1. 组队竞赛题目:题解:代码: 2. 删除公共字符题目:…

自定义Axure元件库及原型图泳道图的绘制(详细不同类的案例)

目录 前言 一.自定义元件库 1.1 自定义元件库的作用 1.2 自定义元件的操作 二.流程图 2.1 流程图的作用 2.2 绘制流程图 2.3 简易流程图案例 三.泳道图 3.1 泳道图的作用 3.2 流程图和泳道图的区别 3.3 绘制泳道图 四.绘制前的准备 五.案例 4.1 门诊模块案例 4.2 …

mysql踩坑

关于安装 1报错:ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client具体代码如下: import mysql from "mysql"//连接数据库 const dbmysql.createPool({h…

前端体系:前端应用

目录 前端体系基础 html(超文本标记语言) css(层叠样式单) javascript() 一、前端体系概述 二、前端框架 React Vue Angular 三、前端库和工具 lodash Redux Webpack 四、模块化和组件化 ES…

ZLMediaKit中的线程

EventLoop的线程模型 服务器通用的IO模型event-loop 非阻塞IO。线程模型可以是单线程,可以是多线程。对于已经普及了的多核环境,通常都是采用多线程。 通常一个线程中有一个EventLoop,比如accept是一个专门线程,accept后的fd分…

AJAX原理解析与案例实践,助你成为前端技术高手

大家有关于JavaScript知识点不知道可以去 🎉博客主页:阿猫的故乡 🎉系列专栏:JavaScript专题栏 🎉ajax专栏:ajax知识点 🎉欢迎关注:👍点赞🙌收藏✍️留言 学习…

微信开发者工具安装教程

文章目录 下载安装包执行安装包 #微信开发者工具安装教程 下载安装包 官网网址 执行安装包 D:\Program Files (x86)\Tencent\微信web开发者工具\dll

D92-02-ASEMI快恢复二极管20A 200V

编辑:ll D92-02-ASEMI快恢复二极管20A 200V 型号:D92-02 品牌:ASEMI 封装:TO-247 特性:插件、快恢复二极管 最大平均正向电流:20A 最大重复峰值反向电压:200V 恢复时间:35ns…

nodejs使用express框架启动服务操作mysql数据库

描述: 首先在本地搭建mysql数据库,配置:host: ‘192.168.3.249’,user: ‘mkx’,password: ‘123456’,database: ‘gg’.测试连接正常.使用express写两个接口, 1.查询所有学生的接口,使用的get请求,无参数. 2.插入一条学生信息,使用post请求,body是一个json的学生信息{name:“…

计算机组成原理——存储器21-40

21、存储器存取周期是指(C) A、存储器的读出时间 B、存储器的写入时间 C、存储器进行连续读或写操作所允许的最短时间间隔 D、存储器进行一次读或写操作所需的平均时间 存取周期是存储器进行连续读或写操作所允许的最短时间间隔 存取时间是存储器进行一次…

【面试】数据库—优化—聚簇索引和非聚簇索引、回表查询

数据库—优化—聚簇索引和非聚簇索引、回表查询 1. 什么是聚簇索引什么是非聚簇索引 ? 聚集索引选取规则: 如果存在主键,主键索引就是聚集索引;如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引&#xff1b…