Skip to main content
 首页 » 编程设计

python之Apache Spark MulticlassMetrics.precision() 中的 "Value at index 1 in null"

2024年10月24日32webabcd

我在 Apache spark (pyspark) 中训练了一个逻辑回归模型,并用它来评估一些测试数据......就像这样......

# Split into train and test sets 
 
train, test = data.randomSplit([.8, .2], seed=1337) 
 
# Train a model 
 
model = LogisticRegressionWithLBFGS.train(train) 
 
# Print the coefficients 
 
print(model.weights) 
 
# Evaluate the test data 
 
predictions = test.map(lambda p: (p.label, model.predict(p.features))) 
print(predictions.take(100)) 
 
# Calculate and print precision and recall 
 
metrics = MulticlassMetrics(predictions) 
print("Prediction: %s" % metrics.precision(1)) 

我的模型系数打印良好,打印预测时我得到了合理的输出:

[(0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (1.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (1.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (1.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (1.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (1.0, 0), (1.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (1.0, 0), (0.0, 0), (0.0, 0), (0.0, 0), (0.0, 0)] 

不幸的是,当我调用 metrics.precision(1) 时,我得到了大量的堆栈跟踪。主要错误似乎是“索引 1 处的值为 null”,我不太确定为什么会这样。

顺便说一下,如果我尝试使用 BinaryClassificationMetrics 和 areaUnderPR...

完整的堆栈跟踪如下。

16/03/17 15:00:43 ERROR Executor: Exception in task 5.0 in stage 135.0 (TID 7806) 
java.lang.NullPointerException: Value at index 1 in null 
    at org.apache.spark.sql.Row$class.getAnyValAs(Row.scala:475) 
    at org.apache.spark.sql.Row$class.getDouble(Row.scala:243) 
    at org.apache.spark.sql.catalyst.expressions.GenericRow.getDouble(rows.scala:192) 
    at org.apache.spark.mllib.evaluation.MulticlassMetrics$$anonfun$$init$$1.apply(MulticlassMetrics.scala:41) 
    at org.apache.spark.mllib.evaluation.MulticlassMetrics$$anonfun$$init$$1.apply(MulticlassMetrics.scala:41) 
    at scala.collection.Iterator$$anon$11.next(Iterator.scala:328) 
    at scala.collection.Iterator$$anon$11.next(Iterator.scala:328) 
    at org.apache.spark.util.collection.ExternalSorter.insertAll(ExternalSorter.scala:191) 
    at org.apache.spark.shuffle.sort.SortShuffleWriter.write(SortShuffleWriter.scala:64) 
    at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:73) 
    at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:41) 
    at org.apache.spark.scheduler.Task.run(Task.scala:89) 
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:213) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:745) 
16/03/17 15:00:43 WARN TaskSetManager: Lost task 5.0 in stage 135.0 (TID 7806, localhost): java.lang.NullPointerException: Value at index 1 in null 
    at org.apache.spark.sql.Row$class.getAnyValAs(Row.scala:475) 
    at org.apache.spark.sql.Row$class.getDouble(Row.scala:243) 
    at org.apache.spark.sql.catalyst.expressions.GenericRow.getDouble(rows.scala:192) 
    at org.apache.spark.mllib.evaluation.MulticlassMetrics$$anonfun$$init$$1.apply(MulticlassMetrics.scala:41) 
    at org.apache.spark.mllib.evaluation.MulticlassMetrics$$anonfun$$init$$1.apply(MulticlassMetrics.scala:41) 
    at scala.collection.Iterator$$anon$11.next(Iterator.scala:328) 
    at scala.collection.Iterator$$anon$11.next(Iterator.scala:328) 
    at org.apache.spark.util.collection.ExternalSorter.insertAll(ExternalSorter.scala:191) 
    at org.apache.spark.shuffle.sort.SortShuffleWriter.write(SortShuffleWriter.scala:64) 
    at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:73) 
    at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:41) 
    at org.apache.spark.scheduler.Task.run(Task.scala:89) 
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:213) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:745) 
 
16/03/17 15:00:43 ERROR TaskSetManager: Task 5 in stage 135.0 failed 1 times; aborting job 
16/03/17 15:00:43 WARN PythonRunner: Incomplete task interrupted: Attempting to kill Python Worker 
16/03/17 15:00:43 WARN TaskSetManager: Lost task 6.0 in stage 135.0 (TID 7807, localhost): TaskKilled (killed intentionally) 
Traceback (most recent call last): 
  File "/home/osboxes/PycharmProjects/Spark_Test/spark_test.py", line 96, in <module> 
    print("Prediction: %s" % metrics.precision(1)) 
  File "/srv/spark/python/lib/pyspark.zip/pyspark/mllib/evaluation.py", line 238, in precision 
  File "/srv/spark/python/lib/pyspark.zip/pyspark/mllib/common.py", line 146, in call 
  File "/srv/spark/python/lib/pyspark.zip/pyspark/mllib/common.py", line 123, in callJavaFunc 
  File "/srv/spark/python/lib/py4j-0.9-src.zip/py4j/java_gateway.py", line 813, in __call__ 
  File "/srv/spark/python/lib/pyspark.zip/pyspark/sql/utils.py", line 45, in deco 
  File "/srv/spark/python/lib/py4j-0.9-src.zip/py4j/protocol.py", line 308, in get_return_value 
py4j.protocol.Py4JJavaError: An error occurred while calling o137.precision. 
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 5 in stage 135.0 failed 1 times, most recent failure: Lost task 5.0 in stage 135.0 (TID 7806, localhost): java.lang.NullPointerException: Value at index 1 in null 
    at org.apache.spark.sql.Row$class.getAnyValAs(Row.scala:475) 
    at org.apache.spark.sql.Row$class.getDouble(Row.scala:243) 
    at org.apache.spark.sql.catalyst.expressions.GenericRow.getDouble(rows.scala:192) 
    at org.apache.spark.mllib.evaluation.MulticlassMetrics$$anonfun$$init$$1.apply(MulticlassMetrics.scala:41) 
    at org.apache.spark.mllib.evaluation.MulticlassMetrics$$anonfun$$init$$1.apply(MulticlassMetrics.scala:41) 
    at scala.collection.Iterator$$anon$11.next(Iterator.scala:328) 
    at scala.collection.Iterator$$anon$11.next(Iterator.scala:328) 
    at org.apache.spark.util.collection.ExternalSorter.insertAll(ExternalSorter.scala:191) 
    at org.apache.spark.shuffle.sort.SortShuffleWriter.write(SortShuffleWriter.scala:64) 
    at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:73) 
    at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:41) 
    at org.apache.spark.scheduler.Task.run(Task.scala:89) 
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:213) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:745) 
 
Driver stacktrace: 
    at org.apache.spark.scheduler.DAGScheduler.org$apache$spark$scheduler$DAGScheduler$$failJobAndIndependentStages(DAGScheduler.scala:1431) 
    at org.apache.spark.scheduler.DAGScheduler$$anonfun$abortStage$1.apply(DAGScheduler.scala:1419) 
    at org.apache.spark.scheduler.DAGScheduler$$anonfun$abortStage$1.apply(DAGScheduler.scala:1418) 
    at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59) 
    at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:47) 
    at org.apache.spark.scheduler.DAGScheduler.abortStage(DAGScheduler.scala:1418) 
    at org.apache.spark.scheduler.DAGScheduler$$anonfun$handleTaskSetFailed$1.apply(DAGScheduler.scala:799) 
    at org.apache.spark.scheduler.DAGScheduler$$anonfun$handleTaskSetFailed$1.apply(DAGScheduler.scala:799) 
    at scala.Option.foreach(Option.scala:236) 
    at org.apache.spark.scheduler.DAGScheduler.handleTaskSetFailed(DAGScheduler.scala:799) 
    at org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.doOnReceive(DAGScheduler.scala:1640) 
    at org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.onReceive(DAGScheduler.scala:1599) 
    at org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.onReceive(DAGScheduler.scala:1588) 
    at org.apache.spark.util.EventLoop$$anon$1.run(EventLoop.scala:48) 
    at org.apache.spark.scheduler.DAGScheduler.runJob(DAGScheduler.scala:620) 
    at org.apache.spark.SparkContext.runJob(SparkContext.scala:1832) 
    at org.apache.spark.SparkContext.runJob(SparkContext.scala:1845) 
    at org.apache.spark.SparkContext.runJob(SparkContext.scala:1858) 
    at org.apache.spark.SparkContext.runJob(SparkContext.scala:1929) 
    at org.apache.spark.rdd.RDD$$anonfun$collect$1.apply(RDD.scala:927) 
    at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:150) 
    at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:111) 
    at org.apache.spark.rdd.RDD.withScope(RDD.scala:316) 
    at org.apache.spark.rdd.RDD.collect(RDD.scala:926) 
    at org.apache.spark.rdd.PairRDDFunctions$$anonfun$collectAsMap$1.apply(PairRDDFunctions.scala:741) 
    at org.apache.spark.rdd.PairRDDFunctions$$anonfun$collectAsMap$1.apply(PairRDDFunctions.scala:740) 
    at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:150) 
    at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:111) 
    at org.apache.spark.rdd.RDD.withScope(RDD.scala:316) 
    at org.apache.spark.rdd.PairRDDFunctions.collectAsMap(PairRDDFunctions.scala:740) 
    at org.apache.spark.mllib.evaluation.MulticlassMetrics.tpByClass$lzycompute(MulticlassMetrics.scala:49) 
    at org.apache.spark.mllib.evaluation.MulticlassMetrics.tpByClass(MulticlassMetrics.scala:45) 
    at org.apache.spark.mllib.evaluation.MulticlassMetrics.precision(MulticlassMetrics.scala:106) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:231) 
    at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:381) 
    at py4j.Gateway.invoke(Gateway.java:259) 
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:133) 
    at py4j.commands.CallCommand.execute(CallCommand.java:79) 
    at py4j.GatewayConnection.run(GatewayConnection.java:209) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: java.lang.NullPointerException: Value at index 1 in null 
    at org.apache.spark.sql.Row$class.getAnyValAs(Row.scala:475) 
    at org.apache.spark.sql.Row$class.getDouble(Row.scala:243) 
    at org.apache.spark.sql.catalyst.expressions.GenericRow.getDouble(rows.scala:192) 
    at org.apache.spark.mllib.evaluation.MulticlassMetrics$$anonfun$$init$$1.apply(MulticlassMetrics.scala:41) 
    at org.apache.spark.mllib.evaluation.MulticlassMetrics$$anonfun$$init$$1.apply(MulticlassMetrics.scala:41) 
    at scala.collection.Iterator$$anon$11.next(Iterator.scala:328) 
    at scala.collection.Iterator$$anon$11.next(Iterator.scala:328) 
    at org.apache.spark.util.collection.ExternalSorter.insertAll(ExternalSorter.scala:191) 
    at org.apache.spark.shuffle.sort.SortShuffleWriter.write(SortShuffleWriter.scala:64) 
    at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:73) 
    at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:41) 
    at org.apache.spark.scheduler.Task.run(Task.scala:89) 
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:213) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    ... 1 more 

请您参考如下方法:

我刚遇到同样的问题。问题是您的标签的 type - 您的标签是 int 而它们应该是 double。

我重现/遇到了同样的错误:

scoreAndLabels = sc.parallelize([(1,1),(0,0),(1,0),(0,1)]) 

并通过替换修复它:

scoreAndLabels = sc.parallelize([(1.,1.),(0.,0.),(1.,0.),(0.,1.)])