Spark MLPC神经网络应用实例(scala)

2024-08-28 20:18

本文主要是介绍Spark MLPC神经网络应用实例(scala),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在Spark中,目前包括的神经网络方面的算法仅有MLPC,即MultilayerPerceptronClassifier(多层感知分类器)。它在MLlib的Classification and regression(分类与回归)中。MLPC是基于前馈人工神经网络(ANN)的分类器,属于全连接神经网络,其中隐藏层的激活函数是sigmoid函数,输出层是softmax函数。关于MLPC的原理,网络上有比较多详细的介绍,这里不再累述。本博客主要通过一个应用案例展示MLPC的使用过程,包括原始数据的预处理、MLPC算法的使用以及效果的评估。

运行本实例代码请保证spark版本在2.3及以上。

数据源:

数据源是基于某行业的开放数据源。其中se是用户标签、sf是消费能力,pb、pc是产品参数,pa是要预测的结果,即某用户是否会消费某产品,0表示不购买,1表示购买。总数量20万条(相对于神经网络算法数据量偏少,这里只做案例演示),上图展示部分数据源。

数据预处理:

可以看到,数据源包含两种类型,第一是标签类型se,第二是数值类型sf、pb和pc,其中sf与pb、pc不在一个量纲与数量级。所以数据预处理的思路是先对se做独热编码,然后进行降维。最后对4种特征均进行标准化。

关于更多的Spark数据预处理的方法,可以参考博主关于spark特征工程的博文:

https://blog.csdn.net/u013090676/article/details/84191468

独热编码:

由于Spark中独热编码只能使用数值类型的输入,所以需要先将字符标签处理成int类型的标签(mRecord即数据源):

        val indexer = new StringIndexer().setInputCol("se").setOutputCol("se_indexer");val mRecord_indexed = indexer.fit(mRecord).transform(mRecord).drop("se");//独热编码val encoder = new OneHotEncoderEstimator().setInputCols(Array("se_indexer")).setOutputCols(Array("se_onehot"));val mRecord_onehot = encoder.fit(mRecord_indexed).transform(mRecord_indexed).drop("se_indexer");

PCA降维:

独热编码后的数据一般维度都比较高,不适合直接作为输入,所以用PCA进行降维:

        val mRecord_pac_onehot = new PCA().setInputCol("se_onehot").setOutputCol("se_pca_onehot").setK(2).fit(mRecord_onehot).transform(mRecord_onehot).drop("se_onehot");

特征合并:

将所有维度的特征合并成一个向量,作为MLPC的输入:

        val mRecord_va = new VectorAssembler().setInputCols(Array("sf", "pb", "pc","se_pca_onehot")).setOutputCol("features").transform(mRecord_pac_onehot).drop("sf").drop("pb").drop("pc").drop("se_pca_onehot");

标准化:

对合并的向量进行标准化,标准化包括零均值和单位标准差:

        val mRecord_ss = new StandardScaler().setInputCol("features").setOutputCol("scaledFeatures").setWithStd(true).setWithMean(true).fit(mRecord_va).transform(mRecord_va).drop("features");

MLPC神经网络训练与预测:

经过预处理的数据,按照6:4的比例分成两部分,一部分作为训练数据,一部分作为验证数据。其中layers表示神经网络的层数,是一个int类型的数据,第一位与输入特征的维度保持一致,最后一位与输出标签的数量保持一致,数组中间的位数表示隐藏层的层数以及每层的神经元数量:

        val splits = mRecord_ss.randomSplit(Array(0.6, 0.4), seed = 1234L);val train = splits(0);val test = splits(1);val layers = Array[Int](5, 3, 2);val trainer = new MultilayerPerceptronClassifier().setFeaturesCol("scaledFeatures").setLabelCol("pa").setLayers(layers).setBlockSize(128).setSeed(1234L).setMaxIter(32)val result = trainer.fit(train).transform(test).select("prediction", "pa");

MLPC效果评估:

        val evaluator = new MulticlassClassificationEvaluator().setMetricName("accuracy").setLabelCol("pa").setPredictionCol("prediction");println(s"准确度是 ${evaluator.evaluate(result)}");

最终得到的准确度是69%。

上述案例只是一个最简案例,采用了最基本的数据预处理与效果评估的方法。实际数据分析以及神经网络应用过程中,应该充分深入业务,理解数据含义,做好特征工程、算法选型与调优,对分析结果进行细致完善的评估。

 

这篇关于Spark MLPC神经网络应用实例(scala)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1115777

相关文章

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

SpringBoot操作spark处理hdfs文件的操作方法

《SpringBoot操作spark处理hdfs文件的操作方法》本文介绍了如何使用SpringBoot操作Spark处理HDFS文件,包括导入依赖、配置Spark信息、编写Controller和Ser... 目录SpringBoot操作spark处理hdfs文件1、导入依赖2、配置spark信息3、cont

Oracle Expdp按条件导出指定表数据的方法实例

《OracleExpdp按条件导出指定表数据的方法实例》:本文主要介绍Oracle的expdp数据泵方式导出特定机构和时间范围的数据,并通过parfile文件进行条件限制和配置,文中通过代码介绍... 目录1.场景描述 2.方案分析3.实验验证 3.1 parfile文件3.2 expdp命令导出4.总结

MySQL的索引失效的原因实例及解决方案

《MySQL的索引失效的原因实例及解决方案》这篇文章主要讨论了MySQL索引失效的常见原因及其解决方案,它涵盖了数据类型不匹配、隐式转换、函数或表达式、范围查询、LIKE查询、OR条件、全表扫描、索引... 目录1. 数据类型不匹配2. 隐式转换3. 函数或表达式4. 范围查询之后的列5. like 查询6

Python开发围棋游戏的实例代码(实现全部功能)

《Python开发围棋游戏的实例代码(实现全部功能)》围棋是一种古老而复杂的策略棋类游戏,起源于中国,已有超过2500年的历史,本文介绍了如何用Python开发一个简单的围棋游戏,实例代码涵盖了游戏的... 目录1. 围棋游戏概述1.1 游戏规则1.2 游戏设计思路2. 环境准备3. 创建棋盘3.1 棋盘类

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

实例:如何统计当前主机的连接状态和连接数

统计当前主机的连接状态和连接数 在 Linux 中,可使用 ss 命令来查看主机的网络连接状态。以下是统计当前主机连接状态和连接主机数量的具体操作。 1. 统计当前主机的连接状态 使用 ss 命令结合 grep、cut、sort 和 uniq 命令来统计当前主机的 TCP 连接状态。 ss -nta | grep -v '^State' | cut -d " " -f 1 | sort |

Java Websocket实例【服务端与客户端实现全双工通讯】

Java Websocket实例【服务端与客户端实现全双工通讯】 现很多网站为了实现即时通讯,所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发 出HTTP request,然后由服务器返回最新的数据给客服端的浏览器。这种传统的HTTP request 的模式带来很明显的缺点 – 浏 览器需要不断的向服务器发出请求,然而HTTP