Pyspark 应用该模型后转换数据帧的Pypark提取概率
在对数据集应用RandomForestClassifier进行二元分类和预测后,我获得了一个带有标签、预测和概率列的转换的数据帧df。Pyspark 应用该模型后转换数据帧的Pypark提取概率,pyspark,pyspark-sql,Pyspark,Pyspark Sql,在对数据集应用RandomForestClassifier进行二元分类和预测后,我获得了一个带有标签、预测和概率列的转换的数据帧df。 目标: 我想创建一个新列“prob_flag”,它是预测标签“1”的概率。它是包含概率的数组的第二个元素(本身是第一个数组的第三个元素) 我查看了这些主题,但发现了一个在这些主题中没有遇到的错误 df.show() label prediction probability 0 0 [
目标:
我想创建一个新列“prob_flag”,它是预测标签“1”的概率。它是包含概率的数组的第二个元素(本身是第一个数组的第三个元素) 我查看了这些主题,但发现了一个在这些主题中没有遇到的错误
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>>;"
df.show()
标签预测概率
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]]
#概率列是VectorUDT,看起来像dim 4的数组,其中包含我要检索的预测变量的概率
模式
StructType(列表(StructField(标签,双类型,true),StructField(预测,双类型,false),StructField(概率,向量,true)))
#我试过这个:
导入pyspark.sql.f函数
df.withColumn(“prob_标志”),f.array([f.col(“概率”)[3][1])。show()
“无法从概率中提取值#6225:需要结构类型,但得到结构;”
我想创建一个新列“prob_flag”,它是预测标签“1”的概率。它是数组的第二个数字,包含概率,例如0.24、0.48、0.51、0.51、0.59、0.59。不幸的是,您无法像提取ArrayType一样提取向量的字段 您必须改用自定义项:
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")))
不幸的是,您不能像提取ArrayType一样提取VectorUDT的字段 您必须改用自定义项:
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")))