在 Spark 和 Python 中使用决策树算法进行分析的问题
issue in analysis using decision tree algorithm in Spark and Python
我正在对电信行业进行 churn
分析,我有一个示例数据集。我在下面写了这段代码,我在 Spark
到 python
中使用 decision tree
算法。在数据集中,我有多个列,我正在 selecting 我的 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 列),到目前为止我还没有 selecting 因为它不是模型中要考虑的特征。对于详细信息在 testdata
中的客户,我很难将此 customerid
列与 testdata
相关联。如果我在 LabeledPoint
中形成的 feature
向量中的数据集中添加此 select 这一列,那么这将导致错误,因为它不是特征值。
如何在我的分析中添加此列,以便我可以得到具有较高流失价值的前 50 名客户?
您可以按照与预测后添加标签完全相同的方式进行操作。
小帮手:
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])
我正在对电信行业进行 churn
分析,我有一个示例数据集。我在下面写了这段代码,我在 Spark
到 python
中使用 decision tree
算法。在数据集中,我有多个列,我正在 selecting 我的 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 列),到目前为止我还没有 selecting 因为它不是模型中要考虑的特征。对于详细信息在 testdata
中的客户,我很难将此 customerid
列与 testdata
相关联。如果我在 LabeledPoint
中形成的 feature
向量中的数据集中添加此 select 这一列,那么这将导致错误,因为它不是特征值。
如何在我的分析中添加此列,以便我可以得到具有较高流失价值的前 50 名客户?
您可以按照与预测后添加标签完全相同的方式进行操作。
小帮手:
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])