From 78ea2cbde98bbd590f6b7ced110a7d062d6ddbcb Mon Sep 17 00:00:00 2001 From: Lino Galiana Date: Thu, 20 Jul 2023 20:27:31 +0000 Subject: [PATCH] Change titles levels (#381) * change level * premiers chaptres * clelan * level types * change * noebooks clean * Change title levels again (#382) * rm file * autres fichiers * model * Title level NLP part (#383) * change titles * word2vec --- content/course/NLP/01_intro/index.qmd | 2 +- content/course/NLP/02_exoclean/index.qmd | 2 +- content/course/NLP/03_lda/index.qmd | 2 +- content/course/NLP/04_word2vec/index.qmd | 30 ++++++------ .../getting-started/01_installation/index.qmd | 41 ++++++---------- .../02_DS_environment/index.qmd | 14 +++--- .../04_python_practice/index.qmd | 14 +++--- .../05_rappels_types/index.qmd | 48 +++++++++---------- .../06_rappels_fonctions/index.qmd | 36 +++++++------- .../07_rappels_classes/index.qmd | 24 +++++----- .../modelisation/0_preprocessing/index.qmd | 14 +++--- .../modelisation/1_modelevaluation/index.qmd | 8 ++-- content/course/modelisation/2_SVM/index.qmd | 2 +- .../modelisation/3_regression/index.qmd | 8 ++-- .../modelisation/4_featureselection/index.qmd | 10 ++-- .../modelisation/5_clustering/index.qmd | 16 +++---- .../course/modelisation/6_pipeline/index.qmd | 30 ++++++------ content/course/visualisation/maps/index.qmd | 6 +-- .../course/visualisation/matplotlib/index.qmd | 14 ++---- 19 files changed, 153 insertions(+), 168 deletions(-) diff --git a/content/course/NLP/01_intro/index.qmd b/content/course/NLP/01_intro/index.qmd index 5595f94c2..0bac09e3c 100644 --- a/content/course/NLP/01_intro/index.qmd +++ b/content/course/NLP/01_intro/index.qmd @@ -61,7 +61,7 @@ de bénéficier d'une base solide pour approfondir tel ou tel sujet. -# Base d'exemple +## Base d'exemple La base d'exemple est le *Comte de Monte Cristo* d'Alexandre Dumas. Il est disponible diff --git a/content/course/NLP/02_exoclean/index.qmd b/content/course/NLP/02_exoclean/index.qmd index e21a7c742..fc1f8d90a 100644 --- a/content/course/NLP/02_exoclean/index.qmd +++ b/content/course/NLP/02_exoclean/index.qmd @@ -407,7 +407,7 @@ fig.get_figure() ``` -## Premier *wordcloud* +### Premier *wordcloud* Pour aller plus loin dans l'analyse du champ lexical de chaque auteur, on peut représenter un `wordcloud` qui permet d'afficher chaque mot avec une diff --git a/content/course/NLP/03_lda/index.qmd b/content/course/NLP/03_lda/index.qmd index b6b7bc3df..15554d494 100644 --- a/content/course/NLP/03_lda/index.qmd +++ b/content/course/NLP/03_lda/index.qmd @@ -405,6 +405,6 @@ Plus les barres sont loin les unes des autres, plus elles sont différentes. Un * Les **barres rouges** représentent une estimation du nombre de termes générés dans un sujet précis. La barre rouge la plus longue correspond au mot le plus utilisé dans ce sujet. -# Références +## Références * Le [poly d'Alberto Brietti](http://alberto.bietti.me/files/rapport-lda.pdf) \ No newline at end of file diff --git a/content/course/NLP/04_word2vec/index.qmd b/content/course/NLP/04_word2vec/index.qmd index 9f734f28d..3df5d84af 100644 --- a/content/course/NLP/04_word2vec/index.qmd +++ b/content/course/NLP/04_word2vec/index.qmd @@ -131,7 +131,7 @@ import gensim.downloader from sentence_transformers import SentenceTransformer ``` -# Nettoyage des données +## Nettoyage des données Nous allons ainsi à nouveau utiliser le jeu de données `spooky`: @@ -147,7 +147,7 @@ spooky_df.head() ``` -## Preprocessing +### Preprocessing En NLP, la première étape est souvent celle du *preprocessing*, qui inclut notamment les étapes de tokenization et de nettoyage du texte. Comme celles-ci ont été vues en détail dans le précédent chapitre, on se contentera ici d'un *preprocessing* minimaliste : suppression de la ponctuation et des *stop words* (pour la visualisation et les méthodes de vectorisation basées sur des comptages). @@ -205,7 +205,7 @@ spooky_df.head() ``` -## Encodage de la variable à prédire +### Encodage de la variable à prédire On réalise un simple encodage de la variable à prédire : il y a trois catégories (auteurs), représentées par des entiers 0, 1 et 2. @@ -227,7 +227,7 @@ On peut vérifier les classes de notre `LabelEncoder` : le.classes_ ``` -## Construction des bases d'entraînement et de test +### Construction des bases d'entraînement et de test On met de côté un échantillon de test (20 %) avant toute analyse (même descriptive). Cela permettra d'évaluer nos différents modèles toute à la fin de manière très rigoureuse, @@ -266,9 +266,9 @@ la méthode `inverse_transform` print(y_train[0], le.inverse_transform([y_train[0]])[0]) ``` -# Statistiques exploratoires +## Statistiques exploratoires -## Répartition des labels +### Répartition des labels Refaisons un graphique que nous avons déjà produit précédemment pour voir la répartition de notre corpus entre auteurs: @@ -288,7 +288,7 @@ fig.get_figure() On observe une petite asymétrie : les passages des livres d'Edgar Allen Poe sont plus nombreux que ceux des autres auteurs dans notre corpus d'entraînement, ce qui peut être problématique dans le cadre d'une tâche de classification. L'écart n'est pas dramatique, mais on essaiera d'en tenir compte dans l'analyse en choisissant une métrique d'évaluation pertinente. -## Mots les plus fréquemment utilisés par chaque auteur +### Mots les plus fréquemment utilisés par chaque auteur On va supprimer les *stopwords* pour réduire le bruit dans notre jeu de données. @@ -366,14 +366,14 @@ en termes de vocabulaire, ce qui laisse penser qu'il est envisageable de prédire les auteurs à partir de leurs textes dans une certaine mesure. -# Prédiction sur le set d'entraînement +## Prédiction sur le set d'entraînement Nous allons à présent vérifier cette conjecture en comparant plusieurs modèles de vectorisation, _i.e._ de transformation du texte en objets numériques pour que l'information contenue soit exploitable dans un modèle de classification. -## Démarche +### Démarche Comme nous nous intéressons plus à l'effet de la vectorisation qu'à la tâche de classification en elle-même, nous allons utiliser un algorithme de classification simple (un SVM linéaire), avec des paramètres non fine-tunés (c'est-à-dire des paramètres pas nécessairement choisis pour être les meilleurs de tous). @@ -412,7 +412,7 @@ puis on calcule le `score F1` sur ces données agrégées. L'avantage de ce choix est qu'il permet de tenir compte des différences de fréquences des différentes classes. -## Pipeline de prédiction +### Pipeline de prédiction On va utiliser un *pipeline* `scikit` ce qui va nous permettre d'avoir un code très concis pour effectuer cet ensemble de tâches cohérentes. @@ -453,7 +453,7 @@ def fit_vectorizers(vectorizer): return grid_search ``` -# Approche _bag-of-words_ +## Approche _bag-of-words_ On commence par une approche __"bag-of-words"__, i.e. qui revient simplement à représenter chaque document par un vecteur @@ -463,7 +463,7 @@ qui compte le nombre d'apparitions de chaque mot du vocabulaire dans le document cv_bow = fit_vectorizers(CountVectorizer) ``` -# TF-IDF +## TF-IDF On s'intéresse ensuite à l'approche __TF-IDF__, qui permet de tenir compte des fréquences *relatives* des mots. @@ -483,7 +483,7 @@ ce qui montre la pertinence de cette technique. cv_tfidf = fit_vectorizers(TfidfVectorizer) ``` -# Word2vec avec averaging +## Word2vec avec averaging On va maintenant explorer les techniques de vectorisation basées sur les *embeddings* de mots, et notamment la plus populaire : `Word2Vec`. @@ -592,7 +592,7 @@ cv_w2vec = fit_w2v_avg(w2v_model.wv) La performance chute fortement ; la faute à la taille très restreinte du corpus, comme annoncé précédemment. -# Word2vec pré-entraîné + averaging +## Word2vec pré-entraîné + averaging Quand on travaille avec des corpus de taille restreinte, c'est généralement une mauvaise idée d'entraîner son propre modèle `word2vec`. @@ -676,7 +676,7 @@ Cela a plusieurs limites : - lorsque les documents sont longs, la moyennisation peut créer des représentation bruitées. -# Contextual embeddings +## Contextual embeddings Les *embeddings* contextuels visent à pallier les limites des *embeddings* traditionnels évoquées précédemment. diff --git a/content/course/getting-started/01_installation/index.qmd b/content/course/getting-started/01_installation/index.qmd index 42a530071..f9967387e 100644 --- a/content/course/getting-started/01_installation/index.qmd +++ b/content/course/getting-started/01_installation/index.qmd @@ -86,7 +86,7 @@ certain nombre d'éléments supplémentaires à `Python`. La suite de ce chapitre permettra de décrire les configurations à mettre en oeuvre pour être en mesure d'exploiter la richesse de l'écosystème `Python`. -# Installer un environnement adapté à la *data-science* sur son ordinateur personnel {#local} +## Installer un environnement adapté à la *data-science* sur son ordinateur personnel {#local} Cette partie présente plusieurs éléments de configuration d'un environnement en local. Cependant, cette approche est de moins en moins fréquente. En effet, @@ -100,7 +100,7 @@ distant, est de plus en plus fréquent. -## Installer `Python` en local +### Installer `Python` en local Pour installer `Python`, il est recommandé d'utiliser la distribution [Anaconda](https://docs.anaconda.com/anaconda/install/) @@ -124,7 +124,7 @@ Passer par `Anaconda` permet: de certaines librairies qui nécessitent l'usage de langages externes (par exemple du `C++`). -## Installer un environnement de développement +### Installer un environnement de développement Les *notebooks* `Jupyter` (extension `.ipynb`) sont très utilisés en *data science*. Ils sont en @@ -154,7 +154,7 @@ interface `Git`, etc. * fonctionalités classiques d'un IDE dont manque `Jupyter`: autocomplétion, diagnostic du code, etc. * intégration avec les environnements `Conda` -## Installation de `Git` +### Installation de `Git` Le principe de `Git` ainsi que son usage avec `Python` sont présentés dans une [partie dédiée](/course/git). Cette partie se concentre ainsi sur la question @@ -167,7 +167,7 @@ externes, notamment les interfaces de développement comme `Visual Studio`, pourront l'utiliser. -# Exécution dans un environnement temporaire sur un serveur distant +## Exécution dans un environnement temporaire sur un serveur distant Comme évoqué précedemment, les technologies dominantes dans le domaine du traitement des données ont amené à une évolution des pratiques @@ -249,7 +249,8 @@ de garder à l'esprit qu'elles sont également temporaires. {{% /box %}} -## SSP-Cloud [![Onyxia](https://img.shields.io/badge/SSPcloud-Tester%20via%20SSP--cloud-informational&color=yellow?logo=Python)](https://datalab.sspcloud.fr/launcher/ide/jupyter-python?autoLaunch=true&onyxia.friendlyName=«python-datascientist»&resources.requests.memory=«4Gi»&security.allowlist.enabled=false&git.repository=«https%3A%2F%2Fgithub.com%2Flinogaliana%2Fpython-datascientist.git) +### SSP-Cloud Onyxia
+ `Onyxia`, l'autre petit nom du SSP-Cloud, est une plateforme libre service mutualisée de traitement @@ -267,7 +268,8 @@ Elle est aussi utilisé à des fins de formations et d’auto-formations. Dans cet environnement, `Jupyter` et `Visual Studio` sont tous deux disponibles. -## Google collaboratory [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](http://colab.research.google.com/github/linogaliana/python-datascientist/blob/master) +### Google collaboratory Open In Colab + Google met à disposition une plateforme de calculs basée sur le format `Jupyter Notebook`. Un grand avantage de cette solution est la mise à disposition gratuite de @@ -278,7 +280,8 @@ Il est possible de connecter les *notebooks* ouverts à Google Drive ou à [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/googlecolab/colabtools/blob/master/notebooks/colab-github-demo.ipynb) fournit un raccourci pour lancer le notebook dans un environnement dédié. -## Github Visual Studio Editor [![githubdev](https://open.vscode.dev/badges/open-in-vscode.svg)](https://github.dev/linogaliana/python-datascientist) +### Github Visual Studio Editor githubdev + `Microsoft` qui possède à la fois `Github` et `Visual Studio` a récemment lancé une offre `Github dev` qui permet d'ouvrir et lancer un notebook @@ -289,22 +292,8 @@ Cette interface permet également de gérer les *issues* et *pull request* d'un dépôt `Github`. -## Binder [![Binder](https://img.shields.io/badge/Launch-Binder-E66581.svg?logo=data:image/png;base64,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)](https://mybinder.org/v2/gh/linogaliana/python-datascientist/master) - -En cliquant sur cette icône -[![Binder](https://img.shields.io/badge/Launch-Binder-E66581.svg?logo=data:image/png;base64,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)](https://mybinder.org/v2/gh/linogaliana/python-datascientist/master), -qu'on peut retrouver un peu partout dans ce site ou sur le dépôt -{{< githubrepo >}}, vous pouvez lancer un environnement propre, -et disposant d'une copie -(un *clone* en langage `Git`) du dépôt `Github`. Celui-ci n'intègre -pas forcément les dépendances nécessaires pour un chapitre, il est -alors nécessaire de les installer. Malheureusement, les environnements `binder` -peuvent mettre du temps à se lancer et il est plutôt recommandé de privilégier -une autre approche. - - -## La technologie en arrière-plan: Docker +### La technologie en arrière-plan: Docker [Docker](https://www.docker.com/) est l'outil open-source de référence en matière de création d'environnements isolés et auto-suffisants ( @@ -341,7 +330,7 @@ le mot de passe `test` (défini plus haut), on peut ainsi accéder pérenne). -# Installer des packages supplémentaires +## Installer des packages supplémentaires Un module est un script qui a vocation à définir des objets utilisés postérieurement par un interpréteur. C'est un script `.py` autosuffisant, @@ -378,7 +367,7 @@ en apprenant à chercher dans la documentation ; - en cas d'erreur : copiez-collez l'erreur sur votre moteur de recherche préféré. Quelqu'un aura déjà posé la question, sans doute sur `stackoverflow`. Néanmoins, ne copiez-collez pas la réponse sans comprendre la solution. -## Les gestionnaires de packages +### Les gestionnaires de packages Les packages d'un langage *open-source* sont mis à disposition sur des dépôts. Le CTAN est ainsi le dépôt `\(\LaTeX\)` le plus connu, le @@ -438,7 +427,7 @@ dans les entreprises. {{% /box %}} -## Comment installer des packages +### Comment installer des packages Avec Anaconda, il faut passer par la ligne de commande et taper diff --git a/content/course/getting-started/02_DS_environment/index.qmd b/content/course/getting-started/02_DS_environment/index.qmd index b5be0e9fa..7f007760b 100644 --- a/content/course/getting-started/02_DS_environment/index.qmd +++ b/content/course/getting-started/02_DS_environment/index.qmd @@ -56,7 +56,7 @@ dont l'image ci-dessus est tirée, résume la plupart des packages utiles pour un data-scientist ou un économiste/sociologue. Nous nous bornerons ici à évoquer ceux utilisés quotidiennement. -## `numpy` +### `numpy` `numpy` gère tout ce qui est calcul matriciel. Le langage `Python` est un des langages les plus lents qui soient[^1]. @@ -84,7 +84,7 @@ La _Cheat Sheet_ de `numpy` est pratique: Comme `numpy` est la brique de base de l'analyse de données, un chapitre de ce cours lui est consacré. -## `pandas` +### `pandas` Avant tout, un bon _data-scientist_ doit être capable de s'approprier et manipuler des données rapidement. Pour cette raison, @@ -132,7 +132,7 @@ des analyses reproductibles en construisant des *pipelines* de données ; L'INRIA, institution française, est l'un des éléments moteurs dans la création et la maintenance de `scikit-learn` -## `TensorFlow`, `PyTorch` et `Keras` +### `TensorFlow`, `PyTorch` et `Keras` Les librairies essentielles pour implémenter et utiliser des modèles de *deep learning* en Python ont été développées par des acteurs du @@ -152,7 +152,7 @@ il est très utilisé dans certains domaines de recherche, comme le NLP. Il s'agit du _framework_ dont la dynamique récente a été la plus ascensionnelle. -## `statsmodels` +### `statsmodels` `statsmodels` plaira plus aux statisticiens, il implémente des modèles économétriques similaires à `scikit-learn`. @@ -160,7 +160,7 @@ Par rapport à `scikit-learn`, `statsmodels` est plus orienté économétrie. La présentation des résultats est très proche de ce qu’on trouve en `R`. -## `requests` et `beautifulsoup` +### `requests` et `beautifulsoup` `requests` est l'une des librairies de base de `Python`, dédiée à gérer la connexion avec internet. Les amateurs d'API @@ -169,7 +169,7 @@ personnes plus spécialistes de _webscraping_ lui préféreront `beautifulsoup` qui offre une syntaxe extrêmement puissante pour récupérer automatiquement du contenu de pages web. -## `nltk` et `spaCy` +### `nltk` et `spaCy` Dans le domaine du traitement automisé du langage, plus connu sous son acronyme anglais NLP, les deux packages phares sont @@ -232,7 +232,7 @@ pour construire des modules, les tester et déployer des site web. * Les services type `Binder`, `Google Colab` et `Kaggle` proposent des kernels `Python` -# Rester au courant des évolutions +## Rester au courant des évolutions L'écosystème riche et foisonnant de `Python` a comme contrepartie qu'il faut rester attentif à ses évolutions pour ne pas diff --git a/content/course/getting-started/04_python_practice/index.qmd b/content/course/getting-started/04_python_practice/index.qmd index c79527e5d..be0aba614 100644 --- a/content/course/getting-started/04_python_practice/index.qmd +++ b/content/course/getting-started/04_python_practice/index.qmd @@ -22,7 +22,7 @@ categories: Une référence utile à lire est le [*Hitchhiker’s Guide to Python*](https://docs.python-guide.org/#writing-great-python-code) -# Structure d'un projet en python +## Structure d'un projet en python La structure basique d'un projet développé en `Python` est la suivante, qu'on peut retrouver dans [ce dépôt](https://github.com/navdeep-G/samplemod): @@ -73,7 +73,7 @@ Les packages `devtools`, `usethis` et `testthat` ont grandement facilité l'éla il est recommandé de lire l'incontournable [livre d'Hadley Wickham](http://r-pkgs.had.co.nz/) -# Style de programmation et de documentation +## Style de programmation et de documentation > The code is read much more often than it is written. > @@ -91,7 +91,7 @@ La plupart de ces recommandations ne sont pas propres à `Python`, on les retrou On retrouve de nombreux conseils dans [cet ouvrage](https://docs.python-guide.org/writing/style/) qu'il est recommandé de suivre. La suite se concentrera sur des éléments complémentaires. -## Import des modules +### Import des modules Les éléments suivants concernent plutôt les scripts finaux, qui appellent de multiples fonctions, que des scripts qui définissent des fonctions. @@ -167,7 +167,7 @@ def add(x, y): `Pycharm` offre des outils de diagnostics très pratiques pour détecter et corriger ce type d'erreur. -## :warning: aux arguments optionnels +### ⚠️ aux arguments optionnels La fonction la plus lisible (mais la plus contraignante) est celle qui utilise exclusivement des arguments positionnels avec des noms explicites. @@ -178,7 +178,7 @@ dans la définition d'une fonction le mot-clé `**kwargs` (équivalent du `...` arguments supplémentaires et les stocke sous forme de dictionnaire. Il s'agit d'une technique avancée de programmation qui est à utiliser avec parcimonie. -# Documenter les fonctions {.docfonctions} +## Documenter les fonctions {.docfonctions} La documentation d'une fonction s'appelle le `docstring`. Elle prend la forme suivante: @@ -202,7 +202,7 @@ l'avantage, lors de la génération d'un package, de permettre une mise en forme [sphinx](https://pypi.org/project/Sphinx/) (dont l'équivalent `R` est `Roxygen`) -# Les tests {.tests} +## Les tests {.tests} Tester ses fonctions peut apparaître formaliste mais c'est, en fait, souvent d'un grand secours car cela permet de détecter et corriger des bugs précoces (ou au moins d'être conscient de leur existence). @@ -264,7 +264,7 @@ class MyTest(unittest.TestCase): **Parler de codecov** -# Partager +## Partager Ce point est ici évoqué en dernier mais, en fait, il est essentiel et mérite d'être une réflexion prioritaire. Tout travail n'a pas vocation à être public diff --git a/content/course/getting-started/05_rappels_types/index.qmd b/content/course/getting-started/05_rappels_types/index.qmd index 973100487..114c27356 100644 --- a/content/course/getting-started/05_rappels_types/index.qmd +++ b/content/course/getting-started/05_rappels_types/index.qmd @@ -43,7 +43,7 @@ le précédent professeur de ce cours. Voir aussi [Essential Cheat Sheets for Machine Learning and Deep Learning Engineers](https://startupsventurecapital.com/essential-cheat-sheets-for-machine-learning-and-deep-learning-researchers-efb6a8ebd2e5). -# Les quelques règles de `Python` +## Les quelques règles de `Python` `Python` est un peu susceptible et protocolaire, plus formaliste que ne l'est `R`. Il y a ainsi quelques règles à respecter : @@ -77,7 +77,7 @@ ponctuation sont importantes : Il faut juste avoir les mêmes début et fin. * Pour documenter une fonction ou une classe _""" mon texte de documentation """_ -# Les outputs de `Python` : l'opération, le `print` et le `return` +## Les outputs de `Python` : l'opération, le `print` et le `return` Quand Python réalise des opérations, il faut lui préciser ce qu'il doit en faire : @@ -107,7 +107,7 @@ pour afficher la dernière figure générée par `matplotlib`) -## Le `print` +### Le `print` ```{python} # on calcule : dans le cas d'une opération par exemple une somme @@ -139,7 +139,7 @@ car la fonction `addition_v1` effectue un `print` Par contre, l'objet créé n'a pas de type, il n'est pas un chiffre, ce n'est qu'un affichage. -## Le `return` +### Le `return` Pour créer un objet avec le résultat de la fonction, il faut utiliser __`return`__ @@ -159,7 +159,7 @@ Par contre, la fonction `addition_v2` permet d'avoir un objet de type `int`, un entier donc. -# Les types de base : variables, listes, dictionnaires ... +## Les types de base : variables, listes, dictionnaires ... `Python` permet de manipuler différents types de base. Nous en verrons des extensions dans la suite du cours (`np.array` par exemple) @@ -169,7 +169,7 @@ On distingue deux types de variables : les __immuables__ (*immutables*) qui ne peuvent être modifiés et les __modifiables__ (*mutables*) -## Les variables immuables +### Les variables immuables Les variables immuables ne peuvent être modifiées @@ -221,11 +221,11 @@ id(s) On voit bien que `s` a changé d'identifiant : il peut avoir le même nom, ce n'est plus le même objet -## Les types modifiable : listes et dictionnaires +### Les types modifiable : listes et dictionnaires Heureusement, il existe des variables modifiables comme les listes et les dictionnaires. -### Les listes - elles s'écrivent entre `[ ]` +#### Les listes - elles s'écrivent entre `[ ]` Les listes sont des élements très utiles, notamment quand vous souhaitez faire des boucles. @@ -273,7 +273,7 @@ print(newlist) {{% /box %}} -### Les dictionnaires - ils s'écrivent entre accolades `{}` +#### Les dictionnaires - ils s'écrivent entre accolades `{}` Un dictionnaire associe à une clé un autre élément, appelé une valeur : un chiffre, un nom, une liste, un autre dictionnaire etc. Le format d'un dictionnaire est le suivant: `{Clé : valeur}`. Il s'agit @@ -333,13 +333,13 @@ mon_dictionnaire_patchwork_good = \ 'Pimprenelle' : 18 } ``` -## A retenir +### A retenir - L'indentation du code est importante (4 espaces et pas une tabulation) - Une __liste__ est entre [] et on peut appeler les positions par leur place - Un __dictionnaire__, clé x valeur, s'écrit entre {} et on appelle un élément en fonction de la clé -# Questions pratiques : +## Questions pratiques : {{% box status="exercise" title="Exercice 1" icon="fas fa-pencil-alt" %}} @@ -386,7 +386,7 @@ dictionnaire_evangile["Matthieu"][0] {{% /box %}} -# Effectuer des opérations sur les objets de base `Python` +## Effectuer des opérations sur les objets de base `Python` Maintenant qu'on a vu quels objets existent en `Python`, nous allons @@ -403,12 +403,12 @@ permettra de plus développer ce concept. La même méthode (par exemple `append`) fonctionnera ainsi de manière différente selon le type d'objet. -## Premiers exemples de méthodes +### Premiers exemples de méthodes Avec les éléments définis dans la partie 1 (les listes, les dictionnaires) on peut faire appel à des méthodes qui sont directement liées à ces objets. -### Une méthode pour les listes +#### Une méthode pour les listes Pour ajouter un élément (`item`) dans une liste : on va utiliser la méthode _`.append()`_ @@ -420,7 +420,7 @@ ma_liste.append("Philippe") print(ma_liste) ``` -### Une méthode pour les dictionnaires +#### Une méthode pour les dictionnaires Pour connaitre l'ensemble des clés d'un dictionnaire, on appelle la méthode _`.keys()`_ @@ -431,7 +431,7 @@ mon_dictionnaire = {"Marc" : "Lion", "Matthieu" : ["Ange","Homme ailé"] , print(mon_dictionnaire.keys()) ``` -## Connaitre les méthodes d'un objet +### Connaitre les méthodes d'un objet Pour savoir quelles sont les méthodes d'un objet vous pouvez : @@ -441,10 +441,10 @@ Pour savoir quelles sont les méthodes d'un objet vous pouvez : des méthodes possibles. -# Les opérations et méthodes classiques des listes +## Les opérations et méthodes classiques des listes -## Créer une liste +### Créer une liste Pour créer un objet de la classe `list`, il suffit de le déclarer. Ici on affecte à __`x`__ une liste @@ -457,7 +457,7 @@ x = [ ] # crée une liste vide x = list () # crée une liste vide ``` -## Un premier test sur les listes +### Un premier test sur les listes Si on veut tester la présence d'un élément dans une liste, on l'écrit de la manière suivante : @@ -473,7 +473,7 @@ print(x in l) #vrai si x est un des éléments de l ``` -## `+`: une méthode pour concaténer deux listes +### `+`: une méthode pour concaténer deux listes On utilise le symbole `+` @@ -482,7 +482,7 @@ t = ["Antoine","David"] print(l + t) #concaténation de l et t ``` -## Pour trouver certains éléments d'une liste +### Pour trouver certains éléments d'une liste Pour chercher des élements dans une liste, on utilise la position dans la liste. @@ -494,7 +494,7 @@ l[1] # donne l'élément qui est en 2ème position de la liste l[1:3] # donne les éléments de la 2ème position de la liste à la 4ème exclue ``` -## Quelques fonctions des listes +### Quelques fonctions des listes Les listes embarquent ainsi nativement un certain nombre de méthodes qui sont pratiques. Cependant, pour avoir certaines informations @@ -513,7 +513,7 @@ del l[0 : 2] # supprime les éléments entre la position 0 et 2 exclue print(l) ``` -## Les méthodes des listes +### Les méthodes des listes On les trouve dans l'aide de la liste. On distingue les méthodes et les méthodes spéciales : visuellement, @@ -526,7 +526,7 @@ les autres sont des méthodes classiques. help(l) ``` -## A retenir et questions +### A retenir et questions A retenir : diff --git a/content/course/getting-started/06_rappels_fonctions/index.qmd b/content/course/getting-started/06_rappels_fonctions/index.qmd index 8ba8636d5..113f34c34 100644 --- a/content/course/getting-started/06_rappels_fonctions/index.qmd +++ b/content/course/getting-started/06_rappels_fonctions/index.qmd @@ -39,7 +39,7 @@ print_badges("content/course/getting-started/06_rappels_fonctions.qmd") ``` ::: -# Utilisation d'un module installé +## Utilisation d'un module installé `Python`, comme `R`, sont des langages construits sur le principe de briques. @@ -50,7 +50,7 @@ il faut __toujours préciser les packages que vous utilisez au début du code__, sinon `Python` ne reconnait pas les fonctions appelées. -## Import _module_ +### Import _module_ On charge un module grâce à la commande `import`. Pour chaque code que vous exécutez, @@ -122,7 +122,7 @@ print(array(5)) ``` -# Les tests +## Les tests Les tests permettent d'exécuter telle ou telle instruction selon la valeur d'une condition. @@ -133,7 +133,7 @@ Pour faire un test avec un bloc d'instructions, il faut toujours : - que l'expression à vérifier soit suivie de `:` - que le bloc d'instruction soit __forcément indenté__ -## Test avec contrepartie : `if` et `else` +### Test avec contrepartie : `if` et `else` Comme dans les autres langages, on teste une condition. Si elle est vérifiée, @@ -141,7 +141,7 @@ alors une instruction suit et sinon, une autre instruction est exécutée. Il est conseillé de toujours indiquer une contrepartie afin d'éviter les surprises. -### Test d'une équalité ou inéqualité +#### Test d'une égalité ou inégalité ```{python} x = 6 @@ -152,7 +152,7 @@ else : # la contrepartie si la condition if n'est pas réalisée print("x est plus petit que 5") ``` -### Test dans un intervalle +#### Test dans un intervalle ```{python} # on peut avoir des intervalles directement @@ -204,7 +204,7 @@ if x >= 5 : print("x est égal ou supérieur à 5") ``` -# Boucles +## Boucles Il existe deux types de boucles : les boucles ___`for`___ et les boucles ___`while`___ @@ -212,9 +212,9 @@ La boucle _`for`_ parcourt un ensemble, tandis que la boucle _`while`_ continue tant qu'une condition est vraie. -## Boucle `for` +### Boucle `for` -### Parcourir une liste croissantes d'entiers +#### Parcourir une liste croissantes d'entiers ```{python} # parcourt les entiers de 0 à n-1 inclus @@ -222,7 +222,7 @@ for i in range(0,3) : print(i) ``` -### Parcourir une liste décroissante d'entiers +#### Parcourir une liste décroissante d'entiers ```{python} # parcourt les entiers de 3 à n+1 inclus @@ -230,7 +230,7 @@ for i in range(3,0,-1) : print(i) ``` -### Parcourir une liste de chaines de caractères +#### Parcourir une liste de chaines de caractères On va faire une boucle sur les éléments d'une liste @@ -311,7 +311,7 @@ squares = [x**2 for x in range(10)] squares ``` -## Boucle while +### Boucle while Le bloc d'instruction d'une boucle __while__ est exécuté tant que la condition est vérifiée. @@ -330,7 +330,7 @@ else : print("y est plus grand que x et vaut",y) ``` -## Break et continue +### Break et continue Dans les boucles _for_ ou _while_ on peut avoir besoin d'ignorer ou de ne pas effectuer certaines itérations. __2 instructions utiles__ : @@ -355,7 +355,7 @@ for x in range(5) : print(x) ``` -# Créer ses fonctions +## Créer ses fonctions Les fonctions permettent de faire la même chose sans avoir à recopier le code plusieurs fois dans le même programme. Dès que vous le pouvez, faites des fonctions : le copier-coller est trop dangereux. @@ -419,7 +419,7 @@ somme_recursion(6) Les fonctions sont très utiles et nous vous invitons à les utiliser dès que vous le pouvez car elles permettent d'avoir un code clair et structuré, plutôt que des bouts de code éparpillés. -# Lever des exceptions +## Lever des exceptions Python peut rencontrer des erreurs en exécutant votre programme. @@ -483,9 +483,9 @@ print(inverse(0)) Il est recommandé de toujours __préciser le type d'erreur__ qu'on rencontre. Si on met uniquement "except" sans préciser le type, on peut passer à côté d'erreurs pour lesquelles la solution n'est pas universelle. -# A retenir et questions +## A retenir et questions -## A retenir +### A retenir - Toujours mettre ":" avant un bloc d'instructions - Indenter avant un bloc d'instructions (avec 4 espaces et non une tabulation !) @@ -494,7 +494,7 @@ Il est recommandé de toujours __préciser le type d'erreur__ qu'on rencontre. S - Préciser le type d'erreur pour les exceptions et potentiellement différencier les blocs d'instructions en fonction de l'erreur -## Questions +### Questions - Que fait ce programme ? diff --git a/content/course/getting-started/07_rappels_classes/index.qmd b/content/course/getting-started/07_rappels_classes/index.qmd index 5d78708d1..f4b2d05f4 100644 --- a/content/course/getting-started/07_rappels_classes/index.qmd +++ b/content/course/getting-started/07_rappels_classes/index.qmd @@ -39,7 +39,7 @@ print_badges("content/course/getting-started/07_rappels_classes.qmd") ``` ::: -# Qu'est-ce que la programmation orientée objet ? +## Qu'est-ce que la programmation orientée objet ? Le langage `Python` se base sur des objets et définit pour eux des actions. Selon le type d'objet, les actions seront différentes. @@ -65,13 +65,13 @@ syntaxe. On retrouvera régulière la syntaxe `objet.method` qui est au coeur de `Python`. Par exemple `pd.DataFrame.mean` se traduit par appliquer la méthode `mean` a un objet de type `pd.DataFrame`. -## Quand utilise-t-on cela dans le domaine de la _data-science_ ? +### Quand utilise-t-on cela dans le domaine de la _data-science_ ? Les réseaux de neurone programmés avec `Keras` ou `PyTorch` fonctionnent de cette manière. On part d'une structure de base et modifie les attributs (par exemple le nombre de couches) ou les méthodes. -# La définition d'un objet +## La définition d'un objet Pour définir un objet, il faut lui donner des caractéristiques et des actions, ce qu'il est, ce qu'il peut faire. @@ -85,11 +85,11 @@ Un objet est une instance d'une classe, c'est-à-dire un exemplaire issu de la c Ici nous allons essayer de créer une classe chat, avec des attributs pour caractériser le chat et des actions, pour voir ce qu'il peut faire avec un objet de la classe chat. -# Exemple : la Classe chat() +## Exemple : la Classe `chat()` -## Les attributs de la classe chat +### Les attributs de la classe chat -### Classe chat version 1 - premiers attributs +#### Classe chat version 1 - premiers attributs On veut pouvoir créer un objet chat() qui nous permettra à terme de créer une colonie de chats (on sait jamais ca peut servir ...). @@ -118,7 +118,7 @@ On nous dit bien que Mon chat est défini à partir de la classe chat, c'est ce que nous apprend la fonction type. Pour l'instant il n'a pas de nom -### Classe chat version 2 - autres attributs +#### Classe chat version 2 - autres attributs Avec un nom et une couleur, on ne va pas loin. On peut continuer à définir des attributs pour la classe chat de la même façon que précédemment. @@ -194,7 +194,7 @@ l_autre_chat.maitre = "Roger" print(l_autre_chat.couleur) ``` -## Les méthodes de la classe chat +### Les méthodes de la classe chat Les attributs sont des variables propres à notre objet, qui servent à le caractériser. @@ -202,7 +202,7 @@ Les méthodes sont plutôt des actions, comme nous l'avons vu dans la partie pr Par exemple, la méthode append de la classe list permet d'ajouter un élément dans l'objet list manipulé. -### Classe chat version 3 - première méthode +#### Classe chat version 3 - première méthode On peut définir une première méthode : nourrir @@ -258,7 +258,7 @@ mon_chat.nourrir('Saumon') print("Le contenu du ventre de martin : ",mon_chat.ventre) ``` -### Classe chat version 4 - autre méthode +#### Classe chat version 4 - autre méthode Avec un chat, on peut imaginer plein de méthodes. Ici on va définir une action "nourrir" et une autre action "litiere", qui consiste à vider l'estomac du chat. @@ -322,7 +322,7 @@ help(mon_chat.litiere) ``` -### ___facultatif___ Les méthodes spéciales +#### Les méthodes spéciales (facultatif) Si on reprend notre classe chat, il y a en réalité des méthodes spéciales que nous n'avons pas définies mais qui sont implicites. @@ -365,7 +365,7 @@ print(mon_chat.origine) Mais on peut modifier les méthodes spéciales de notre classe chat pour éviter d'avoir des erreurs d'attributs. On va aussi en profiter pour modifier la représentation de l'instance chat qui pour l'instant donne <\__main\__.chat object at 0x0000000005AB4C50> -### Classe chat version 5 - méthode spéciale +#### Classe chat version 5 - méthode spéciale ```{python} diff --git a/content/course/modelisation/0_preprocessing/index.qmd b/content/course/modelisation/0_preprocessing/index.qmd index 04089ba0f..abe2083bd 100644 --- a/content/course/modelisation/0_preprocessing/index.qmd +++ b/content/course/modelisation/0_preprocessing/index.qmd @@ -1,6 +1,6 @@ --- title: "Préparation des données pour construire un modèle" -date: 2020-10-15T13:00:00Z +date: 2023-07-15T13:00:00Z draft: false weight: 10 slug: preprocessing @@ -100,7 +100,7 @@ développé dans le cadre de l'initiative [`Inria Academy`](https://www.inria.fr ``` ::: -# Construction de la base de données +## Construction de la base de données Les sources de données étant diverses, le code qui construit la base finale est directement fourni. Le travail de construction d'une base unique est un peu fastidieux mais il s'agit d'un bon exercice, que vous pouvez tenter, @@ -280,7 +280,7 @@ fig_plotly.write_image("featured.png") Les cercles proportionnels permettent ainsi à l'oeil de se concentrer sur les zones les plus denses et non sur les grands espaces. -# Explorer la structure des données +## Explorer la structure des données La première étape nécessaire à suivre avant de se lancer dans la modélisation est de déterminer les variables à inclure dans le modèle. @@ -397,7 +397,7 @@ htmlsnip2.write_json("scatter.json") {{< chart data="scatter" >}} -# Transformer les données +## Transformer les données Les différences d'échelle ou de distribution entre les variables peuvent diverger des hypothèses sous-jacentes dans les modèles. @@ -444,7 +444,7 @@ C'est, en fait, la **standardisation** en `scikit` qui fait cela. ::: -## Standardisation +### Standardisation La standardisation consiste à transformer des données pour que la distribution empirique suive une loi $\mathcal{N}(0,1)$. Pour être performants, la plupart des modèles de machine learning nécessitent souvent d'avoir des données dans cette distribution. @@ -543,7 +543,7 @@ sns.distplot(X2[:,col_pos] , color="olive", ax=axes[1]) ``` -## Normalisation +### Normalisation La **normalisation** est l'action de transformer les données de manière à obtenir une norme ($\mathcal{l}_1$ ou $\mathcal{l}_2$) unitaire. @@ -612,7 +612,7 @@ np.sqrt(np.sum(X1**2, axis=1))[:10] # L2-norm ::: -## Encodage des valeurs catégorielles +### Encodage des valeurs catégorielles Les données catégorielles doivent être recodées sous forme de valeurs numériques pour être intégrés aux modèles de *machine learning*. diff --git a/content/course/modelisation/1_modelevaluation/index.qmd b/content/course/modelisation/1_modelevaluation/index.qmd index 4259d06a5..cc44a8cdb 100644 --- a/content/course/modelisation/1_modelevaluation/index.qmd +++ b/content/course/modelisation/1_modelevaluation/index.qmd @@ -1,6 +1,6 @@ --- title: "Evaluer la qualité d'un modèle" -date: 2020-10-15T13:00:00Z +date: 2023-07-15T13:00:00Z draft: false weight: 20 slug: performance @@ -49,7 +49,7 @@ print_badges("content/course/modelisation/1_modelevaluation.qmd") Nous allons ici voir des méthodes générales permettant de s'assurer que le modèle de _Machine Learning_ mobilisé est de qualité. -# Découper l'échantillon +## Découper l'échantillon Le chapitre précédent présentait le pipeline simple ci-dessous pour introduire à la notion d'entraînement d'un modèle: @@ -74,7 +74,7 @@ raffinement de l'approche pour obtenir un *pipeline* ayant plutôt cet aspect: ![](scikit_predict2.png) -# Le problème du sur-apprentissage +## Le problème du sur-apprentissage Le but du *Machine Learning* est de calibrer l’algorithme sur des exemples connus (données labellisées) afin de généraliser à des @@ -190,7 +190,7 @@ comparés pour plusieurs valeurs des hyperparamètres. Il existe d'autres types de validation croisée, notamment la *leave one out* qui consiste à considérer une fois exactement chaque observation comme l’échantillon de test (une *n-fold cross validation*). -# Mesurer la performance +## Mesurer la performance Jusqu'à présent, nous avons passé sous silence la question du support de $y$, c'est-à-dire de l'étendue des valeurs de notre variable d'intérêt. diff --git a/content/course/modelisation/2_SVM/index.qmd b/content/course/modelisation/2_SVM/index.qmd index 782df3cd6..5fc159b3c 100644 --- a/content/course/modelisation/2_SVM/index.qmd +++ b/content/course/modelisation/2_SVM/index.qmd @@ -1,6 +1,6 @@ --- title: "Classification: premier modèle avec les SVM" -date: 2020-10-15T13:00:00Z +date: 2023-07-15T13:00:00Z draft: false weight: 30 slug: SVM diff --git a/content/course/modelisation/3_regression/index.qmd b/content/course/modelisation/3_regression/index.qmd index 7667e631c..e97ccb361 100644 --- a/content/course/modelisation/3_regression/index.qmd +++ b/content/course/modelisation/3_regression/index.qmd @@ -1,6 +1,6 @@ --- title: "Régression : une introduction" -date: 2020-10-15T13:00:00Z +date: 2020-07-15T13:00:00Z draft: false weight: 40 slug: regression @@ -105,7 +105,7 @@ votes = getdata.create_votes_dataframes() ``` -# Principe général +## Principe général Le principe général de la régression consiste à trouver une loi $h_\theta(X)$ telle que @@ -122,7 +122,7 @@ très vaste de méthodes, selon la famille de modèles (paramétriques, non paramétriques, etc.) et la structure de modèles. -## La régression linéaire +### La régression linéaire C'est la manière la plus simple de représenter la loi $h_\theta(X)$ comme combinaison linéaire de variables $X$ et de paramètres $\theta$. Dans ce @@ -412,7 +412,7 @@ englober ces modèles. ``` ::: -## La régression logistique +### La régression logistique Ce modèle s'applique à une distribution binaire. Dans ce cas, $\mathbb{E}\_{\theta}(Y|X) = \mathbb{P}\_{\theta}(Y = 1|X)$. diff --git a/content/course/modelisation/4_featureselection/index.qmd b/content/course/modelisation/4_featureselection/index.qmd index 2bc906102..c9f0d5802 100644 --- a/content/course/modelisation/4_featureselection/index.qmd +++ b/content/course/modelisation/4_featureselection/index.qmd @@ -1,6 +1,6 @@ --- title: "Sélection de variables : une introduction" -date: 2020-10-15T13:00:00Z +date: 2023-07-15T13:00:00Z draft: false weight: 50 slug: lasso @@ -94,9 +94,9 @@ modèles non parcimonieux. Par exemple, le BIC. * construire des modèles pour lesquels la statistique d'intérêt pénalise l'absence de parcimonie (ce que l'on va souhaiter faire ici). -# Principe du LASSO +## Principe du LASSO -## Principe général +### Principe général La classe des modèles de *feature selection* est ainsi très vaste et regroupe un ensemble très diverse de modèles. Nous allons nous focaliser sur le LASSO @@ -110,7 +110,7 @@ Contrairement à la régression linéaire classique, elles fonctionnent égaleme dans un cadre où $p>N$, c'est à dire où le nombre de régresseurs est très grand puisque supérieur au nombre d'observations. -## Pénalisation +### Pénalisation En adoptant le principe d'une fonction objectif pénalisée, le LASSO permet de fixer un certain nombre de coefficients à 0. @@ -137,7 +137,7 @@ où $\lambda$ est une réécriture de la régularisation précédente. ``` ::: -## Première régression LASSO +### Première régression LASSO Avant de se lancer dans les exercices, on va éliminer quelques colonnes redondantes, celles qui concernent les votes des partis concurrents (forcément très diff --git a/content/course/modelisation/5_clustering/index.qmd b/content/course/modelisation/5_clustering/index.qmd index 190fbed68..17c71a28d 100644 --- a/content/course/modelisation/5_clustering/index.qmd +++ b/content/course/modelisation/5_clustering/index.qmd @@ -1,6 +1,6 @@ --- title: "Clustering" -date: 2020-10-20T13:00:00Z +date: 2023-07-20T13:00:00Z draft: false weight: 60 slug: clustering @@ -74,7 +74,7 @@ votes = getdata.create_votes_dataframes() ``` -# Introduction sur le *clustering* +## Introduction sur le *clustering* Jusqu'à présent, nous avons fait de l'apprentissage supervisé puisque nous connaissions la vraie valeur de la variable à expliquer/prédire (`y`). Ce n'est plus le cas avec @@ -118,9 +118,9 @@ image représentative par groupe, et labelliser ces images représentatives au l Les méthodes de *clustering* sont nombreuses. Nous allons nous pencher sur la plus intuitive : les *k-means*. -# Les k-means +## Les k-means -## Principe +### Principe L'objectif des *k-means* est de partitionner l'espace des observations en trouvant des points (*centroids*) jouant le rôle de centres de gravité pour lesquels les observations proches peuvent être regroupées dans une classe homogène. L'algorithme *k-means* fonctionne par itération, en initialisant les centroïdes puis en les mettant à jour à chaque @@ -298,7 +298,7 @@ Le modèle renvoie les `cluster_centers_`, les labels `labels_`, l'inertia `iner ``` ::: -## Choisir le nombre de clusters +### Choisir le nombre de clusters Le nombre de clusters est fixé par le modélisateur. Il existe plusieurs façons de fixer ce nombre : @@ -419,14 +419,14 @@ observations de son cluster. Cela signifie que l'observation est mal classée. -## Autres méthodes de clustering +### Autres méthodes de clustering Il existe de nombreuses autres méthodes de clustering. Parmi les plus connues, on peut citer deux exemples en particulier : - DBSCAN - les mélanges de Gaussiennes -### DBSCAN +#### DBSCAN L'[algorithme DBSCAN](https://fr.wikipedia.org/wiki/DBSCAN) est implémenté dans `sklearn.cluster`. Il peut être utilisé pour faire de la détection d'anomalies @@ -440,7 +440,7 @@ Les observations qui ne sont pas des *core instances* et qui n'en ont pas dans l vont être détectées comme des anomalies. -### Les mélanges de gaussiennes +#### Les mélanges de gaussiennes En ce qui concerne la théorie, voir le cours [Probabilités numériques et statistiques computationnelles, M1 Jussieu, V.Lemaire et T.Rebafka](http://www.proba.jussieu.fr/pageperso/rebafka/#enseignement) Se référer notamment aux notebooks pour l'algorithme EM pour mélange gaussien. diff --git a/content/course/modelisation/6_pipeline/index.qmd b/content/course/modelisation/6_pipeline/index.qmd index 5789a04df..bd4c5b72f 100644 --- a/content/course/modelisation/6_pipeline/index.qmd +++ b/content/course/modelisation/6_pipeline/index.qmd @@ -41,7 +41,7 @@ print_badges("content/course/modelisation/6_pipeline.qmd") ``` ::: -# Pourquoi utiliser les pipelines ? +## Pourquoi utiliser les pipelines ? Les chapitres précédents ont permis de montrer des bouts de code épars pour entraîner des modèles ou faire du _preprocessing_. @@ -96,7 +96,7 @@ je recommande): -# Comment créer un *pipeline* +## Comment créer un *pipeline* Un *pipeline* est un enchaînement d'opérations qu'on code en enchainant des pairs *(clé, valeur)*: @@ -171,7 +171,7 @@ print(estimator_html_repr(grid_search)) -## Données utilisées +### Données utilisées Nous allons utiliser les données de transactions immobilières DVF pour chercher la meilleure manière de prédire, sachant les caractéristiques d'un bien, son @@ -244,7 +244,7 @@ mutations['surface'] = mutations.loc[:, mutations.columns[mutations.columns.str. -# Un premier pipeline: *random forest* sur des variables standardisées +## Un premier pipeline: *random forest* sur des variables standardisées Notre premier *pipeline* va nous permettre d'intégrer ensemble: @@ -255,7 +255,7 @@ Pour le moment, on va prendre comme acquis un certain nombre de variables explicatives (les *features*) et les hyperparamètres du modèle -## Définition des ensembles train/test +### Définition des ensembles train/test Nous allons donc nous restreindre à un sous-ensemble de colonnes dans un premier temps : @@ -300,7 +300,7 @@ X_train, X_test, y_train, y_test = train_test_split(mutations2[xvars2], mutation ``` -## Définition du premier pipeline +### Définition du premier pipeline Nous allons donc partir d'un *random forest* avec des valeurs d'hyperparamètres données. @@ -432,7 +432,7 @@ features_names ``` -## _Variable importance_ +### _Variable importance_ On ne va représenter, parmi notre ensemble important de colonnes, que celles qui ont une importance non nulle. Grâce à notre vecteur `features_names`, @@ -483,7 +483,7 @@ consulter la {{% /box %}} -## Prédiction +### Prédiction L'analyse de l'importance de variables permet de mieux comprendre le fonctionnement interne des *random forests*. @@ -528,7 +528,7 @@ g.figure.get_figure() ``` -# Recherche des hyperparamètres optimaux avec une validation croisée +## Recherche des hyperparamètres optimaux avec une validation croisée On détecte que le premier modèle n'est pas très bon et ne nous aidera pas vraiment à évaluer de manière fiable la maison de nos rêves. @@ -746,7 +746,7 @@ ax ``` -## Remarque sur la performance +### Remarque sur la performance Les estimations sont, par défaut, menées de manière séquentielle (l'une après l'autre). Nous sommes cependant face à un problème @@ -755,7 +755,7 @@ Pour gagner en performance, il est recommandé d'utiliser l'argument `n_jobs=-1`. -## Remarque sur l'échantillonnage +### Remarque sur l'échantillonnage En l'état actuel de l'échantillonnage entre train et test au sein de la _grid search_, @@ -790,7 +790,7 @@ cv = StratifiedGroupKFold(n_splits=5) #grid_search.fit(pd.concat((X_train, X_test), axis=0), np.concatenate([y_train,y_test]), cv = cv, groups = pd.concat((X_train, X_test), axis=0)['dep']) ~~~ -# Eléments supplémentaires à venir +## Eléments supplémentaires à venir Ce chapitre est amené à être enrichi des éléments suivants (cf. [#207](https://github.com/linogaliana/python-datascientist/issues/207)) @@ -802,9 +802,9 @@ Ce chapitre est amené à être enrichi des éléments suivants -# Annexes: pipelines alternatifs +## Annexes: pipelines alternatifs -## Préalable : quelques méthodes pour gagner en flexibilité dans le preprocessing +### Préalable : quelques méthodes pour gagner en flexibilité dans le preprocessing Notre *DataFrame* comporte des types hétérogènes de variables: @@ -979,7 +979,7 @@ print(estimator_html_repr(pipe3)) ``` -# Références +## Références - Breiman L (2001). _"Random Forests". Machine Learning_. 45 (1): 5–32. diff --git a/content/course/visualisation/maps/index.qmd b/content/course/visualisation/maps/index.qmd index 922e3c648..b874298e5 100644 --- a/content/course/visualisation/maps/index.qmd +++ b/content/course/visualisation/maps/index.qmd @@ -1,6 +1,6 @@ --- title: "De belles cartes avec python: mise en pratique" -date: 2020-10-06T13:00:00Z +date: 2023-07-06T13:00:00Z draft: false weight: 20 slug: cartoTP @@ -663,9 +663,9 @@ La carte obtenue doit ressembler à la suivante: m ``` -# Exercices supplémentaires +## Exercices supplémentaires -## Densité de population dans la petite couronne parisienne +### Densité de population dans la petite couronne parisienne Pour cet exercice, le package [`cartiflette`](https://github.com/InseeFrLab/cartogether) va être pratique pour récupérer un fonds de carte mélangeant arrondissements diff --git a/content/course/visualisation/matplotlib/index.qmd b/content/course/visualisation/matplotlib/index.qmd index c563fb21e..5dda552e2 100644 --- a/content/course/visualisation/matplotlib/index.qmd +++ b/content/course/visualisation/matplotlib/index.qmd @@ -1,7 +1,6 @@ --- title: "De beaux graphiques avec python: mise en pratique" -date: 2020-09-24T13:00:00Z -draft: false +date: 2023-07-14T13:00:00Z weight: 10 slug: matplotlibTP type: book @@ -486,14 +485,14 @@ Alors qu'avec le thème sombre (question 2), on obtient : {{< chart data="plotly2" >}} -# Exercices supplémentaires +## Exercices supplémentaires Pour ces exercices, il est recommandé de s'inspirer des modèles présents dans la librairie de graphiques `Python` présentée dans https://www.python-graph-gallery.com/ -## Les lollipop chart +### Les lollipop chart Cet exercice permet de s'entraîner sur le fichier des naissances et des @@ -635,7 +634,7 @@ df.head(3) ``` -## Représentation graphique +### Représentation graphique Vous pouvez vous aider du modèle présent dans https://www.python-graph-gallery.com @@ -761,10 +760,7 @@ L'animation obtenue est la suivante: -# Exercices supplémentaires -https://plotly.com/python/v3/3d-network-graph/ - -# Ressources supplémentaires +## Ressources supplémentaires - [Un post de datawrapper sur les textes dans les visualisations de données](https://blog.datawrapper.de/text-in-data-visualizations/?utm_source=substack&utm_medium=email)