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