当前位置: 首页 > 编程日记 > 正文

手把手教你实现PySpark机器学习项目——回归算法

640?wx_fmt=jpeg

作者 | hecongqing

来源 | AI算法之心(ID:AIHeartForYou)


【导读】PySpark作为工业界常用于处理大数据以及分布式计算的工具,特别是在算法建模时起到了非常大的作用。PySpark如何建模呢?这篇文章手把手带你入门PySpark,提前感受工业界的建模过程!

任务简介  

在电商中,了解用户在不同品类的各个产品的购买力是非常重要的!这将有助于他们为不同产品的客户创建个性化的产品。在这篇文章中,笔者在真实的数据集中手把手实现如何预测用户在不同品类的各个产品的购买行为。
https://datahack.analyticsvidhya.com/contest/black-friday/

数据集简介  

某零售公司想要了解针对不同类别的各种产品的顾客购买行为(购买量)。他们为上个月选定的大批量产品分享了各种客户的购买汇总。该数据集还包含客户人口统计信息(age, gender, marital status, city_type, stay_in_current_city),产品详细信息(product_id and product category)以及上个月的purchase_amount总数。现在,他们希望建立一个模型来预测客户对各种产品的购买量,这将有助于他们为不同产品的客户创建个性化的产品。

手把手实战项目  

1. 导入数据

这里我们使用PySpark的读数据接口read.csv读取数据,和pandas读取数据接口迷之相似。

2. 分析数据的类型

要查看Dataframe中列的类型,可以使用printSchema()方法。让我们在train上应用printSchema(),它将以树格式打印模式。

3. 预览数据集

在PySpark中,我们使用head()方法预览数据集以查看Dataframe的前n行,就像python中的pandas一样。我们需要在head方法中提供一个参数(行数)。让我们看一下train的前5行。

train.head(5)"""[Row(User_ID=1000001, Product_ID='P00069042', Gender='F', Age='0-17', Occupation=10, City_Category='A', Stay_In_Current_City_Years='2', Marital_Status=0, Product_Category_1=3, Product_Category_2=None, Product_Category_3=None, Purchase=8370), Row(User_ID=1000001, Product_ID='P00248942', Gender='F', Age='0-17', Occupation=10, City_Category='A', Stay_In_Current_City_Years='2', Marital_Status=0, Product_Category_1=1, Product_Category_2=6, Product_Category_3=14, Purchase=15200),  Row(User_ID=1000001, Product_ID='P00087842', Gender='F', Age='0-17', Occupation=10, City_Category='A', Stay_In_Current_City_Years='2', Marital_Status=0, Product_Category_1=12, Product_Category_2=None, Product_Category_3=None, Purchase=1422), Row(User_ID=1000001, Product_ID='P00085442', Gender='F', Age='0-17', Occupation=10, City_Category='A', Stay_In_Current_City_Years='2', Marital_Status=0, Product_Category_1=12, Product_Category_2=14, Product_Category_3=None, Purchase=1057), Row(User_ID=1000002, Product_ID='P00285442', Gender='M', Age='55+', Occupation=16, City_Category='C', Stay_In_Current_City_Years='4+', Marital_Status=0, Product_Category_1=8, Product_Category_2=None, Product_Category_3=None, Purchase=7969)]"""	

要查看数据框架中的行数,我们需要调用方法count()。让我们核对一下train上的行数。Pandas和Spark的count方法是不同的。

4. 插补缺失值

通过调用drop()方法,可以检查train上非空数值的个数,并进行测试。默认情况下,drop()方法将删除包含任何空值的行。我们还可以通过设置参数“all”,当且仅当该行所有参数都为null时以删除该行。这与pandas上的drop方法类似。



在这里,为了填充简单,我使用-1来填充train和test的null值。虽然这不是一个很好的填充方法,你可以选择其他的填充方式。


5. 分析数值特征

我们还可以使用describe()方法查看Dataframe列的各种汇总统计信息,它显示了数字变量的统计信息。要显示结果,我们需要调用show()方法。


上面看起来好像比较乱,这里我们选择某一列来看看。

让我们从一个列中选择一个名为“User_ID”的列,我们需要调用一个方法select并传递我们想要选择的列名。select方法将显示所选列的结果。我们还可以通过提供用逗号分隔的列名,从数据框架中选择多个列。

为了建立一个模型,我们需要在“train”和“test”中看到分类特征的分布。这里我只对Product_ID显示这个,但是我们也可以对任何分类特性执行相同的操作。让我们看看在“train”和“test”中Product_ID的不同类别的数量。这可以通过应用distinct()和count()方法来实现。

在计算“train”和“test”的不同值的数量后,我们可以看到“train”和“test”有更多的类别。让我们使用相减方法检查Product_ID的类别,这些类别正在"test"中,但不在“train”中。我们也可以对所有的分类特征做同样的处理。

以上你可以看到46个不同的类别是在"test"中,而不在"train"中。在这种情况下,我们要么收集更多关于它们的数据,要么跳过那些类别(无效类别)的“test”。

我们还需要通过在Product_ID上应用StringIndexer转换将分类列转换为标签,该转换将标签的Product_ID列编码为标签索引的列。

在上面,我们将fit()方法应用于“train”数据框架上,构建了一个标签。稍后我们将使用这个标签来转换我们的"train"和“test”。让我们在labeller的帮助下转换我们的train和test的Dataframe。我们需要调用transform方法。我们将把转换结果存储在Train1和Test1中。


上面已经显示了我们在以前的"train" Dataframe中成功的添加了一个转化后的列“product_id_trans”,("Train1" Dataframe)。

8. 选择特征来构建机器学习模型

首先,我们需要从pyspark.ml.feature导入RFormula;然后,我们需要在这个公式中指定依赖和独立的列;我们还必须为为features列和label列指定名称。


在创建了这个公式之后,我们需要将这个公式应用到我们的Train1上,并通过这个公式转换Train1,Test1。让我们看看如何做到这一点,在拟合变换train1之后,

在应用了这个公式之后,我们可以看到train1和test1有两个额外的列,称为features和label,并对我们在公式中指定的列进行标记(featuresCol= features和labelCol= label)。直观上,train1和test1中的features列中的所有分类变量都被转换为数值,数值变量与之前应用ML时相同。我们还可以查看train1和test1中的列特性和标签。


9. 建立机器学习模型

在应用RFormula和转换Dataframe之后,我们现在需要根据这些数据开发机器学习模型。我想为这个任务应用一个随机森林回归。让我们导入一个在pyspark.ml中定义的随机森林回归器。然后建立一个叫做rf的模型。我将使用随机森林算法的默认参数。

在创建一个模型rf之后,我们需要将train1数据划分为train_cv和test_cv进行交叉验证。这里,我们将train1数据区域划分为train_cv的70%和test_cv的30%。

在train_cv上建立模型,在test_cv上进行预测。结果将保存在predictions中。

10. 模型效果评估

让我们评估对test_cv的预测,看看rmse和mse是多少。

为了评估模型,我们需要从pyspark.ml.evaluation中导入RegressionEvaluator。我们必须为此创建一个对象。有一种方法叫 evaluate for evaluator ,它对模型求值。我们需要为此指定度量标准。

经过计算,我们可以看到我们的rmse是3827.767295494888。

现在,我们将在所有的train1数据集上再次训练一个模型。

预测之后,我们得到测试集预测结果,并将其保存成csv文件。



写入csv文件后(submission.csv)。我们可以上传我们的第一个解决方案来查看分数,我得到的分数是3844.20920145983。

总结  

在本文中,我以一个真实案例介绍了PySpark建模流程。这只是本系列文章的开始。在接下来的几周,我将继续分享PySpark使用的教程。同时,如果你有任何问题,或者你想对我要讲的内容提出任何建议,欢迎留言。

(*本文为AI科技大本营转载文章,转载联系原作者


精彩推荐



2019 中国大数据技术大会(BDTC)再度来袭!豪华主席阵容及百位技术专家齐聚,15 场精选专题技术和行业论坛,超强干货+技术剖析+行业实践立体解读,深入解析热门技术在行业中的实践落地。6.6 折票限时特惠(立减1400元),学生票仅 599 元!

640?wx_fmt=png

推荐阅读

相关文章:

mcDropdown使用方法

最近使用了mcDropdown插件,百度一查,资料较少,只看到了mcDropdown官网的英文说明文档,所以今天就写点,以便以后使用。 第一步:引用jquery库和css jQuery v1.2.6 (or higher)*jquery.mcdropdown.js Plug-inj…

Windows上通过VLC播放器搭建rtsp流媒体测试地址操作步骤

1. 从https://www.videolan.org/index.zh.html 下载最新的windows 64bit 3.0.6版本并安装; 2. 打开VLC media player,依次点击按钮:”媒体” --> “流”,如下图所示: 3. 点击”添加”按钮,选择一个视频…

Swift - AppDelegate.swift类中默认方法的介绍

项目创建后,AppDelegate类中默认带有如下几个方法,具体功能如下: 1,应用程序第一次运行时执行这个方法只有在App第一次运行的时候被执行过一次,每次App从后台激活时都不会再执行该方法。(注:所有…

上热搜了!“学了Python6个月,竟然找不到工作!”

在编程界,Python是一种神奇的存在。有人认为,只有用Python才能优雅写代码,提高代码效率;但另一部分人恨不能把Python喷成筛子。那么,Python到底有没有用,为什么用Python找不到工作?CSDN小姐姐带…

Linux0.00内核为什么要自己设置0x80号陷阱门来调用write_char过程?

我一开始没注意这个问题,只是通过陷阱门觉得很绕弯子,为何不在3级用户代码里直接调用write_char,今天自己写程序想用call调用代码段,才发现了大问题。我写了个类似于write_char的过程,代码如下:dividing_li…

iOS支付宝(Alipay)接入详细流程,比微信支付更简单,项目实战中的问题分析

最近在项目中接入了微信支付和支付宝支付,总的来说没有那么坑,很多人都说文档不全什么的,确实没有面面 俱到,但是认真一步一步测试下还是妥妥的,再配合懂得后台,效率也是很高的,看了这篇文章&a…

LIVE555简介及在Windows上通过VS2013编译操作步骤

LIVE555是使用开放标准协议(RTP/RTCP, RTSP, SIP)形成的一组用于多媒体流C库。这些库支持的平台包括Unix(包括Linux和Mac OS X)、Windows和QNX(以及其它符号POSIX的系统)。这些库已经被用于实现的应用例如LIVE555媒体服务器、LIVE555代理服务器(RTSP服务器应用)以及vobStreamer…

GitHub App终于来了,iPhone用户可尝鲜,「同性交友」更加便捷

整理 | 夕颜出品 | AI科技大本营(ID:rgznai100)【导读】据外媒 VentureBeat 报道,在 11 月 13 日举行的 GitHub Universe 上,微软宣布了面向程序员和开发人员的一系列升级,包括针对 iOS 智能手机和 iPad 推出的 GitHub…

[NHibernate]代码生成器的使用

目录 写在前面 文档与系列文章 代码生成器的使用 总结 写在前面 前面的文章介绍了nhibernate的相关知识,都是自己手敲的代码,有时候显得特别的麻烦,比如你必须编写持久化类,映射文件等等,举得例子比较简单,…

RapidJSON简介及使用

RapidJSON是腾讯开源的一个高效的C JSON解析器及生成器,它是只有头文件的C库。RapidJSON是跨平台的,支持Windows, Linux, Mac OS X及iOS, Android。它的源码在https://github.com/Tencent/rapidjson/,稳定版本为2016年发布的1.1.0版本。 Rap…

高德地图关键字搜索oc版

.h文件 // MapSearchViewController.h // JMT // // Created by walker on 16/10/11. // Copyright © 2016年 BOOTCAMP. All rights reserved. // #import <UIKit/UIKit.h> #import <AMapNaviKit/MaMapKit.h> #import <AMapSearchKit/AMapSearchKit.h&…

同一个内容,对比Java、C、PHP、Python的代码量,结局意外了

为什么都说Python容易上手&#xff01;是真的吗&#xff1f;都说Python通俗易懂&#xff0c;容易上手&#xff0c;甚至不少网友表示「完成同一个任务&#xff0c;C 语言要写 1000 行代码&#xff0c;Java 只需要写 100 行&#xff0c;而 Python 可能只要 20 行」到底是真的还是…

图片存储思考:

http://blog.csdn.net/liuruhong/article/details/4072386

LIVE555中RTSP客户端接收媒体流分析及测试代码

LIVE555中testProgs目录下的testRTSPClient.cpp代码用于测试接收RTSP URL指定的媒体流&#xff0c;向服务器端发送的命令包括&#xff1a;DESCRIBE、SETUP、PLAY、TERADOWN。 1. 设置使用环境&#xff1a;new一个BasicTaskScheduler对象&#xff1b;new一个BasicUsageEnvironm…

swift代理传值

比如我们这个场景&#xff0c;B要给A传值&#xff0c;那B就拥有代理属性&#xff0c; A就是B的代理&#xff0c;很简单吧&#xff01;有代理那就离不开协议&#xff0c;所以第一步就是声明协议。在那里声明了&#xff1f;谁拥有代理属性就在那里声明&#xff0c;所以代码就是这…

重磅:腾讯正式开源图计算框架Plato,十亿级节点图计算进入分钟级时代

整理 | 唐小引 来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;腾讯开源进化 8 年&#xff0c;进入爆发期。 继刚刚连续开源 TubeMQ、Tencent Kona JDK、TBase、TKEStack 四款重点开源项目后&#xff0c;腾讯开源再次迎来重磅项目&#xff01;北京时间 11 月 14 日…

类似ngnix的多进程监听用例

2019独角兽企业重金招聘Python工程师标准>>> 多进程监听适合于短连接&#xff0c;且连接间无交集的应用。前两天简单写了一个&#xff0c;在这里保存一下。 #include <sys/types.h>#include <stdarg.h>#include <signal.h>#include <unistd.h&…

今日头条李磊等最新论文:用于文本生成的核化贝叶斯Softmax

译者 | Raku 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;摘要用于文本生成的神经模型需要在解码阶段具有适当词嵌入的softmax层&#xff0c;大多数现有方法采用每个单词单点嵌入的方式&#xff0c;但是一个单词可能具有多种意义&#xff0c;在不同的背景下&#…

FFmpeg中RTSP客户端拉流测试代码

之前在https://blog.csdn.net/fengbingchun/article/details/91355410中给出了通过LIVE555实现拉流的测试代码&#xff0c;这里通过FFmpeg来实现&#xff0c;代码量远小于LIVE555&#xff0c;实现模块在libavformat。 在4.0及以上版本中&#xff0c;FFmpeg有了些变动&#xff…

虚拟机下运行linux通过nat模式与主机通信、与外网连接

首先&#xff1a;打开虚拟机的编辑菜单下的虚拟网络编辑器&#xff0c;选中VMnet8 NAT模式。通过NAT设置获取网关IP&#xff0c;通过DHCP获取可配置的IP区间。同时&#xff0c;将虚拟机的虚拟机菜单的设置选项中的网络适配器改为NAT模式。即可&#xff01; 打开linux&#xff0…

远程过程调用RPC简介

RPC(Remote Procedure Call, 远程过程调用)&#xff1a;是一种通过网络从远程计算机程序上请求服务&#xff0c;而不需要了解底层网络技术的思想。 RPC是一种技术思想而非一种规范或协议&#xff0c;常见RPC技术和框架有&#xff1a; (1). 应用级的服务框架&#xff1a;阿里的…

iOS开发:沙盒机制以及利用沙盒存储字符串、数组、字典等数据

iOS开发&#xff1a;沙盒机制以及利用沙盒存储字符串、数组、字典等数据 1、初识沙盒&#xff1a;(1)、存储在内存中的数据&#xff0c;程序关闭&#xff0c;内存释放&#xff0c;数据就会丢失&#xff0c;这种数据是临时的。要想数据永久保存&#xff0c;将数据保存成文件&am…

支撑亿级用户“刷手机”​,百度Feed流背后的新技术装备有多牛?

导读&#xff1a;截止到2018年底&#xff0c;我国网民使用手机上网的比例已高达98.6%&#xff0c;移动互联网基本全方位覆盖。智能手机的操作模式让我们更倾向于通过简单的“划屏”动作&#xff0c;相对于传统的文本交互方式来获取信息&#xff0c;用户更希望一拿起手机就能刷到…

玩转高性能超猛防火墙nf-HiPAC

中华国学&#xff0c;用英文讲的&#xff0c;稀里糊涂听了个大概&#xff0c;不得不佩服西方人的缜密的逻辑思维&#xff0c;竟然把玄之又玄的道家思想说的跟牛顿定律一般&#xff0c;佩服。归家&#xff0c;又收到了邮件&#xff0c;还是关于nf-hipac的&#xff0c;不知不觉就…

ios 沙盒 plist 数据的读取和存储

plist 只能存储基本的数据类型 和 array 字典 [objc] view plaincopy - (void)saveArray { // 1.获得沙盒根路径 NSString *home NSHomeDirectory(); // 2.document路径 NSString *docPath [home stringByAppendingPathComponent:"Document…

FFmpeg实现获取USB摄像头视频流测试代码

通过USB摄像头(注&#xff1a;windows7/10下使用内置摄像头&#xff0c;linux下接普通的usb摄像头(Logitech))获取视频流用到的模块包括avformat和avdevice。头文件仅include avdevice.h即可&#xff0c;因为avdevice.h中会include avformat.h。libavdevice库是libavformat的一…

重磅!明略发布数据中台战略和三大解决方案

11月15日&#xff0c;明略科技在上海举办以“FASTER 聚变增长新动力”为主题的2019数据智能峰会&#xff0c;宣布“打造智能时代的企业中台”新战略&#xff0c;同时推出了两大新产品“新一代数据中台”和“营销智能平台”&#xff0c;以及三大行业解决方案&#xff0c;分别是“…

Android程序完全退出的三种方法

1. Dalvik VM的本地方法 android.os.Process.killProcess(android.os.Process.myPid()) //获取PID&#xff0c;目前获取自己的也只有该API&#xff0c;否则从/proc中自己的枚举其他进程吧&#xff0c;不过要说明的是&#xff0c;结束其他进程不一定有权限&#xff0c;不然就…

FFmpeg通过摄像头实现对视频流进行解码并显示测试代码(旧接口)

这里通过USB摄像头(注&#xff1a;windows7/10下使用内置摄像头&#xff0c;linux下接普通的usb摄像头(Logitech))获取视频流&#xff0c;然后解码&#xff0c;最后再用opencv显示。用到的模块包括avformat、avcodec和avdevice。libavdevice库是libavformat的一个补充库(comple…

IOS数据存储之文件沙盒存储

前言&#xff1a; 之前学习了数据存储的NSUserDefaults&#xff0c;归档和解档&#xff0c;对于项目开发中如果要存储一些文件&#xff0c;比如图片&#xff0c;音频&#xff0c;视频等文件的时候就需要用到文件存储了。文件沙盒存储主要存储非机密数据&#xff0c;大的数据。 …