当前位置: 首页 > 后端技术 > Python

BertelsmannArvatoMailOrderCompanyCustomerSegmentationandForecasting

时间:2023-03-25 23:20:38 Python

一、简介1.1项目概述在商业直销活动中,利用标签用户模型优化营销活动是实现精准营销的重要工具。本项目需要使用无监督学习技术,基于德国一家邮购公司现有客户的人口统计特征,分析公司现有客户的主要特征。然后使用监督学习技术构建预测模型,以预测德国一般人口统计数据集上的新客户。这篇文章是与BertelsmannArvatoAnalytics合作提供的优达学城数据科学家纳米学位研究生项目的一部分。该项目中的数据由贝塔斯曼子公司ArvatoFinancialSolutions提供。项目分为三个主要步骤:CustomerSegmentationReport,SupervisedLearningModelandKaggleCompetition:现有客户细分报告:采用EDA,PCA和聚类分析方法分析整体和客户群体,以便能够描述公司核心客户群。新客户的预测报告(监督学习):使用您在第一步中观察到的内容来创建一个监督学习模型,该模型可以预测一个人是否会响应电子邮件活动。Kaggle竞赛:在营销活动的人口统计数据集上预测新客户1.2。问题描述据ArvatoFinancialSolutions高级大客户经理TimeReis介绍,该项目要解决的根本业务问题是:如何使邮购公司更有效率1.3。指标根据问题的类型,我们将使用两种不同的指标:对于无监督学习模型,PCA和聚类将用于表征邮购公司的现有客户,并与德国人进行比较population,我们将采用的策略是ElbowRule。对于监督学习模型,需要预测营销活动的对象(第三个数据集MAILOUT),判断一个人是否会响应一个邮件营销活动,该数据集存在明显的类别不平衡问题(仅大约1.24%的人会响应该活动)。因此,我们使用ROC-AUC(接受者操作特征-曲线下面积)指标进行衡量。2.数据探索和数据整理该项目的数据由四个数据文件和两个特征定义文件组成:AZDIAS:德国的一般人口统计数据;891211人(行)x366特征(列)CUSTOMERS:邮购公司的客户人口统计;邮购公司客户的人口统计数据;191652人(行)x369特征(列)MAILOUT_TRAIN:营销活动目标的人口统计数据;42982人(行)x367特征(列)MAILOUT_TEST:活动对象的营销人口统计数据;42833人(行)x366个特征(列)2.1。加载和浏览数据创建数据集EDA对象:2.2。数据清洗每次做饭的第一步都是将碗碟洗干净,用沸水冲刷。获取到的数据首先需要进行清洗,排除异常值、空白值、无效值、重复值等。这项工作往往占据了整个数据分析过程的近一半步骤第一步:将未知数据转化为NaN第二步:删除行/缺失值较多的列上图显示,在Azdias数据集中,有154537行数据缺失率在0.25以上,行被删除。列缺失率阈值设置为0.37,如上图所示,Azdias/Customers中删除了70列。第三步:删除未定义的特征删除缺失信息和未定义的特征,共26个,同时从Customers数据集中删除三个专有列('CUSTOMER_GROUP'、'ONLINE_PURCHASE'和'PRODUCT_GROUP'),因为以后这些未定义和专有的特征在比较Azdias和Customers数据集时没有帮助。第四步:删除信息重复特征数据集中有很多信息重复的特征,如LP_FAMILIE_FEIN、LP_FAMILIE_GROB,都代表家族类型信息,LP_FAMILIE_FEIN代表细粒度信息,LP_FAMILIE_GROB代表粗粒度信息,两者只是信息粒度不同。上图中同一行的两个特征含义相同。左边后缀为_GROB的特征表示粗粒度信息,_FEIN表示细粒度特征。我决定删除这几个信息重复特征,'ALTERSKATEGORIE_FEIN'、'LP_FAMILIE_GROB'、'LP_LEBENSPHASE_FEIN'、'LP_STATUS_GROB'、'CAMEO_DEU_2015'。因为有些没有定义,或者选择对应的_GROB特征就可以了。第五步:特征重编码需要重编码的特征有很多,比如OST_WEST_KZ特征的两个值是字符O,W。由于要使用的无监督学习技术是只适用于数字编码的数据,我们需要重新编码它重新编码。还有一些特征是混合类型分类特征,需要拆分成多个单类型特征。混合特征LP_LEBENSPHASE_GROB-lifestagerough。分为三个新特征,包括年龄、家庭和收入(LP_LEBENSPHASE_GROB_SPLIT_FAMILY、LP_LEBENSPHASE_GROB_SPLIT_AGE、LP_LEBENSPHASE_GROB_SPLIT_INCOME)。第六步:异常值处理上图左边的散点图中,特征GEBURTSJAHR(出生年份)中有很多零值,出生日期为0,显然不合理,需要转化为南。右边是处理后的结果。处理ARBEIT、ALTERSKATEGORIE_GROB、KOMBIALTER特征中的异常值。总结一下数据清洗过程,我主要做了以下操作:?将未知数据恢复为NaN,并删除缺失率高的行和列?清理重复信息的特征?特征重新编码和拆分混合特征?使用归一化特征缩放并用中值填充缺失值。数据清洗是一个迭代的过程,也是最耗时的过程。在这个项目中,数据清洗过程占用了总时间的80%以上。3.客户细分报告在这一节中,我将使用无监督学习技术来表征邮购公司现有客户与德国总人口的人口统计数据之间的关系,并找出总人口中哪一类人更多很可能是新客户的邮购公司。接下来,我将使用两种常用的无监督机器学习方法,降维和聚类来进行客户细分。3.1.数据对比Customersvs.Azdias消费者邮购活动的相关特征(以D19_开头)是唯一包含消费者邮购活动数据的数据。上图中D19_SOZIALES的值为1明显高于Customers中Azdias的值,虽然特征字典没有给出D19_SOZIALES的定义。但是可以猜测它代表的是一种商品,值为1表示在过去的一年里有过多次购买(Multibuyer0-12个月)。Customers中D19_SOZIALES的值为1明显高于Azdias,虽然特征字典没有给出D19_SOZIALES的定义。但是可以猜测它代表的是一种商品,值为1表示在过去的一年里有过多次购买(Multibuyer0-12个月)。D19_KONSUMTYP_MAX的值2明显高于Azdias,8和9明显低于Azdias。但是字典并没有给出D19_KONSUMTYP_MAX的定义。CAMEO_类特征比较:3.2。主成分分析(PCA)降维是将大量特征压缩为(通常)较小的特征集。主成分分析(PCA)是一种数据转换技术,它允许您通过删除次要信息并仅保留主要特征来保留数据中的主要信息。我将在scikit-learn中使用PCA来降低数据集的维度。最终我选择保留200个主成分,其累积方差为0.97%,已经能够保留数据中的主要信息。3.3.K-Means聚类聚类是根据相似性对数据进行分组。在选择主成分后,我们希望通过聚合这些主成分来帮助细分客户。我正在使用scikit-learn的K-Means对主成分进行聚类。根据肘部规则,我选择的聚类数为10。聚类比较Customers与Azdias表明,对于聚类2、0和1,Customers明显高于Azdias。表示这里有一定的人群对公司的产品感兴趣。聚类2、0、1中的重要特征(Top/Tail5)如下:4.监督学习模型和Kaggle竞赛现在开始构建预测模型,“MAILOUT”数据文件的每一行代表一个潜在客户一个邮购活动,我们会用MAILOUT_TRAIN数据集来训练这个模型,然后在MAILOUT_TEST数据集上做预测,来决定他是否应该作为活动的营销对象。浏览训练数据集(MAILOUT),我发现这个训练数据集存在高类别不平衡问题,即在42962人中,只有532人响应了邮件活动。正例的数量远小于负例的数量。因此在训练模型时,会使用sklearn库的分层k折交叉验证工具“StratifiedKFold”对训练数据和验证数据进行拆分,以保证有限的正数据得到充分利用。同时,在创建模型实例时,设置参数class_weight='balanced',为正类分配更高的权重。我们要解决的基本业务问题是:邮购公司如何更有效地获取新客户?为了解决这个问题我们需要一些工具,这些工具是各种模型。有很多模型可供选择,例如线性或逻辑回归、BaggingClassifier和决策树。我使用LGBMClassifier并使用10折分层交叉验证方法和使用hyperopt的参数优化。4.1.模型训练结果的前15个主要特征:4.2。Kaggle比赛我把结果提交给Kaggle后,roc_auc_score(ReceiverOperatingCharacteristicCurve)分数是0.76682。5.总结在这篇博客中,我介绍了一个实际生产的机器学习项目,这是优达学城数据科学家纳米学位的研究生项目,数据由贝塔斯曼旗下的ArvatoFinancialSolutions提供。在这个项目中,我们做了以下工作:?探索德国的一般人口统计数据和邮购公司客户的人口统计数据集?清理数据,包括排除异常值、空白值、无效值、重复项等。?通过数据比较可视化和无监督学习技术,即PCA和KMeans,对群体进行细分(分为不同的集群)并为公司推荐潜在客户利用监督学习来预测公司的新客户分析监督学习模型中的重要特征数据探索/清理、模型训练和结果分析是一个迭代过程。例如根据lightgbm.LGBMClassifier官方文档的建议,在分类任务中使用predict_proba方法计算某个类别的概率时,对于class_weight参数“注意,使用所有这些参数会导致低估probabilityofindividualcategories”,建议先做一个模型ProbabilityCorrection(https://scikit-learn.org/stab...)。最后,我要感谢Udacity、ArvatoBertelsmann和合作公司为我提供如此出色的数据集,让我学习和实践我的机器学习和数据科学技能。感谢您的宝贵时间,希望您喜欢这个博客。