Lors du calcul de l'AUC avec PySpark, il peut être facilement calculé en utilisant la classe BinaryClassificationEvaluator
.
Cependant, en l'état, il n'est pas possible de répondre au besoin de calculer l'AUC pour chaque segment au lieu de l'ensemble des données de test afin de comprendre les différences entre les modèles.
Pour contourner le problème, j'ai défini une fonction d'agrégation qui calcule l'AUC en utilisant pandas_udf
et je l'ai calculée avec la méthode ʻagg`.
L'échantillon est le suivant.
Après avoir calculé à l'avance l'étiquette de réponse correcte («true») et le score prévu («pred»), une fonction d'agrégation qui calcule l'AUC est définie en référence à celle-ci.
Notez que la fonction d'agrégation définie par pandas_udf
dans la méthode ʻaggne peut pas être utilisée avec la fonction d'agrégation fournie par spark. (Si vous essayez de l'utiliser ensemble, vous obtiendrez l'erreur
Impossible d'utiliser un mélange de fonction d'agrégation et de groupe de pandas d'agrégat UDF`)
Définition UDF
from sklearn.metrics import roc_auc_score
from pyspark.sql.types import DoubleType
from pyspark.sql.functions import pandas_udf, PandasUDFType
@pandas_udf(DoubleType(), functionType=PandasUDFType.GROUPED_AGG)
def auc_udf(true, pred):
return roc_auc_score(true, pred)
Méthode de calcul
data.groupBy(key).agg(auc_udf('true', 'pred').alias('auc'))