Элемент доступа вектора в Spark DataFrame (вектор вероятности логической регрессии)

Я подготовил модель LogisticRegression в PySpark (пакет ML), и результатом предсказания является DataSpark PySpark (cv_predictions) (см. [1]). Столбец probability (см. [2]) является типом vector (см. [3]).

[1]
type(cv_predictions_prod)
pyspark.sql.dataframe.DataFrame

[2]
cv_predictions_prod.select('probability').show(10, False)
+----------------------------------------+
|probability                             |
+----------------------------------------+
|[0.31559134817066054,0.6844086518293395]|
|[0.8937864350711228,0.10621356492887715]|
|[0.8615878905395029,0.1384121094604972] |
|[0.9594427633777901,0.04055723662220989]|
|[0.5391547673698157,0.46084523263018434]|
|[0.2820729747752462,0.7179270252247538] |
|[0.7730465873083118,0.22695341269168817]|
|[0.6346585276598942,0.3653414723401058] |
|[0.6346585276598942,0.3653414723401058] |
|[0.637279255218404,0.362720744781596]   |
+----------------------------------------+
only showing top 10 rows

[3]
cv_predictions_prod.printSchema()
root
 ...
 |-- rawPrediction: vector (nullable = true)
 |-- probability: vector (nullable = true)
 |-- prediction: double (nullable = true)

Как создать синтаксический анализ vector в PySpark DataFrame, так что я создаю новый столбец, который просто вытаскивает первый элемент из каждого вектора probability?

Этот вопрос аналогичен, но решения в ссылках ниже не работают/не ясны:

Как получить доступ к значениям denseVector в PySpark

Как получить доступ к элементу столбца VectorUDT в Spark DataFrame?

Ответ 1

Обновить:

Похоже, в искре есть ошибка, которая не позволяет вам получить доступ к отдельным элементам в плотном векторе во время оператора выбора. Обычно вы должны иметь доступ к ним так же, как к массиву, но при попытке запустить ранее опубликованный код вы можете получить ошибку pyspark.sql.utils.AnalysisException: "Can't extract value from probability#12;"

Таким образом, один из способов избежать этой глупой ошибки - использовать udf. Подобно другому вопросу, вы можете определить udf следующим образом:

from pyspark.sql.functions import udf
from pyspark.sql.types import FloatType

firstelement=udf(lambda v:float(v[0]),FloatType())
cv_predictions_prod.select(firstelement('probability')).show()

За кулисами это все еще получает доступ к элементам DenseVector как крошечный массив, но это не выдает ту же ошибку, что и раньше.


Так как это получает много голосов, я решил, что должен зачеркнуть неправильную часть этого ответа.

Оригинальный ответ: плотный вектор - это просто обертка для массива numpy. Таким образом, вы можете обращаться к элементам так же, как к элементам массива numpy.

Существует несколько способов доступа к отдельным элементам массива в кадре данных. Одним из них является явный вызов столбца cv_predictions_prod['probability'] в вашем операторе выбора. Явно вызывая столбец, вы можете выполнять операции с этим столбцом, например выбирать первый элемент в массиве. Например:

cv_predictions_prod.select(cv_predictions_prod['probability'][0]).show()

должен решить проблему.