Pyspark:将多类分类结果提取为不同的列
Pyspark: Extract Multiclass Classification results as different columns
我将 RandomForestClassifier 对象用于多类分类问题。
预测的输出数据帧将 'probability' 列表示为向量:
df.select('probability').printSchema()
root
|-- probability: vector (nullable = true)
每一行都是一个向量 4:
df.select('probability').show(3)
+--------------------+
| probability|
+--------------------+
|[0.02753394443688...|
|[7.95347766409877...|
|[0.02264704615632...|
+--------------------+
我想在我的 df 上创建 4 列,每列有一个 Double 值。
一个类似的问题提出了这个解决方案:
from pyspark.sql.functions import udf
from pyspark.sql.types import FloatType
firstelement=udf(lambda v:float(v[0]),FloatType())
df.select(firstelement('probability'))
该解决方案有效,但是当我尝试使用
将值分配给新列时
df.withColumn('prob_SELF', df.select(firstelement('probability'))['<lambda>(probability)'])
我有以下错误:
AnalysisException: 'resolved attribute(s) <lambda>(probability)#26116 missing from prediction#25521
简答
要将 udf 与 withColumn
一起使用,您应该这样做:
firstelement=udf(lambda v:float(v[0]),FloatType())
df.withColumn('prob_SELF', firstelement('probability'))
长答案
问题是当您这样做时 df.select(firstelement('probability'))['<lambda>(probability)']
您正在创建一个新的、单独的数据框。
您不能对来自不同数据框的列使用 .withColumn
,要连接单独的数据框,您必须使用连接。
这里简单演示一下:
df_a = spark.sql("""
SELECT CAST(1.0 AS FLOAT) AS A
""")
df_b = spark.sql("""
SELECT CAST(1.0 AS FLOAT) AS B
""")
df_a.withColumn('B', df_b['B'])
你得到
AnalysisException: u'Resolved attribute(s) B#2465 missing from A#2463 in operator !Project [A#2463, B#2465 AS B#2468].;;\n!Project [A#2463, B#2465 AS B#2468]\n+- Project [cast(1.0 as float) AS A#2463]\n +- OneRowRelation\n'```
我将 RandomForestClassifier 对象用于多类分类问题。 预测的输出数据帧将 'probability' 列表示为向量:
df.select('probability').printSchema()
root
|-- probability: vector (nullable = true)
每一行都是一个向量 4:
df.select('probability').show(3)
+--------------------+
| probability|
+--------------------+
|[0.02753394443688...|
|[7.95347766409877...|
|[0.02264704615632...|
+--------------------+
我想在我的 df 上创建 4 列,每列有一个 Double 值。
一个类似的问题提出了这个解决方案:
from pyspark.sql.functions import udf
from pyspark.sql.types import FloatType
firstelement=udf(lambda v:float(v[0]),FloatType())
df.select(firstelement('probability'))
该解决方案有效,但是当我尝试使用
将值分配给新列时df.withColumn('prob_SELF', df.select(firstelement('probability'))['<lambda>(probability)'])
我有以下错误:
AnalysisException: 'resolved attribute(s) <lambda>(probability)#26116 missing from prediction#25521
简答
要将 udf 与 withColumn
一起使用,您应该这样做:
firstelement=udf(lambda v:float(v[0]),FloatType())
df.withColumn('prob_SELF', firstelement('probability'))
长答案
问题是当您这样做时 df.select(firstelement('probability'))['<lambda>(probability)']
您正在创建一个新的、单独的数据框。
您不能对来自不同数据框的列使用 .withColumn
,要连接单独的数据框,您必须使用连接。
这里简单演示一下:
df_a = spark.sql("""
SELECT CAST(1.0 AS FLOAT) AS A
""")
df_b = spark.sql("""
SELECT CAST(1.0 AS FLOAT) AS B
""")
df_a.withColumn('B', df_b['B'])
你得到
AnalysisException: u'Resolved attribute(s) B#2465 missing from A#2463 in operator !Project [A#2463, B#2465 AS B#2468].;;\n!Project [A#2463, B#2465 AS B#2468]\n+- Project [cast(1.0 as float) AS A#2463]\n +- OneRowRelation\n'```