没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
PySpark数据分析和模型算法实战
用 PySpark 构建客户流失模型实战项目
对于在高度竞争的市场中运营的公司来说,预测客户流失是一项关键的业务活动,因为消费者很容易取
消服务或更换供应商。许多研究发现,吸引新客户的成本远远高于保留现有客户的成本。识别有流失风
险的客户,可以让企业针对他们提供优惠和折扣,以及了解更广泛的产品/旅程改进机会。
1. 项目背景和目标
1.1 项目背景
这个项目是基于虚构的音乐流媒体公司 "Sparkify"。该公司在一个高度竞争的市场中运营,其商业模式
是基于广告和订阅。客户可以使用免费层级的服务,在那里他们会被播放广告,或者使用订阅计划,该
计划没有广告,但客户会被收取月费。
1.2 目标
这项研究的目的是建立一个模型,能够预测哪些客户的流失风险最大。对于这个项目,将把流失定义为
客户完全取消他们的订阅(在这个数据集中通过 "取消确认"来识别)。如果能在这些客户离开之前识别
出来,就可以为他们提供折扣/激励措施,让他们留下来。
任务
1. 探索性数据分析(EDA):评估缺失值,描述性统计,可视化数据,并创建一个流失率指标。
2. 特征工程:创建用户级别的记录,具有聚合特征。
3. 数据转换:创建一个管道来扩展+矢量化特征
4. 数据建模、评估+优化
5. 总结
数据
在这个项目中,将使用 sparkify_event_data.json 的一个迷你子集
( mini_sparkify_event_data.json )来分析数据,对数据进行整理和建模。该数据集包含一个有时
间戳的用户操作日志。
衡量标准
将使用F1分数作为主要指标来评估模型的性能。F1分数适合这个分类任务,因为它提供了一个精确性和
召回率的平衡,它可以处理不平衡的类别分布,即在这种情况下只有23%的客户流失。
2. 数据收集和准备
2.1 导入相关类库
安装依赖包:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy sklearn pandas
seaborn matplotlib
从python类库中,可以了解到,本次项目所需要用到的一些工具、方法、模型等相关信息。
2.2 构建SparkSession执行环境入口对象
输出结果:
# import libraries
from pyspark.sql import SparkSession
from pyspark.sql import functions as F
from pyspark.sql.functions import max as sparkMax
from pyspark.sql.types import IntegerType, StringType, BooleanType, DateType,
DoubleType
from pyspark.sql.window import Window
from pyspark.ml.feature import StandardScaler, VectorAssembler, StringIndexer,
OneHotEncoder, Normalizer
from pyspark.ml.classification import RandomForestClassifier, GBTClassifier,
LogisticRegression
from pyspark.ml import Pipeline
from pyspark.ml.tuning import CrossValidator, ParamGridBuilder
from pyspark.ml.evaluation import MulticlassClassificationEvaluator
from pyspark.mllib.evaluation import BinaryClassificationMetrics as metric
from sklearn.metrics import roc_curve, auc
import time
import datetime
import numpy as np
import pandas as pd
import seaborn as sns
from matplotlib import pyplot as plt
spark = SparkSession.builder \
.master("local[*]") \
.appName("Sparkify Project") \
.getOrCreate()
# 通过SparkSession对象 获取 SparkContext对象
sc = spark.sparkContext
# 检查SparkSession对象
# check Spark session
spark.sparkContext.getConf().getAll()
[('spark.sql.warehouse.dir', '/user/hive/warehouse'),
('spark.app.id', 'local-1691919957387'),
('spark.rdd.compress', 'True'),
('spark.serializer.objectStreamReset', '100'),
('spark.driver.port', '33370'),
('spark.master', 'local[*]'),
('spark.executor.id', 'driver'),
('spark.submit.deployMode', 'client'),
('spark.driver.host', 'hadoop'),
('spark.ui.showConsoleProgress', 'true'),
('spark.app.name', 'Sparkify Project')]
输出结果:
2.3 探索性数据分析
2.3.1 导入数据集
输出:
3. 数据探索与预处理
当处理完整的数据集时,通过加载一小部分数据并在Spark中执行基本操作来执行EDA(Exploratory
Data Analysis)。
spark
path = "file:///home/hadoop/mini_sparkify_event_data.json"
event_log = spark.read.json(path)
#event_log.persist()
def shape(df):
'''
Pandas中用于显示数据框中行数和列数的复制形状函数
'''
rows, cols = df.count(), len(df.columns)
shape = (rows, cols)
return shape
shape(event_log)
(286500, 18)
3.1 理解数据结构和特征
该迷你数据集包含286.5K行事件数据,来自225个不同的用户。
该数据集包含以下18个特征。
artist:正在播放的歌曲的音乐歌手。如果该事件不是正在播放的歌曲,则为空。
auth:认证类型,用户在事件发生时是登录、登出、访客还是取消。
firstName:用户的名字。对于未认证的事件为空。
gender:用户的性别,M(男性)或F(女性)。对于未经认证的事件为空。
itemInSession: 项目编号
lastName:用户的名字。对于未认证的事件为空。
length:会议持续时间
location:用户在事件发生时的位置(城镇和州)。
method:HTTP方法是 "PUT "或 "GET"。
page:互动类型/页面
registration:客户第一次在Sparkify注册时的UNIX时间戳
sessionId: 会话标识符
Song:正在播放的歌曲的标题。如果该事件不是正在播放的歌曲,则为空。
Status:HTTP状态代码
ts:事件发生时的UNIX时间戳
userAgent:事件发生时用户的设备和浏览器的详细信息。
3.2 检查缺失值
下面的代码将任何空字符串转换为NULL值,然后将NULL值绘制成热图。这对快速显示数据集的完整性
很有用。
viz_dict = {'axes.titlesize': 18,
'axes.labelsize': 16,
'figure.figsize': (7, 7),
'font_scale': 0.7
}
sns.set_context("notebook", rc=viz_dict)
sns.set_style("darkgrid")
cmap = sns.cubehelix_palette(dark=0, light=1, as_cmap=True)
sns.heatmap(event_log.toPandas().replace('', np.nan).isnull(),
cbar=False, cmap=cmap);
仔细观察会发现,一些缺失的值没有被归为NaN,而只是空字符串。下面的代码对所有这些变化进行计
数,以按列获得缺失值的准确计数。
输出:
event_log.select([F.count(F.when(F.col(c).contains('None') |
F.col(c).contains('NULL') |
(F.col(c) == '') |
F.col(c).isNull() |
F.isnan(c), c
)).alias(c)
for c in event_log.columns]).show(vertical=True)
-RECORD 0--------------
artist | 58406
auth | 0
firstName | 8346
gender | 8346
itemInSession | 0
lastName | 8346
length | 58392
level | 0
location | 8346
method | 0
page | 0
registration | 8346
sessionId | 0
song | 58445
剩余38页未读,继续阅读
资源评论
necessary653
- 粉丝: 1993
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功