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

时间:2015-08-06 17:53:09

标签: python apache-spark machine-learning decision-tree apache-spark-mllib

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

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

在此处,最后一列(churn)是truefalse值列,并用作标签。在测试期间,我想预测此列的值(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

2 个答案:

答案 0 :(得分: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)))

我希望这会有所帮助。

答案 1 :(得分:0)

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

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)

希望它有所帮助。