web-dev-qa-db-ja.com

Spark= DataFrame(ロジスティック回帰確率ベクトル)のベクトルのアクセス要素

PySpark(MLパッケージ)でLogisticRegressionモデルをトレーニングしましたが、予測の結果はPySpark DataFrame(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)

PySpark DataFrameのvectorを解析して作成し、各probabilityベクトルの最初の要素を取得するだけの新しい列を作成するにはどうすればよいですか?

この質問は似ていますが、以下のリンクの解決策はうまくいきませんでした/私にはわかりません:

PySparkのdenseVectorの値にアクセスする方法

Spark DataFrame? のVectorUDT列の要素にアクセスする方法

17
user2205916

更新:

sparkにバグがあるようです。これにより、selectステートメント中に密なベクトルの個々の要素にアクセスできなくなります。通常、numpy配列と同じようにアクセスできるはずです。 、ただし、以前に投稿されたコードを実行しようとすると、エラーpyspark.sql.utils.AnalysisException: "Can't extract value from probability#12;"が表示される場合があります

したがって、この愚かなバグを回避するためにこれを処理する1つの方法は、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()

舞台裏では、これはまだnumpy配列のようにDenseVectorの要素にアクセスしますが、以前と同じバグをスローしません。


これは多くの賛成票を得ているので、この答えの間違った部分を打破する必要があると考えました。

元の答え:密なベクトルは、numpy配列の単なるラッパーです。したがって、numpy配列の要素にアクセスするのと同じ方法で要素にアクセスできます。

データフレーム内の配列の個々の要素にアクセスするには、いくつかの方法があります。 1つは、selectステートメントで列cv_predictions_prod['probability']を明示的に呼び出すことです。列を明示的に呼び出すことにより、配列の最初の要素を選択するなど、その列に対して操作を実行できます。例えば:

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

問題を解決する必要があります。

26
DavidWayne