pyspark中是否有内置的日志丢失功能?我有一个pyspark框架与列:probability,rawPrediction,label我想用平均对数损失来评估这些预测。
mf98qq941#
据我所知,没有这样的功能直接存在。但是,给定一个PySpark框架df,其列的名称与问题中的列相同,可以显式计算平均日志丢失:
df
import pyspark.sql.functions as f eps = 1e-7 df_w_logloss = ( df # clip predictions to within [eps, 1-eps] to prevent infinities .withColumn('prob_eps', f.least(f.greatest(f.col('probability'), f.lit(eps)), f.lit(1-eps))) .withColumn( 'logloss', -f.col('label')*f.log(f.col('prob_eps')) - (1.-f.col('label'))*f.log(1.-f.col('prob_eps')), ) ) logloss = df_w_logloss.agg(f.mean('logloss').alias('ll')).collect()[0]['ll']
这里假设label是数值(即0或1),probability表示模型的预测。(不知道rawPrediction是什么意思)
label
probability
rawPrediction
vsmadaxz2#
我假设你使用的是Spark ML,并且你的矩阵是一个拟合估计器的输出。在这种情况下,您可以使用以下函数来计算日志损失。
from pyspark.sql.types import FloatType from pyspark.sql import functions as F def log_loss(df): # extract predicted probability get_first_element = F.udf(lambda v:float(v[1]), FloatType()) df = df.withColumn("preds", get_first_element(F.col("probability"))) # calculate negative log-likelihood y1, y0 = F.col("label"), 1 - F.col("label") p1, p0 = F.col("preds"), 1 - F.col("preds") nll = -(y1*F.log(p1) + y0*F.log(p0)) # aggregate return df.agg(F.mean(nll)).collect()[0][0]
2条答案
按热度按时间mf98qq941#
据我所知,没有这样的功能直接存在。但是,给定一个PySpark框架
df
,其列的名称与问题中的列相同,可以显式计算平均日志丢失:这里假设
label
是数值(即0或1),probability
表示模型的预测。(不知道rawPrediction
是什么意思)vsmadaxz2#
我假设你使用的是Spark ML,并且你的矩阵是一个拟合估计器的输出。在这种情况下,您可以使用以下函数来计算日志损失。