4 votes

PyMC3 : des prédictions différentes pour des entrées identiques

Dans PyMC3, les nouvelles observations individuelles sont transmises par l'intermédiaire de set_data() ne sont actuellement pas traitées correctement par sample_posterior_predictive() qui, dans ce cas, prédit plutôt les données d'apprentissage (cf. #3640 ). J'ai donc décidé d'ajouter une deuxième ligne artificielle, identique à la première, à mes données d'entrée afin de contourner ce comportement.

Or, je suis tombé sur quelque chose que je n'arrive pas à comprendre pour l'instant : les prédictions de la première et de la deuxième ligne sont différentes. Avec une constante random_seed j'aurais attendu que les deux prédictions soient identiques. Quelqu'un peut-il (i) affirmer qu'il s'agit d'un comportement voulu et non d'un bogue et, si c'est le cas, (ii) expliquer pourquoi ? sample_posterior_predictive() crée des résultats différents pour une seule et même donnée d'entrée ?

Voici un exemple reproductible basé sur l'ensemble de données de l'iris, où la largeur et la longueur des pétales servent respectivement de prédicteur et de réponse, et où tout, sauf la dernière ligne, est utilisé pour l'apprentissage. Le modèle est ensuite testé par rapport à la dernière ligne. pd.concat() est utilisé pour dupliquer la première ligne du cadre de données de test afin de contourner le bogue ci-dessus.

import seaborn as sns
import pymc3 as pm
import pandas as pd
import numpy as np

### . training ----

dat = sns.load_dataset('iris')
trn = dat.iloc[:-1]

with pm.Model() as model:
    s_data = pm.Data('s_data', trn['petal_width'])
    outcome = pm.glm.GLM(x = s_data, y = trn['petal_length'], labels = 'petal_width')
    trace = pm.sample(500, cores = 1, random_seed = 1899)

### . testing ----

tst = dat.iloc[-1:]
tst = pd.concat([tst, tst], axis = 0, ignore_index = True)

with model:
    pm.set_data({'s_data': tst['petal_width']})
    ppc = pm.sample_posterior_predictive(trace, random_seed = 1900)

np.mean(ppc['y'], axis = 0)
# array([5.09585088, 5.08377112]) # mean predicted value for [first, second] row

2voto

merv Points 14713

Je ne pense pas qu'il s'agisse d'un bug et je ne le trouve pas non plus troublant. Comme PyMC3 ne vérifie pas si les points prédits sont identiques, il les traite séparément et chacun d'entre eux donne lieu à un tirage aléatoire du modèle. Alors que chaque tirage PPC (ligne dans ppc['y'] ) utilise les mêmes paramètres aléatoires pour le GLM tirés de la trace, le modèle est toujours stochastique (c'est-à-dire qu'il y a toujours une erreur de mesure). Je pense que cela explique la différence.

Si vous augmentez le nombre de tirages dans le CPP, vous verrez que la différence entre les moyennes diminue, ce qui est cohérent avec le fait qu'il s'agit simplement d'une différence d'échantillonnage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X