在本文中,我将讨论我的Udacity数据科学家纳米学位的毕业项目。
本文从对毕业项目中考虑的问题的简概述开始,包括对为什么预测或防止客户流失的原因以及大数据是什么(简短的说)以及Apache Spark如何适应大数据的简短讨论。
然后将介绍如何着手实际项目,包括详细的演练和我在此过程中面临的问题的讨论。在总结之前,会解释和讨论项目的结果。
本文最后总结了我的项目结果,并简要讨论了该项目的可能改进。
介绍
Spotify是一个正版流媒体音乐服务平台,该平台的用户可以选择付费订阅版或者免费版。用户可以在使用过程中自动升级或降级,甚至完全取消服务。这个项目的目的是使用Spark框架从一个庞杂的用户日志数据中发现用户的“炸毛”信号。
为什么要预测用户流失
客户流失是许多公司的主要问题 ,因为流失客户往往与收入下降直接相关。对于该项目中考虑的问题,客户正在使用广告资助的免费版本的服务,或者每月支付月费以欣赏音乐流而不受广告干扰的情况,也是如此。
除此之外,一般来说获得新客户比保留现有客户的成本更高。因此,即使企业可以通过吸引新用户以某种方式补偿用户的流失,也将造成经济损失。而且,随着产品发布后时间的流逝,吸引新用户可能变得越来越困难。客户高流失率还可能导致无法发展业务,使企业获利能力降低。所以,客户流失是企业应非常重视并试图防止的问题。因此,在事情发生之前对其进行预测可能对企业成功至关重要。
尽管此项目仅与预测用户是否可能流失有关,但重要的是牢记公司需要利用这些预测并制定应对潜在流失者的策略。可能是向这些用户提供优惠券以吸引他们留下,也可以将这些优惠券提供给用户,以换取参加简短的调查,以帮助理解用户为什么流失。
大数据和Spark概述
当今数据的90%是在过去两年生成的,根据Domo.Inc的时间,截至2017年,过去两年的平均数据为2.5兆字节。显然这些数据只是估计值,但他们很好的表面现在已生成大量数据。
正如那些互联网大公司成功所证明的那样,使用海量数据可以促进新的令人兴奋的商业模式兴起,特别是当您考虑复杂的机器学习模型时,很明显,大型数据集可能具有巨大的价值。
什么是大数据?
最简单但不太技术性的定义是“数据集太大,无法容纳在家里或办公室的常规计算机的内存中,因此需要使用分布式计算”。
大数据是高容量,高速度和/或多变的信息资产,它们需要具有成本效益的创新形式的信息处理方式,以实现增强的洞察力,决策和流程自动化。 有关大数据的更多有趣信息,请参考以下参考资料:
通过对大数据的六个V的非常有用的图表,对大数据进行了很好的介绍:https://searchdatamanagement.techtarget.com/definition/big-data
Oracle还对该主题提供了很好的介绍:https://www.oracle.com/big-data/guide/what-is-big-data.html
关于从大数据的第一个时代到新时代的转变的文章:https://www.kdnuggets.com/2019/07/death-big-data-multi-cloud-era.html
Spark如何适用于此?
设置Spark会话和读取文件非常容易。 Spark还提供了非常有用的Spark SQL API,使您可以使用SQL或Pandas数据框架(例如Spark数据框架)来处理此类数据。Apache Spark还允许以类似于scikit-learn的方式在大型数据集上使用机器学习算法(仅限于随数据量线性缩放的算法)。
为了不必过多担心与运行群集相关的成本,我执行了所有初始步骤,在本地台式机上为此项目编写代码。因此,我在计算机上以本地模式使用Spark,并使用更小版本的数据集(只有128 MB而不是整个数据集的12 GB)进行了探索性分析。
一旦确保整个代码都能在本地计算机上正常运行,就可以设置Amazone Web服务(AWS)弹性地图缩减(EMR)集群,并将本地创建的Jupyter笔记本转移到该集群。我决定使用AWS EMR集群,因为它免除了您必须手动安装Spark和设置所有内容的麻烦。 Udacity Spark课程还提供有关如何注册AWS以及如何设置EMR群集的分步信息。
在本地使用小型数据集时,我首先发现Spark令人沮丧地缓慢。 很明显,由于冗余等必要功能,它总是比Pandas慢,当使用较大的数据集时,尤其是用于超参数调整的交叉验证网格搜索可能会令人沮丧地缓慢。
总而言之,尽管它相对容易使用,但是使用Spark并将其部署在集群上有时有时会令人沮丧和耗时。
解决问题的思路
1. 搭建Spark的运行环境
2. 加载所需要的库
3. 加载与清洗数据
4. 探索性数据分析
5. 特征工程
6. 机器学习
7. 结论汇总
机器学习模型选择
将完整数据分成训练集和测试集,选用逻辑回归与随机森林机器学习模型。
逻辑回归:优点是计算速度快,缺点是容易产生过拟合;
随机森林:优点是在当前的算法中具有极好的准确率,能够有效的运行在大数据集上,对于缺省值问题也能够获得很好的结果;
在模型的选择上我的解决思路是选用逻辑回归作为参考,因为其容易过拟合,所以随机森林模型的分数应该会比逻辑回归更高。随机森林更适用于大数据。
参数的选择
机器学习一般选择准确率(Precision),精确度(Accuracy),召回率(Recall),F1分数(F1-Score)作为衡量模型好坏的标准,其中:
准确率:对于给定数据集,分类正确样本个数与总体样本数的比值;
精确度:判断为真的正例与所有判断为真的样例的比值;
召回率:分类器中判定为真的正例占总比例的比率;
F1-Score:作为综合的评价指标,可以平衡准确率和召回率的影响。
在本项目中,需要预测客户流失率,但流失顾客数据集很小,占总数据的比例很低,准确率很难反映出模型的好坏。解决此问题的一种可能方法是过采样,但是在处理大型数据集时,通常不可行。我决定通过F1-Score代替准确率作为优化指标。
加载和清理数据
使用上面在Spark部分中显示的代码,我加载了简化的数据集。
初步观察该模式将发现有18列,Sparkify数据的架构:
清除数据时要采取的重要的第一步就是识别缺失值。 PySpark SQL同时具有isnan函数和isull函数。 此外,空值可以是编码缺失值的另一种显而易见的方法。 用于处理缺失值的代码如下所示:
探索性数据分析
定义客户流失
完成初步分析之后,创建一列 Churn 作为模型的标签。使用 Cancellation Confirmation 事件来定义客户流失,该事件在付费或免费客户身上都有发生。
探索数据
定义好客户流失后,就可以执行一些探索性数据分析,观察留存用户和流失用户的行为。
流失率与用户点赞行为的关系
流失率与用户点踩行为的关系
流失率与播放音乐数量的关系
特征工程
按照下述步骤:
* 写一个脚本来从小数据集中提取需要的特征
* 确保你的脚本可以拓展到大数据集上,使用最佳实践原则
* 在完整数据集上运行脚本,按运行情况调试代码
从原始数据中提取了探索过的4个特征作为算法的输入,合并特征,并将特征和标签保存在df_user中,总共有225个用户样本。
建模
将完整数据集分成训练集、测试集和验证集。测试几种机器学习方法,评价不同机器学习方法的准确率,根据情况调节参数。根据准确率挑选出表现最好的那个模型,然后报告在训练集上的结果。
因为流失顾客数据集很小,占总数据的比例很低,准确率很难反映出模型的好坏,F1-Score就能比较好的反映出模型的好坏。
首先划分数据集,80%作为训练集,20%作为测试集,计算基准模型的F1 score
模型训练
使用交叉验证训练了逻辑回归,随机森林模型,根据模型的 F1 score 选择模型。
1. 逻辑回归
逻辑回归的训练分数:
2. 随机森林
随机森林的训练分数:
结果
从模型的训练结果来看,随机森林模型的表现最优,随机森林模型(F1 score=0.76)优于逻辑回归模型(F1 score =0.61)。
因为本项目的数据集很大,随机森林模型具有极好的准确率,能够有效的运行在大数据集上,对于缺省值问题也能够获得很好的结果,而逻辑回归模型由于发生过拟合导致F1-score低于随机森林模型。
由于对数据建模还不熟练,特别是在调参方面,可能导致预测结果没有预想中那么准确。另外,还想尝试使用支持向量机模型和梯度提升模型来建模,观察准确率与F1 score,从而选出最优秀的模型。
改进
Sparkify预测用户流失项目在128M的数据上训练模型,事实证明,即使对整个数据集,也只有22278个用户,其中只有4405个用户流失,这在使用交叉验证时会导致拟合不足。因此,如果可能应收集更多数据。
我对数据集的划分只进行了一次,得到的模型并不一定是最好的模型,可以对数据集多划分几次,然后通过比较F1得分,观察随机森林模型是否是最优选择。
重新多次划分数据集后,通过比较F1 Score,随机森林模型都比逻辑回归模型表现更优秀,所以随机森林模型的表现最优。
结论
在这个Capstone项目中,我使用了音乐流服务Spotify的用户日志数据来预测该服务的用户是否可能流失,首先我解释了为什么用户流失是一个重要的话题,为什么大数据很重要,以及Spark是处理大数据的极其有用的工具。
对于我自己来说,一个有趣的收获是一旦将其汇总起来,最初看起来相当完整的数据集可能会变得相对较小。该项目还表明,在某些情况下,由于使用交叉验证,超参数调整会使得模型性能显著下载。
尽管面临这些挑战,但我发现这个项目非常令人兴奋,这个项目激发了我开始使用大数据和Spark的兴趣,并从处理中小型数据集到大型数据集中,扩大了作为数据分析师的视野。