2015-08-14 23 views
2

我试图在PySpark运行我的数据朴素贝叶斯分类器1.3朴素贝叶斯pyspark 1.3没有反应

这里是我的数据样本:

使用文本文件,我将它转换成一个LabeledPoint对象

67,[0,1,2,3,4,5,6,8,9,10,11,12,13,14,15,16,17,18,19,20, 21,22,23,24,25,26,27,28,29,30,31,32,3 ..... 60,66],[0.45,0.441666666667,0.475,0.0,0.717763157895,0.0,0.497300944669, 0.476608187135,0.0,0.0,0.45183714002,0.616666666667,0.966666666667,0.0790064102564,-0.364093614847,0.0679487179487,0.256043 956044,0.7,0.449583333333,0.231904697754,0.341666666667,0.06 ....,0.0]

data = MLUtils.loadLibSVMFile(sc, 'path to file') 

training, test = data.randomSplit([0.7, 0.3], seed=0) 

model = NaiveBayes.train(training, 1.0) 

predictionAndLabel = test.map(lambda p: (model.predict(p.features), p.label)) 

accuracy = (
    1.0 * predictionAndLabel.filter(lambda (x, v): x == v).count()/test.count() 
) 

PySpark似乎上计算变量模型永远挂起。其他人有没有遇到过这个问题?谢谢。

回答

2

Spark中的朴素贝叶斯算法要求没有特征(例如x值)为负数。您可以在LabeledPoints中看到-0.364093614847为负数。这应该是抛出一个错误。因此,请回顾一下您的原始数据,并找到一种方法将负面信息转换为正面信息。在下面的例子中,我的数据都在-1.0和1.0之间。我只给所有值加上1.0,以便分布/平均值/标准偏差都保持不变。

data看起来是这样的:

[LabeledPoint(1.0,(1,[0,1,2,3],[-0.5,0.5,0.0,0.8]))], 
[LabeledPoint(0.0,(1,[0,1,2,3],[0.1,0.5,0.5,-0.6]))], 
[LabeledPoint(1.0,(1,[0,1,2,3],[0.9,0.1,-0.2,0.7]))] 

的问题是Spark的数据结构基本上是不变的。因此,您需要回到数据尚未转换为LabeledPoint对象的时间(例如,当它仍然是文本时)。以下是关于如何读取文本文件(有一些缺失值)的示例代码,为每个功能添加一个,然后转换为LabeledPoint。请注意,这是一个csv,但如果您更改split中的内容,则可以将其更改为tsv或其他分隔符。

sc.textFile("/your/directory/your-file/*") \ 
    .map(lambda x: [unicode("") if x1=="nan" else x1 for x1 in x.split(',')[1:]])\ 
    .map(lambda x: x[0] + " " + " ".join([str(i+1)+":"+str(float(x1)+1) for i,x1 in enumerate(x[1:4]) if x1 != ''])) \ 
    .saveAsTextFile("/your/directory/new-directory/no-neg") 

这里假设你有原始文件的形式如下:

Label, X1, X2, X3, X4

+1

感谢这个解释!我能够看到Spark Scala shell中不接受负值并运行此朴素贝叶斯代码的错误消息。奇怪的是,Spark Spark 1.3 Shell只是挂在这段代码上。 –