pyspark中的Log Loss函数

kyxcudwk  于 2023-10-15  发布在  Spark
关注(0)|答案(2)|浏览(121)

pyspark中是否有内置的日志丢失功能?
我有一个pyspark框架与列:probability,rawPrediction,label
我想用平均对数损失来评估这些预测。

mf98qq94

mf98qq941#

据我所知,没有这样的功能直接存在。但是,给定一个PySpark框架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是什么意思)

vsmadaxz

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]

相关问题