我正在使用churn
(decision tree
)在电信行业进行supervised learning
预测(客户是否转移到其他公司)。我有一个具有以下结构的数据集(csv
数据):
number vmail messages,total call minutes,total number of calls,total call charge,number of customer service calls,churn
在此处,最后一列(churn
)是true
或false
值列,并用作标签。在测试期间,我想预测此列的值(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
?
答案 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)
希望它有所帮助。