apache-spark - 朴素贝叶斯 pyspark 1.3 无响应

标签 apache-spark pyspark apache-spark-mllib naivebayes

我正在尝试为 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.256043956044,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 似乎永远停留在计算变量模型上。以前还有其他人遇到过这个问题吗?谢谢。

最佳答案

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

您的数据如下所示:

[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")

这假设您拥有的原始文件采用以下形式:

标签,X1,X2,X3,X4

关于apache-spark - 朴素贝叶斯 pyspark 1.3 无响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32018658/

相关文章:

apache-spark - Spark 提交错误 :Name or service not known

java - 在 apache Spark 中使用朴素贝叶斯进行 Twitter 情绪分析

scala - Elasticsearch-Hadoop 库无法连接到 docker 容器

python - 如何将 spark 数据帧保存到 HDFS 上的 csv?

arrays - Spark - 从嵌套数组的结构中选择列时出错

python - 通过过滤对 Pyspark Dataframe 进行分组

python - 高斯混合模型 : Difference between Spark MLlib and scikit-learn

java - 如何找到哪个 Java/Scala 线程锁定了一个文件?

scala - BucketedRandomProjectionLSH 的性能 (org.apache.spark.ml.feature.BucketedRandomProjectionLSH)

pyspark - 将参数传递给 pyspark udf