получение объекта StructField не имеет атрибута _get_object_id в BinaryClassificationMetrics - PullRequest
0 голосов
/ 07 мая 2020

Я пытался получить отчет о двоичной классификации на pyspark и столкнулся с этой ошибкой

StructField 'объект не имеет атрибута' _get_object_id '

Вот мой код

%%spark

from pyspark.mllib.evaluation import BinaryClassificationMetrics
#from pyspark.mllib.evaluation import BinaryClassificationMetrics
predictionAndLabels = test_pred.rdd.map(lambda Row : (float(Row['label']) , Row['prediction']))
metrics = BinaryClassificationMetrics(predictionAndLabels)

Также, исходя из документации ссылка ! , видимо не поддерживает меру f1 и напомню et c. Есть идеи, почему и как мы можем извлечь их без низкоуровневого кодирования?

1 Ответ

0 голосов
/ 07 мая 2020

Я не думаю, что вам нужно go так глубоко. Взяв их пример данных из двоичного файла из документации, которую вы связали, и предполагая, что ваш порог равен p = 0,5, вы можете просто сделать что-то вроде

# f1 = 2 · Precision · Recall/Precision + Recall
# precision = tp / tp+fp
# recall = tp / tp+fn

from pyspark.sql.functions import col

scoreAndLabels = sc.parallelize([(0.1, 0.0), (0.1, 1.0), (0.4, 0.0), (0.6, 0.0), (0.6, 1.0), (0.6, 1.0), (0.8, 1.0)], 2)
df = scoreAndLabels.toDF()

threshold = 0.5

tp = df.where((col('_1')>=threshold) &(col('_2')==1.0)).count()
fp = df.where((col('_1')<threshold) &(col('_2')==1.0)).count()
fn = df.where((col('_1')>=threshold) &(col('_2')==0.0)).count()
precision = tp / (tp+fp)
recall = tp / (tp+fn)
f1 = 2 * (precision * recall) / (precision + recall)

возвращает f1 = 0,75.

...