应用模型后Pyspark提取转换数据帧的概率[重复]

Posted

技术标签:

【中文标题】应用模型后Pyspark提取转换数据帧的概率[重复]【英文标题】:Pyspark Extracting probability of transformed dataframe after applying model [duplicate] 【发布时间】:2019-05-22 07:56:06 【问题描述】:

在对数据集应用 RandomForestClassifier 进行二元分类和预测后,我获得了具有标签、预测和概率列的转换数据框 df目标: 我想创建一个新列“prob_flag”,它是预测标签“1”的概率。它是包含概率的数组的第二个元素(它本身就是第一个数组的第三个元素)。

我查看了similar topics,但我收到了在这些主题中未遇到的错误。

df.show()
label   prediction                 probability
  0           0           [1,2,[],[0.7558548984793847,0.2441451015206153]]
  0           0           [1,2,[],[0.5190322149055472,0.4809677850944528]]
  0           1           [1,2,[],[0.4884140358521083,0.5115859641478916]]
  0           1           [1,2,[],[0.4884140358521083,0.5115859641478916]]
  1           1           [1,2,[],[0.40305518381637956,0.5969448161836204]]
  1           1           [1,2,[],[0.40570407426458577,0.5942959257354141]]

# The probability column is VectorUDT and looks like an array of dim 4 that contains probabilities of predicted variables I want to retrieve  
df.schema
StructType(List(StructField(label,DoubleType,true),StructField(prediction,DoubleType,false),StructField(probability,VectorUDT,true)))

# I tried this:
import pyspark.sql.functions as f

df.withColumn("prob_flag", f.array([f.col("probability")[3][1])).show()

"Can't extract value from probability#6225: need struct type but got struct<type:tinyint,size:int,indices:array<int>,values:array<double>>;"

我想创建一个新列“prob_flag”,它是预测标签“1”的概率。它是包含概率的数组的第二个数字,例如0.24、0.48、0.51、0.51、0.59、0.59。

【问题讨论】:

【参考方案1】:

很遗憾,您不能像提取 ArrayType 一样提取 VectorUDT 的字段。

您必须改用 udf:

from pyspark.sql.types import DoubleType
from pyspark.sql.functions import udf, col

def extract_prob(v):
    try:
        return float(v[1])  # Your VectorUDT is of length 2
    except ValueError:
        return None

extract_prob_udf = udf(extract_prob, DoubleType())

df2 = df.withColumn("prob_flag", extract_prob_udf(col("probability")))

【讨论】:

以上是关于应用模型后Pyspark提取转换数据帧的概率[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 Pyspark 中将 Pandas 数据帧转换为 Spark 数据帧的 TypeError

Pyspark - ValueError:无法将字符串转换为浮点数/浮点()的无效文字

熊猫数据帧的 PySpark rdd

如何比较来自 PySpark 数据帧的记录

Pyspark:在数据帧的不同组上应用 kmeans

如何按行将函数应用于 PySpark 数据帧的一组列?