在 Spark 和 Python 中使用决策树算法进行分析的问题

Posted

技术标签:

【中文标题】在 Spark 和 Python 中使用决策树算法进行分析的问题【英文标题】:issue in analysis using decision tree algorithm in Spark and Python 【发布时间】:2015-11-05 12:55:46 【问题描述】:

我正在为电信行业进行churn 分析,并且我有一个示例数据集。我在下面写了这段代码,我在Sparkpython 中使用decision tree 算法。在数据集中,我有多个列,我正在为我的feature 集选择我需要的列。

from pyspark.mllib.regression import LabeledPoint
from pyspark.mllib.tree import DecisionTree, DecisionTreeModel
from pyspark.mllib.util import MLUtils
import os.path
import numpy as np


inputPath = os.path.join('file1.csv')
file_name = os.path.join(inputPath)
data = sc.textFile(file_name).zipWithIndex().filter(lambda (line,rownum): rownum>0).map(lambda (line, rownum): line)


final_data = data.map(lambda line: line.split(",")).filter(lambda line: len(line)>1).map(lambda line:LabeledPoint(1 if line[5] == 'True' else 0,[line[6],line[7]]))

(trainingdata, testdata) = final_data.randomSplit([0.7, 0.3])

model = DecisionTree.trainRegressor(trainingdata, categoricalFeaturesInfo=,
                                    impurity='variance', maxDepth=5, maxBins=32)

predictions = model.predict(testdata.map(lambda x: x.features))
prediction= predictions.collect()

labelsAndPredictions = testData.map(lambda lp: lp.label).zip(predictions)

现在这段代码可以正常工作并进行预测,但我缺少的是prediction 集合或testdata 中每个客户的标识符。在我的数据集中有一列customerid(第 4 列),到目前为止,我没有选择它,因为它不是模型中要考虑的特征。对于详细信息在testdata 中的客户,我很难将此customerid 列与testdata 关联起来。如果我在LabeledPoint 中形成的feature 向量中的数据集中添加此列,则这将导致错误,因为它不是特征值。

如何在我的分析中添加此列,以便获得流失价值较高的前 50 名客户?

【问题讨论】:

@zero323 你能帮我说说我是怎么做到的吗? 【参考方案1】:

您可以按照与预测后添加标签完全相同的方式进行操作。

小帮手:

customerIndex = ... # Put index of the column

def extract(line):
    """Given a line create a tuple (customerId, labeledPoint)"""
    label = 1 if line[5] == 'True' else 0
    point =  LabeledPoint(label, [line[6], line[7]])
    customerId = line[customerIndex]
    return (customerId, point)

使用extract函数准备日期:

final_data = (data
    .map(lambda line: line.split(","))
    .filter(lambda line: len(line) >1 )
    .map(extract)) # Map to tuples

火车:

# As before
(trainingdata, testdata) = final_data.randomSplit([0.7, 0.3])

# Use only points, put the rest of the arguments in place of ...
model = DecisionTree.trainRegressor(trainingdata.map(lambda x: x[1]), ...)

预测:

# Make predictions using points
predictions = model.predict(testdata.map(lambda x: x[1].features))

# Add customer id and label
labelsIdsAndPredictions = (testData
    .map(lambda x: (x[0], x[1].label))
    .zip(predictions))

提取前 50 名:

top50 = labelsIdsAndPredictions.top(50, key=lambda x: x[1])

【讨论】:

以上是关于在 Spark 和 Python 中使用决策树算法进行分析的问题的主要内容,如果未能解决你的问题,请参考以下文章

无效的语法错误:使用 Python 和 Spark 构建决策树、流失预测

梯度迭代树(GBDT)算法原理及Spark MLlib调用实例(Scala/Java/python)

Spark机器学习:决策树算法

4.Spark ML学习笔记—Spark ML决策树 (应用案例)随机森林GBDT算法ML 树模型参数详解 (本篇概念多)

spark 随机森林算法案例实战

Spark DecisionTreeClassifier