pyspark分布式部署随机森林算法

news/2024/7/5 23:26:39 标签: 算法, 分布式, 随机森林, spark, spark-ml

前言

分布式算法的文章我早就想写了,但是一直比较忙,没有写,最近一个项目又用到了,就记录一下运用Spark部署机器学习分类算法-随机森林的记录过程,写了一个demo。

spark_2">基于pyspark随机森林算法预测客户

本次实验采用的数据集链接:https://pan.baidu.com/s/13blFf0VC3VcqRTMkniIPTA
提取码:DJNB

数据集说明
某运营商提供了不同用户3个月的使用信息,共34个特征,1个标签列,其中存在一定的重复值、缺失值与异常值。各个特征的说明如下:
MONTH_ID 月份
USER_ID 用户id
INNET_MONT 在网时长
IS_AGREE 是否合约有效客户
AGREE_EXP_DATE 合约计划到期时间
CREDIT_LEVEL 信用等级
VIP_LVL vip等级
ACCT_FEE 本月费用(元)
CALL_DURA 通话时长(秒)
NO_ROAM_LOCAL_CALL_DURA 本地通话时长(秒)
NO_ROAM_GN_LONG_CALL_DURA 国内长途通话时长(秒)
GN_ROAM_CALL_DURA 国内漫游通话时长(秒)
CDR_NUM 通话次数(次)
NO_ROAM_CDR_NUM 非漫游通话次数(次)
NO_ROAM_LOCAL_CDR_NUM 本地通话次数(次)
NO_ROAM_GN_LONG_CDR_NUM 国内长途通话次数(次)
GN_ROAM_CDR_NUM 国内漫游通话次数(次)
P2P_SMS_CNT_UP 短信发送数(条)
TOTAL_FLUX 上网流量(MB)
LOCAL_FLUX 本地非漫游上网流量(MB)
GN_ROAM_FLUX 国内漫游上网流量(MB)
CALL_DAYS 有通话天数
CALLING_DAYS 有主叫天数
CALLED_DAYS 有被叫天数
CALL_RING 语音呼叫圈
CALLING_RING 主叫呼叫圈
CALLED_RING 被叫呼叫圈
CUST_SEX 性别
CERT_AGE 年龄
CONSTELLATION_DESC 星座
MANU_NAME 手机品牌名称
MODEL_NAME 手机型号名称
OS_DESC 操作系统描述
TERM_TYPE 硬件系统类型(0=无法区分,4=4g,3=dg,2=2g)
IS_LOST 用户在3月中是否流失标记(1=是,0=否),1月和2月值为空(标签)

数据字段打印
在这里插入图片描述
将数据集放到hadoop的HDFS中,通过Saprk读取HDFS文件里面的CSV格式的数据集,通过hadoop命令上传本地数据集到HDFS:

hadoop fs -put ./USER_INFO_M.csv /data/test/USER_INFO_M.csv

查看HDFS中的数据集CSV文件:

hadoop fs -ls /data/test

在这里插入图片描述

Spark中搭建分布式随机森林模型

从上面的数据集可以看到,数据是一个二分类数据,IS_LOST就是需要预测的标签,所以只需要构建一个随机森林二分类模型就可以了。Spark中提供了用于机器学习算法的库MLlib,这个库里面包含了许多机器学习算法,监督学习和无监督学习算法都有,例如线性回归、随机森林、GBDT、K-means等等(没有sklearn中提供的算法多),但是和sklearn中的随机森林模型构建有区别的是spark中程序底层是基于RDD弹性分布式计算单元,所以基于RDD的DataFrame数据结构和python中的DataFrame结构不一样,写法就不一样,python程序写的随机森林算法是不能直接在Spark中运行的,我们需要按照Spark中的写法来实现随机森林模型的构建,直接看代码:

from pyspark.sql import SparkSession
from pyspark.ml.feature import StringIndexer, VectorAssembler
from pyspark.ml.classification import RandomForestClassifier
from pyspark.ml.evaluation import MulticlassClassificationEvaluator
from pyspark.ml import Pipeline
from pyspark.sql.functions import col
import time

start_time = time.time()
# 创建SparkSession
spark = SparkSession.builder.appName("RandomForestExample").getOrCreate()

# 读取数据集,数据集放在HDFS上
data = spark.read.csv("/data/test/USER_INFO_M.csv", header=True, inferSchema=True, encoding='gbk')
print('=====================================================')
data.show()
# 去除包含缺失值的行
data = data.na.drop(subset=["IS_LOST"])
# 选择特征列和标签列
data = data.select([col for col in data.columns if col not in ['MONTH_ID', 'USER_ID','CONSTELLATION_DESC','MANU_NAME','MODEL_NAME','OS_DESC']])
label_col = "IS_LOST"
feature_cols=['CONSTELLATION_DESC','MANU_NAME','MODEL_NAME','OS_DESC']

data = data.fillna(-1)

# 创建特征向量列
assembler = VectorAssembler(inputCols=[col for col in data.columns if col not in ["IS_LOST"]], outputCol="features")
data = assembler.transform(data)

# 选择特征向量列和标签列
data = data.select("features", label_col)

# 将数据集分为训练集和测试集
(trainingData, testData) = data.randomSplit([0.8, 0.2])

# 创建随机森林分类器
rf = RandomForestClassifier(labelCol=label_col, featuresCol="features")

# 训练模型
model = rf.fit(trainingData)

# 在测试集上进行预测
predictions = model.transform(testData)

# 评估模型
evaluator = MulticlassClassificationEvaluator(labelCol=label_col, predictionCol="prediction", metricName="accuracy")
accuracy = evaluator.evaluate(predictions)

# 打印准确率
print("测试集准确率为: {:.2f}".format(accuracy))
end_time = time.time()
print("代码运行时间: {:.2f}".format(end_time - start_time))
# 关闭SparkSession
spark.stop()

上面是通过python代码构建的Spark中的随机森林模型,Spark支持scala、java、R和python语言,python最简洁,所以直接用pyspark进行程序实现。将上面的代码放到自己的路径下,然后通过spark-submit命令提交.py文件运行即可:

./spark-submit     
	--master yarn     
	--deploy-mode client    
	--num-executors 4    
	/data/rf/spark_m.py

提交:
在这里插入图片描述

拓展:Spark中还支持提交Python环境,而不需要每个spark分布式集群节点都安装适配的python环境,spark-submit命令可以支持将python解释器连同整个配置好了的环境都提交到集群上面然后下发给其他节点,命令如下:

./spark-submit \
    --master yarn \
    --deploy-mode client\
    --num-executors 4\
    --queue default \
    --verbose \
    --conf spark.pyspark.driver.python=/anaconda/bin/python \
    --conf spark.pyspark.python=/anaconda/bin/python \
    /test.py

其中spark.pyspark.python和spark.pyspark.driver.python两个参数就是配置提交机器的python环境的路径,还可以通过将python环境打包放到HDFS路径下,Spark直接读取HDFS中的python环境包。

模型运行结果

将数据集按照2-8分为测试集和训练集,在测试集上的预测准确率为97%,运行时间80s。
在这里插入图片描述
同时登录集群查看提交的Spark任务运行情况,访问http://localhost:8088/cluster查看如下:
在这里插入图片描述
可以看到,RandomForestExample任务就是我们创建的任务,运行完成了,成功!

写在最后

在大规模数据的情况下如果需要用机器学习算法,Spark是一个很好的选择,可以大大提升任务的运行速度,工业环境中效率往往是最需要的,Spark可以解决我们的分布式算法部署需求。

本人才疏学浅,如果有不对的地方请指证!


http://www.niftyadmin.cn/n/5394729.html

相关文章

大模型安全相关论文

LLM对于安全的优势 “Generating secure hardware using chatgpt resistant to cwes,” Cryptology ePrint Archive, Paper 2023/212, 2023评估了ChatGPT平台上代码生成过程的安全性,特别是在硬件领域。探索了设计者可以采用的策略,使ChatGPT能够提供安…

libigl 网格harmonic参数化

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 网格的Harmonic参数化是一种常用的参数化方法,用于将三角形网格映射到二维平面上。Harmonic参数化的基本思想是利用调和函数在网格上的性质,将网格上的每个顶点映射到平面上的一个点,并保持一定的形状性质。 具体…

Spring boot2框架适配国产达梦8数据库、国产瀚高数据库

最近项目涉及国产芯片、国产操作系统、国产数据库&#xff0c;总之全套国产化&#xff0c;选型用统信产品序列。就涉及开发框架适配国产数据库的问题&#xff1a; 1、spring boot2框架适配国产达梦8数据库或者瀚高数据库 pom.xml引入dm8的依赖&#xff1a; <!-- 达梦数据…

Android WebView访问网页+自动播放视频+自动全屏+切换横屏

一、引言 近期&#xff0c;我发现电视家、火星直播等在线看电视直播的软件都已倒闭&#xff0c;而我奶奶也再无法通过这些平台看电视了。她已六十多岁&#xff0c;快七十岁啦。这些平台的倒下对我来说其实没有多大的影响&#xff0c;但是对于文化不多的她而言&#xff0c;生活中…

C++面试 -操作系统-架构能力:内存问题分析与性能优化

内存问题分析&#xff1a; 内存泄漏&#xff1a; 描述什么是内存泄漏&#xff0c;以及它如何在 C 中发生。使用工具&#xff08;如 Valgrind、AddressSanitizer&#xff09;来检测和定位内存泄漏。如何预防内存泄漏&#xff1f;使用智能指针、正确释放资源等。 野指针和悬挂指针…

wps 365 批量修改.xlsx、.xls,单元格内容的格式为yyyy-mm-dd

xlsx、xls文件导入校验单元格内容格式有误&#xff0c;批量修改步骤如下 1.选中要修改内容的单元格列 2.选择数据-分列-分列&#xff0c;弹出“文本分列向导”弹窗 3.选择“下一步”——“下一步”到步骤3&#xff0c;在“列数据类型”中选中日期-YMD格式&#xff0c;点击“完成…

【Spring连载】使用Spring Data的Repositories----定义查询方法

【Spring连载】使用Spring Data的Repositories----定义查询方法 一、 查询查找策略二、创建查询三、属性表达式四、返回Collections或Iterables的存储库方法4.1 使用Streamable作为查询方法返回类型4.2 返回自定义流包装类型4.3 Vavr集合的支持 五、流查询结果六、异步查询结果…

Rust-windows安装环境

文章目录 前言一、Using rustup (Recommended)二、配置vscode解决办法&#xff1a;在终端依次运行如下两条指令&#xff1a; 总结 前言 Rust学习系列&#xff0c;之前介绍了macOS环境下的rust安装方式macOS rust安装。这篇学习windows的rust安装方式。 提示&#xff1a;以下是…