2016-12-27 26 views
1

正如標題所示:我正在研究用於流失預測的決策樹模型。我是數據科學,python和spark的初學者。無效的語法錯誤:使用Python和Spark構建決策樹,Churn預測

結合講座和在線文檔中的所有例子,我設法提出了一個決策樹模型。唯一的問題是,錯誤計算funkction給我一個語法錯誤。

基本上,我使用的模型中的數據是這樣的:

[LabeledPoint(0.0, [1031.0,947.0,0.333333333333,10.9933333333,10.3,12.0,1.33333333333,10.0133333333,83.6666666667,5.86,55.69,0.596666666667,10.3333333333,0.666666666667,0.0,0.0,0.0,0.666666666667,23.3333333333,2.88333333333,25.0,0.666666666667,0.0,0.0,0.0,0.666666666667,135.333333333,4.44,0.06,0.333333333333,16.3333333333,0.98,0.333333333333,57.6666666667,3.46,0.333333333333,0.0,0.0,0.333333333333,14.0,0.0,0.0,0.0,0.0,0.0,0.0,1307.0,5.66666666667,22.0166666667,130.48,0.0,65.3333333333,0.0,287.333333333,34.0,113.666666667,0.0,0.0,0.0,1.0,1.0,0.0,1.0]), 
LabeledPoint(0.0, [4231.0,951.0,1.33333333333,27.5466666667,6.45,22.0,1.0,12.0133333333,46.3333333333,6.45,47.15,1.32333333333,8.81,1.33333333333,0.0,0.0,0.0,1.33333333333,31.6666666667,6.4,42.6566666667,1.33333333333,0.0,0.0,0.0,1.33333333333,0.666666666667,0.0,0.0,57.0,0.0,0.0,57.0,0.0,0.0,57.0,0.0,0.0,57.0,10.6666666667,0.0,0.0,0.0,0.0,0.0,0.0,1307.0,4.0,32.0266666667,156.966666667,0.0,145.43,0.0,1.66666666667,0.0,0.333333333333,0.0,0.0,0.0,1.0,1.0,0.0,1.0]), 
LabeledPoint(0.0, [5231.0,523.0,0.666666666667,14.62,1.1,1307.0,0.0,0.0,14.3333333333,1.1,7.57333333333,0.726666666667,4.84,0.666666666667,0.0,0.0,0.0,0.666666666667,8.33333333333,0.323333333333,2.15666666667,0.666666666667,0.0,0.0,0.0,0.666666666667,0.0,0.0,0.0,1307.0,0.0,0.0,1307.0,0.0,0.0,1307.0,0.0,0.0,1307.0,8.33333333333,0.0,0.0,0.0,0.0,0.0,0.0,1307.0,0.0,0.0,47.33,0.0,10.3566666667,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0]), 
LabeledPoint(0.0, [6031.0,741.0,7.0,5.38666666667,2.13,58.0,0.333333333333,4.0,21.3333333333,1.35333333333,11.2966666667,0.48,3.2,8.33333333333,0.666666666667,0.0,0.0,8.33333333333,11.3333333333,0.453333333333,3.03,8.33333333333,1.0,0.0133333333333,0.166666666667,8.33333333333,2.33333333333,0.776666666667,0.363333333333,23.0,1.33333333333,0.08,23.0,0.0,0.0,23.0,0.333333333333,0.03,23.0,9.33333333333,0.666666666667,1.33333333333,0.0,0.0,0.0,0.0,1307.0,1.33333333333,16.0,61.25,3.31666666667,10.94,3.65,11.3333333333,7.0,0.0,1.0,0.0,0.0,1.0,1.0,0.0,1.0]), 
LabeledPoint(0.0, [8831.0,840.0,5.33333333333,2.21,2.76,35.6666666667,0.666666666667,4.0,66.3333333333,2.76,17.7466666667,0.283333333333,1.20666666667,5.33333333333,0.0,0.0,0.0,5.33333333333,42.6666666667,2.43333333333,16.2166666667,5.33333333333,1.0,0.0,0.0,5.33333333333,1.0,0.0,0.0,23.0,0.0,0.0,23.0,0.666666666667,0.0,23.0,0.0,0.0,23.0,6.33333333333,0.0,1.33333333333,0.0,0.0,0.0,0.0,1307.0,1.66666666667,10.0,62.6333333333,0.0,56.7833333333,0.0,4.33333333333,0.666666666667,2.0,0.0,0.0,0.0,1.0,1.0,0.0,1.0])] 

然後我用星火文檔中的決策樹提供的代碼:

# Split the data into training and test sets (30% held out for testing) 
(trainingData, testData) = data.randomSplit([0.7, 0.3]) 

# Train a DecisionTree model. 
# Empty categoricalFeaturesInfo indicates all features are continuous. 
model = DecisionTree.trainClassifier(trainingData, numClasses=2, categoricalFeaturesInfo={}, 
           impurity='gini', maxDepth=5, maxBins=32) 

# Evaluate model on test instances and compute test error 
predictions = model.predict(testData.map(lambda x: x.features)) 
labelsAndPredictions = testData.map(lambda lp: lp.label).zip(predictions) 
testErr = labelsAndPredictions.filter(lambda (v, p): v != p).count()/float(testData.count()) 
print('Test Error = ' + str(testErr)) 
print('Learned classification tree model:') 
print(model.toDebugString()) 

而且

testErr = labelsAndPredictions.filter(lambda (v, p): v != p).count()/float(testData.count()) 

給我的錯誤:

File "<ipython-input-70-e37b435ea51d>", line 1 
testErr = labelsAndPredictions.filter(lambda (v, p): v != p).count()/float(testData.count()) 
              ^
SyntaxError: invalid syntax 

如果有人想看到整個代碼,我把它here in my Dropbox

我不知道,爲什麼它給了我這個錯誤。似乎這條線對其他人來說工作正常。所以我恐怕它可能與模型創建之前的步驟有關。

我真的很感謝你的幫忙!有多個參數時

+0

我沒有得到與'labelsAndPredictions = ...語法錯誤; testErr = ...'。 – TigerhawkT3

回答

4

lambda (v, p)僅適用於Python 2.7及更低版本的Python語法。您可能正在使用Python 3,其中tuple parameter packing is no longer allowed

相信3.X兼容的版本會是什麼樣子:

testErr = labelsAndPredictions.filter(lambda seq: seq[0] != seq[1]).count()/float(testData.count()) 
+0

是的,這是有效的,我很驚訝,它與我的技巧與數據無關..謝謝你和節日快樂! :) – Deramite

2

lambda表達式不需要圓括號,所以 lambda (v, p):應該lambda v, p:

lambda (x,y):是一個有效的語法只在Python 2.在Python 3這是一個SyntaxError

+0

'a = lambda(x,v):x * v print a((2,2))'Returns 4 – MYGz

+0

但無論如何,您已澄清了您的觀點。 '當有多個參數時' – MYGz

+1

@MYGz只在Python 2中。在Python 3中它是一個SyntaxError。 – DeepSpace