簡體   English   中英

Pyspark - 使用 dataframe 中其他兩列的 RMSE 創建新列

[英]Pyspark - Create new column with the RMSE of two other columns in dataframe

我對 Pyspark 相當陌生。 我有一個 dataframe,我想創建一個第三列,計算col1col2之間的 RMSE。 我正在使用用戶定義的 lambda function 進行 RMSE 計算,但不斷收到此錯誤AttributeError: 'int' object has no attribute 'mean'

from pyspark.sql.functions import udf,col
from pyspark.sql.types import IntegerType
from pyspark import SparkContext
from pyspark.sql import SparkSession
from pyspark.sql import SQLContext

spark = SparkSession.builder.config("spark.driver.memory", "30g").appName('linear_data_pipeline').getOrCreate()

sqlContext = SQLContext(sc)
old_df = sqlContext.createDataFrame(sc.parallelize(
    [(0, 1), (1, 3), (2, 5)]), ('col_1', 'col_2'))
function = udf(lambda col1, col2 : (((col1 - col2)**2).mean())**.5)
new_df = old_df.withColumn('col_n',function(col('col_1'), col('col_2')))
new_df.show()

我如何最好地解決此問題? 我還想找到 RMSE/均值、平均絕對誤差、平均絕對誤差/均值、中值絕對誤差和中值百分比誤差,但是一旦我弄清楚如何計算一個,我應該會擅長其他的。

我覺得比你還有些糊塗。 RMSE是根據一系列點計算得出的,因此您不必為兩列中的每個值計算此值。 我認為您必須使用每列中的所有值來計算 RMSE。

這可能有效:

pow = udf(lambda x: x**2)
rmse = (sum(pow(old_df['col1'] - old_df['col2']))/len(old_df))**.5
print(rmse)

在這種情況下,我認為您不需要udf 我認為僅使用pyspark.sql.functions是可能的。

我可以向您推薦以下未經測試的選項

import pyspark.sql.functions as psf

rmse = old_df.withColumn("squarederror",
                   psf.pow(psf.col("col1") - psf.col("col2"),
                           psf.lit(2)
                  ))
       .agg(psf.avg(psf.col("squarederror")).alias("mse"))
       .withColumn("rmse", psf.sqrt(psf.col("mse")))

rmse.collect()

使用相同的邏輯,您可以獲得其他性能統計信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM