朴素贝叶斯 pyspark 1.3 无响应
Posted
技术标签:
【中文标题】朴素贝叶斯 pyspark 1.3 无响应【英文标题】:naive bayes pyspark 1.3 no response 【发布时间】:2015-11-08 05:12:44 【问题描述】:我正在尝试在 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.451866666666666666666666666666666666667,0.0.0.0.76666666666666666666666666,0.0.0.0.76666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666668666666666666666666666666684>>>>>>>>>>>>是否
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 似乎永远挂在计算变量模型上。以前有没有其他人遇到过这个问题?谢谢。
【问题讨论】:
【参考方案1】: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
【讨论】:
感谢您的解释!我能够在 Spark Scala shell 中看到不接受负值并运行此朴素贝叶斯代码的错误消息。有点奇怪,Python Spark 1.3 Shell 只是挂在这段代码上。以上是关于朴素贝叶斯 pyspark 1.3 无响应的主要内容,如果未能解决你的问题,请参考以下文章