如何在 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
) 是 true
或 false
值列,用作标签。在测试期间,我想预测该列的值(真假或 0-1)。我的疑问是如何使用Spark MLlibs
decision 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 管道中工作?