找工作并不容易,你需要让自己与众不同。仅仅证明你知道如何使用scikit-learn或ggplot2这类给定的工具是不够的。
所以问题在于,你能做什么?
我最喜欢的策略之一是展示业务影响。那么“业务影响”是什么意思?
在一天结束时,您将直接或间接地处理面向业务端的事情。可能是降低成本,增加收入,改善客户体验等方面。
在这篇文章中,我将向您展示如何逐步构建一个展示重大业务影响的客户流失预测模型。
提纲
商业背景
Logistic回归
数据准备
拟合模型
做出预测
商业影响
商业背景
在任何现实世界的数据科学项目的开始,都需要先提出一系列问题。以下是一些很好的开头:
你想解决的问题是什么?
你的潜在解决方案是什么?
您将如何评估您的模型?
我们继续使用之前客户流失这个例子。假设您在电信行业工作。有一天,你的老板问你:“我们如何利用现有数据改进业务?”
让我们详细回答一下刚才举的几个问题,以便找出解决老板问题的策略方法。
你想解决的问题是什么?
在查看现有数据后,您发现获得新客户的成本比保留现有客户高出五倍。
现在,问题聚焦为“我们如何提高客户保留率以降低成本?”
你的潜在解决方案是什么?
由于我们可以访问现有客户数据,因此我们可以尝试构建机器学习模型来预测客户流失。
为了避免过于复杂化太抽象而无法像管理层解释,我们将使用逻辑回归模型。
您将如何评估您的模型?
我们将使用一系列机器学习评估指标(ROC,AUC,敏感性,特异性)以及面向业务的指标(成本节约)。
Logistic回归
现在我们已经熟悉了业务背景,确定了我们问题的范围,接下来我们看看潜在解决方案。
我们可以尝试使用的机器学习模型有很多。每种都有利有弊。为了简单起见,让我们坚持逻辑回归。
Logistic回归是一种线性分类器。由于我们试图预测“流失”或“没有流失”,因此分类模型正是我们所需要的。
逻辑回归是一个很好的模型,因为它比其他许多模型(如随机森林)更容易解释。我所说的“解释”是指可以更容易地看到特征与输出之间的关系。它的缺点是它偏向于线性拟合。如果决策边界不是线性的,那么它可能不如随机森林这类模型适合。
一般来说我们要为灵活性平衡可解释性。在实现机器学习模型时,这始终是一个要考虑的因素。
准备数据
接下来需要准备数据。
这一步工作流程因项目而异,本案例中将使用以下流程:
导入数据
快速浏览
清理数据
拆分数据
我的工作流程中完全没有提到探索阶段。在以后的文章中,我将讨论这个方面,因为我认为它与建模阶段同样重要,甚至更重要。
01
导入数据
让我们从导入数据开始吧。你可以前往我们的github页面获取副本(Github地址请见本文末)。
我们将利用Tidyverse库。这个库是使用R的数据科学家必备库(请务必查看他们的文档)。
我通常会在开始时设置我的工作目录的路径。别忘了将path_loc变量修改为你的代码和数据集所在的工作目录。
由于这是一个csv文件,我使用read_csv函数将数据读入名为df的DataFrame。
02
快速浏览
导入数据后,需要“快速浏览”一遍,而不是探索数据。
首先我从查看特征列的维度和名称开始。
我们可以看到共有21个特征和7,043行。有各种不同的特征,如TotalCharges和tenure。我们要尝试和预测的输出是“流失”。
另一个很棒的函数是glimpse。可以让我们更快查看特征的细节。
03
清洗数据
在我们开始使用逻辑回归模型之前,我们需要做一些小的清理。
首先将字符变量转换为因子。
在这段代码中,我们使用dplyr包的mutate_if函数将字符变量更改为因子类型。
%>%被称为管道操作员。它来自magrittr库,也是Tidyverse的一部分。该运算符的基本思想是使代码更具可读性。
让我们再将SeniorCitizen变量从整数更改为因子。
接下来,我们将检查缺失值。我们可以使用purrr库中的map函数执行此操作,这个库也是Tidyverse的一部分。
我们可以看到TotalCharges有11个缺失值。要替换这些缺失值,我们只需用中位数进行简单替换即可。
我们要做的最后一件事是删除CustomerID,这是每个客户的唯一标识符,因此可能不会向我们的模型添加任何有用的信息。
如果您想对此进行测试,您可以保留此特征并查看比较结果。
04
拆分数据
为了确保我们不会过度拟合我们的模型,我们会将数据分成训练集和测试集。这称为交叉验证。
我们将在训练集上训练模型,然后在测试集上测试其性能。随机选择75%的数据作为我们的训练集,余下25%作为我们的测试集。我鼓励你尝试不同的拆分,看看结果有何区别(比如训练集和测试集的比例为80%/ 20%、60%/ 40%)。
要进行拆分,我们将使用Caret包。首先导入Caret并设置 seed,以便我们的结果可以复现。
接下来,我们将使用createDataPartition函数选择75%的数据用于训练集。这个函数将选择出75%作为随机样本。
最后,我们将使用上面的行样本创建我们的训练和测试dataframe。
还有其他方法,如 k-fold 交叉验证,所以一定要仔细阅读。
想了解在Caret中实现 k-fold 交叉验证的信息,请在R控制台输入help(“createFolds”)
拟合模型
现在我们已经将数据拆分为训练和测试集,该是拟合模型的时候了。
为了实现逻辑回归模型,我们将使用广义线性模型(GLM)函数glm。
有不同类型的GLM,其中包括逻辑回归。要指定我们希望执行的是二进制逻辑回归,我们将使用该参数。family=binomial。
以下是逻辑回归模型的完整代码:
在下一节中,我们将进行预测并评估我们的模型。
做出预测
现在我们已经适应了我们的模型,是时候看看它的表现了。
为此,我们将使用test数据集进行预测。我们从上一节传入fit。预测我们指定type=”response”的概率。
我们想要将这些概率转换为二元响应,因为Churn变量我们预测为“是”或“否”。
我不确定R是如何编写响应的,但我可以使用
从结果里我们可以看到Yes被编码为1。
现在我们知道了响应的编码,我们可以将我们的预测结果转换为Yes和No。
我们将响应阈值设置为0.5,因此如果预测概率高于0.5,我们会将此响应转换为Yes。
最后一步是将特征响应转换为因子类型。使编码对逻辑回归模型来说是正确的。
我们稍后会仔细研究这个阈值,所以不要担心为什么设置为0.5。目前,我们只是在示例中使用而已。
进行预测的一个重要部分是评估和验证模型。
让我们先详细了解一些评估指标,最后采用更严格的模型验证方法,k-fold 交叉验证。
GitHub地址:
https://github.com/dataoptimal/posts/tree/master/business%20impact%20project
本文图片来自原文与原文中代码
领取专属 10元无门槛券
私享最新 技术干货