Archive du forum du MOOC Recherche Reproductible Session 2

Module 2 exercice 5 Python : modification nécessaire du code

Kujyto

Bonjour,

Je ne suis pas très à l’aise avec les outils Python utilisé mais j’ai du modifier le code pour pouvoir l’exécuter.

Lors de la régression, le premier paramètre donné est “Intercept” et le second “Temperature”. Cependant, lors de la prédiction, dans le tableau “data_pred”, ces deux paramètres sont intervertis : le premier est “Temperature” et le second “Intercept”.
J’ai donc eu à échanger ces deux champs lors de la création du tableau “data_pred” :
data_pred = pd.DataFrame({'Intercept': 1, 'Temperature': np.linspace(start=30, stop=90, num=121)})

En espérant que cela aide ceux pour qui comme moi cela ne fonctionnait pas.

Bonne journée.

khinsen

Merci d’avoir signalé le problème. Je confirme que le code Python que nous fournissons ne marche plus avec une installation Python récente. Pourtant, il a bien fonctionné dans le passé car nous proposons un notebook Jupyter avec tous les résultats! Je vais essayer d’identifier les changements qui sont à l’origine du problème.

Je confirme également que votre correction mène au bon résultat, mais je ne comprends pas pourquoi et je soupçonne un bug quelque part. En fait, vous intervertissez deux entrées dans un dictionnaire, ce qui ne devrait rien changer du tout! Je vais explorer ce qui se passe.

Pourriez-vous me précises quelles versions de Python, pandas, et statsmodels vous utilisez?

khinsen

J’ai trouvé le bug, qui était bien dans notre propre code ! En fait, c’est une pure coïncidence que ça a marché avant, et aussi une pure coïncidence que votre correction fonctionne.

J’ai mis à jour le code, donc tout le monde qui tente l’exercice à partir de maintenant verra la bonne version.

Pour info, il fallait remplacer la ligne

data_pred['Frequency'] = logmodel.predict(data_pred)

par

data_pred['Frequency'] = logmodel.predict(data_pred[['Intercept','Temperature']])

On peut en effet reprocher à statsmodels de négliger la vérification des paramètres à l’entrée. Pour un modèle avec deux variables, il prend les deux premières colonnes, sans se plaindre s’il y en a d’autres. Comme l’ordre des colonnes dans la mémoire dépend de facteurs hors de notre contrôle (le code interne de pandas qui peut changer à tout moment), le résultat est presque aléatoire.

Kujyto

Bonjour,

J’utilise Python 3.6.7, pandas 0.24.2 et statsmodels 0.9.0.

Il semblerait que sur ma version de Python, les dictionnaires conservent l’ordre d’insertion, ce qui explique la résolution du problème sur ma machine.

Merci d’avoir corrigé le problème : je vais corriger mon code pour qu’il soit reproductible.

Bonne journée.

lfarhi

Bonjour,
Merci @Kujyto d’avoir signalé le problème. Konrad a modifié l’entrepôt GitLab “modèle” de l’espace personnel de chaque participant au Mooc. Cet espace est initialisé la 1ère fois que vous allez dans votre espace(Gitlab ou Jupyter).
Du coup, pour récupérer les modifications de Konrad, il est nécessaire de faire un “Merge request” depuis votre espace Gitlab. Tout est expliqué dans ce document.
Bonne journée

Thank you @Kujyto for reporting the problem. Konrad modified the GitLab “template” repository of the personal space of each Mooc participant. This space is initialized the first time you go into your space (Gitlab or Jupyter).
Therefore, to retrieve Konrad’s modifications, it is necessary to make a “Merge request” from your Gitlab space. Everything is explained in this document.
Have a nice day

khinsen

Python garantit la préservation de l’ordre dans un dictionnaire depuis la version 3.7, mais le fait depuis la 3.6, en effet. A ma connaissance, pandas ne fait aucune promesse de ce genre, donc il faut encore faire attention.