如何在 Spark MLlib 中进行回归分析,以确定电信行业的客户流失率?

Posted

技术标签:

【中文标题】如何在 Spark MLlib 中进行回归分析,以确定电信行业的客户流失率?【英文标题】:How to perform regression analysis in Spark MLlib for churn determination in telecom industry? 【发布时间】:2015-10-30 00:06:01 【问题描述】:

我正在使用decision tree(supervised learning) 在电信行业进行churn 预测(客户是否转移到另一家公司)。我有一个具有以下结构的数据集(csv 数据):

number vmail messages,total call minutes,total number of calls,total call charge,number of customer service calls,churn

最后一列 (churn) 是 truefalse 值列,用作标签。在测试期间,我想预测该列的值(真假或 0-1)。我的疑问是如何使用Spark MLlibsdecision tree 算法训练数据?我正在查看documentation 中给出的regression example,我无法理解他们在培训阶段在哪里提供labels。示例有:

val categoricalFeaturesInfo = Map[Int, Int]()
val impurity = "variance"
val maxDepth = 5
val maxBins = 32

val model = DecisionTree.trainRegressor(trainingData, categoricalFeaturesInfo, impurity,
  maxDepth, maxBins) 

既然是监督学习,我们不应该在训练模型时也提供标签吗?

如何通过提供labels 来根据我的数据训练我的模型,然后进行测试以预测测试数据的labels

【问题讨论】:

【参考方案1】:

好吧,因为您正在尝试做的是监督学习,尤其是分类问题。 DecisionTree 期望的输入是 LabeledPoint。 LabeledPoint 基本上是说明哪个是您的目标变量(标签)和您的特征向量的结构:

https://spark.apache.org/docs/1.4.1/api/scala/#org.apache.spark.mllib.regression.LabeledPoint

因此,您可以将其用作输入,如果您想要训练和测试,也可以拆分 LabeledPoint,或者为 cv 或任何需要的东西循环。

重要的是在训练之前将你的真/假案例映射为 1/0,并且:

val categoricalFeaturesInfo = Map[Int, Int]()

用于告诉模型你的哪些特征是分类的,例如假设特征 1 和 2 只是分类的,那么你应该写成:

val categoricalFeaturesInfo = Map[Int, Int]((1,2),(2,4))

这是说特征 1 是分类的,有 2 个级别,特征 2 是分类的,有 4 个级别。这里的索引从 0 开始!!而且您应该将之前的所有分类特征映射到 0,1,2,3...numberLevels 之类的东西。

LabeledPoint 示例,基本上是您映射数据,这个假设您的值为 Double,您选择 1 作为 LabeledPoint,选择 2,3 作为特征。

val data = dataInput.rdd.map(x => LabeledPoint(x.getDouble(1),Vectors.dense(x.getDouble(2), x.getDouble(3)))

我希望这会有所帮助。

【讨论】:

因此,就我而言,我的所有特征(除流失列之外的所有列)都不是分类的。流失具有真/假(或 0/1)值,但它是用于标签目的。那么,对我来说,categoricalFeaturesInfo 应该是什么?此外,在 Spark 文档中给出的示例中,它们在哪里形成带有标签和特征向量的 LabeledPoint 如果你没有分类,那么在第一种情况下使用空括号 Map[Int, Int]()。你想要一个 LabeledPoint 的例子,我在上面编辑它 您能否提供我如何使用 python 将从 csv 文件中读取的特定列的真/假值映射到 Spark 中的 0/1? 您提供的代码(LabledPoint 示例)似乎也适用于 Scala。您如何在 python 中做到这一点?【参考方案2】:

不确定您在阅读后对 csv 数据所做的转换,但您应该执行类似的操作,以便将其转换为 @DrVComas 所指出的 LabeledPoint

from pyspark.mllib.regression import LabeledPoint

def parseCsvLine(line):
    fl = line.split(',')
    l = len(fl)
    return LabeledPoint(fl[l-1], fl[0:l-1])

然后你传递给决策树的训练数据应该像这样映射,

trainingData = rawData.map(parseCsvLine)

希望对你有帮助。

【讨论】:

以上是关于如何在 Spark MLlib 中进行回归分析,以确定电信行业的客户流失率?的主要内容,如果未能解决你的问题,请参考以下文章

为啥朴素贝叶斯不能像逻辑回归一样在 Spark MLlib 管道中工作?

Apache Spark MLlib:如何从 PMML 导入模型

十spark MLlib的scala示例

Spark MLlib中分类和回归算法

机器学习讲座,如何利用Spark MLlib进行个性推荐?

apache spark mllib中的逻辑回归 - mnist