Pyspark: извлечение результатов классификации по мультиклассу в виде различных столбцов - PullRequest
1 голос
/ 10 октября 2019

Я использую объект RandomForestClassifier для задачи классификации мультикласса. Выходной кадр данных прогноза представляет столбцы «вероятность» в виде вектора:

df.select('probability').printSchema()
root
 |-- probability: vector (nullable = true)

Каждая строка представляет собой вектор из 4:

df.select('probability').show(3)
+--------------------+
|         probability|
+--------------------+
|[0.02753394443688...|
|[7.95347766409877...|
|[0.02264704615632...|
+--------------------+

Я хотел бы создать 4 столбца наmy df с одним значением 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

1 Ответ

1 голос
/ 10 октября 2019

Короткий ответ

Чтобы использовать udf с withColumn, вы должны сделать так:

firstelement=udf(lambda v:float(v[0]),FloatType())
df.withColumn('prob_SELF', firstelement('probability'))

Длинный ответ

Проблема в том, что когда вы делаете df.select(firstelement('probability'))['<lambda>(probability)'] вы создаете новый отдельный фрейм данных.

Вы не можете использовать .withColumn для столбцов из разных фреймов данных, для объединения отдельных фреймов данных вы должны использовать join.

Здесь простодемонстрация:

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'```
...