'3.12.6 | packaged by conda-forge | (main, Sep 30 2024, 18:08:52) [GCC 13.3.0]'
1 Introduction
Les data scientists sont souvent associés à la mise en oeuvre
de modèles complexes d’intelligence artificielle.
Le succès médiatique de ce type d’outils, notamment ChatGPT
,
n’y est pas pour rien. Cependant, la modélisation n’est souvent
qu’une
phase du travail du data scientist, un peu comme la visualisation.
D’ailleurs, dans certaines organisations où la division des tâches
est plus poussée, les data engineers sont au moins aussi
impliqués dans la phase de modélisation que les data scientists.
C’est souvent un péché de jeunesse de penser qu’on peut résumer le travail du data scientist exclusivement à la phase de modélisation. Cette dernière dépend très fortement de la qualité du travail de nettoyage et structuration des données mis en oeuvre en amont. La mise en oeuvre de modèles complexes, qui s’accomodent de données peu structurées, est gourmande en ressources et coûteuse. Ce ne sont donc qu’un nombre limité d’acteurs qui peuvent entraîner, ex nihilo, des grands modèles de langage1, capables de dépenser au moins 300 000 dollars dans l’entraînement d’un modèle, avant même toute phase d’inférence (Izsak, Berchansky, et Levy 2021). Ces besoins computationnels pour entraîner de grands modèles de langage sont d’ailleurs assez gourmands en énergie, ce qui peut amener à des empreintes carbones non négligeables (Strubell, Ganesh, et McCallum 2019; Arcep 2019).
Heureusement, il est possible de mettre en oeuvre des modélisations plus légères, celles que nous présenterons dans les prochains chapitres. Cette partie du cours se concentrera principalement sur la présentation d’algorithmes de machine learning (apprentissage automatique en Français). On peut définir ce terme de manière large comme un ensemble de techniques permettant, à partir d’un ensemble d’observations, à des algorithmes de dégager des structures ou régularités statistiques sans que celles-ci aient été définies a priori par les modélisateurs. Cette définition permet de distinguer cette approche d’autres champs de l’intelligence artificielle[^russel-norvig], notamment les IA symboliques, où chaque observation est caractérisée à partir d’un ensemble de règles exhaustives et prédéfinies. Bien que cette définition large permette d’englober la statistique inférentielle traditionnelle, elle permet néanmoins de comprendre la différence philosophique majeure entre l’approche par apprentissage automatique et l’économétrie comme nous allons pouvoir l’évoquer par la suite.
Russell et Norvig (2020) définissent l’intelligence artificielle de la manière suivante:
« L’étude des agents [intelligents] qui reçoivent des perceptions de l’environnement et agissent. Chacun de ces agents est mis en œuvre par une fonction qui associe les perceptions aux actions, et nous couvrons différentes manières de de représenter ces fonctions, telles que les systèmes de production, les agents réactifs, les planificateurs logiques, les réseaux de neurones et les systèmes de gestion de l’information et les systèmes de théorie de la décision »
Cette définition très large permet d’inclure beaucoup d’approches différentes dans le champ de l’intelligence artificielle. Elle définit l’intelligence artificielle comme une règle de décision, très générique, issues de données. Pour formaliser mathématiquement, il s’agit de relier des perceptions \(\mathbb{X}\), c’est-à-dire des faits pris comme donnés, à une décision \(y\) grâce à une règle de décision \(f\) : \(y=f(\mathbb{X})\) (la décision \(y\) est issue d’un ensemble de décisions, de taille restreinte ou large selon le phénomène noté \(\mathcal{Y}\)). La manière dont est constuite cette fonction \(f\) distinguera différents champs de l’intelligence artificielle.
L’AI Act européen de 2024 propose une définition assez similaire bien qu’elle soit exprimée dans des termes différents:
« Système basé sur une machine qui est conçu pour fonctionner avec différents niveaux d’autonomie et qui peut faire preuve d’adaptabilité après son déploiement, et qui, pour des objectifs explicites ou implicites, déduit, à partir des données qu’il reçoit, comment générer des résultats tels que des prédictions, du contenu, des recommandations ou des décisions qui peuvent influencer des environnements physiques ou virtuels »
Dans le cadre de ce cours, nous n’allons parler que des approches constuites autour de l’apprentissage, c’est-à-dire les approches qui visent à induire des lois, forcément incertaines, à partir d’un ensemble de données. Cette approche est très différente des IA symboliques qui offrent une autonomie limitée à la machine puisque son comportement est cadré par un ensemble, parfois large, de règles déterministes.
👈️ Intelligence artificielle
Le choix de se concentrer sur des algorithmes simples de machine learning dans la partie modélisation plutôt que d’aller directement aux réseaux de neurone, permet d’abord de présenter la démarche scientifique liée à l’apprentissage, notamment pour obtenir des performances satisfaisantes lorsqu’on extrapole sur des données non rencontrées lors de la phase d’apprentissage. Cela permet également de souligner des enjeux qui seront également valables pour des modèles plus complexes, par exemple la préparation des données permettant de réduire le bruit dans les données afin que les modèles puissent dégager des structures plus fiables dans les données. En fait, pour être plus pertinent que des approches plus parcimonieuses, les techniques de deep learning, notamment les réseaux de neurones, nécessitent soit des volumes de données très importants (des millions voire dizaine de millions d’observations) soit des données à la structure complexe comme le langage naturel ou les images. Dans de nombreux cas, des modèles plus simples comme les techniques d’apprentissage automatique (machine learning) suffisent largement.
2 La modélisation, une approche au coeur de la statistique
Un modèle statistique est une représentation simplifiée et structurée d’un phénomène réel, construite à partir d’observations issues d’un ensemble partiel de données.
👈️ Modèle statistique
Un modèle vise à capturer les relations et les structures sous-jacentes au sein de ces données, permettant ainsi de formuler des hypothèses, d’effectuer des prédictions et d’extrapoler des conclusions au-delà de l’ensemble de données mesurées. Les modèles statistiques fournissent ainsi un cadre analytique pour explorer, comprendre et interpréter les informations contenues dans les données.
Représenter la réalité sous la forme d’un modèle est un principe à la base de la statistique comme discipline scientifique et ayant des applications dans de nombreux champs disciplinaires : économie, sociologie, géographique, biologie, physique, etc. Selon les disciplines, le nom donné peut varier mais on retrouve régulièrement la même approche scientifique : le modélisateur construit des relations entre plusieurs variables théoriques ayant des contreparties empiriques afin de quantifier la relation entre celles-ci.
Cette approche est au coeur de la statistique inférentielle, par opposition à la statistique descriptive. Dans les deux cas, l’objectif est d’utiliser un échantillon, c’est-à-dire un ensemble réduit de données observées, pour mieux connaître une population, l’ensemble de données concernées par une étude. La différence entre les deux approches est liée à la manière dont cette extrapolation est faite. Dans le cadre de la statistique inférentielle, on tend plutôt à inférer des lois générales, avec des marges d’incertitude statistique, à partir des données observées, que ce soit sur la distribution statistique d’une variable (statistique univariée) ou sur les relations entre plusieurs. La statistique descriptive se contente, quant à elle, de synthétiser l’information dans un jeu de données, souvent par le biais de moments de la distribution (moyenne, quantiles, etc.) sans prétention à fournir une explication générale sur le processus générateur de données.
👈️ Statistique inférentielle, statistique descriptive, échantillon, population
Ces deux approches ne sont pas inconciliables, au contraire elles sont complémentaires. Se lancer dans une approche inférentielle sans avoir mené une approche descriptive approfondie amènera souvent la première vers des impasses ou des conclusions peu fiables. L’approche inférentielle peu également nourrir une analyse descriptive approfondie en permettant de hiérarchiser l’information présente dans un jeu de données et ainsi guider le travail descriptif en permettant celui-ci de se concentrer sur les faits saillants.
Dans le domaine de la recherche économique, les modèles empiriques servent généralement à associer certains paramètres structurants des modèles de comportements économiques à des valeurs quantitatives. Les modèles statistiques, comme les modèles économiques, présentent néanmoins toujours une part d’irréalisme (Friedman 1953; Salmon 2010) et accepter de manière trop littérale les implications d’un modèle, même s’il a de bonnes performances prédictives, peut être dangereux et relever d’un biais scientiste. On sélectionne plutôt le moins mauvais modèle que le vrai processus générateur des données.
Dans l’enseignement de l’ENSAE la modélisation empirique se retrouve principalement dans deux domaines d’application : le machine learning et l’économétrie. La différence est certes sémantique - la régression linéaire peut être considérée comme une technique de machine learning ou d’économétrie - mais elle est également conceptuelle :
- Dans le domaine du machine learning, la structure imposée par le modélisateur est minimale et ce sont plutôt les algorithmes qui, sur des critères de performance statistique, vont amener à choisir une loi mathématique qui correspond au mieux aux données ;
- En économétrie, les hypothèses de structure des lois sont plus fortes (même dans un cadre semi ou non-paramétrique) et sont plus souvent imposées par le modélisateur.
Dans cette partie du cours, nous allons principalement parler de machine learning car il s’agit d’une perspective plus opérationnelle que l’économétrie qui est plus directement associée à des concepts statistiques complexes comme la théorie asymptotique.
L’adoption du machine learning dans la littérature économique a été longue car la structuration des données est souvent le pendant empirique d’hypothèses théoriques sur le comportement des acteurs ou des marchés (Athey et Imbens 2019; Charpentier, Flachaire, et Ly 2018). Pour caricaturer, l’économétrie s’attacherait à comprendre la causalité de certaines variables sur une autre. Cela implique que ce qui intéresse l’économètre est principalement de l’estimation des paramètres (et l’incertitude sur l’estimation de ceux-ci) qui permettent de quantifier l’effet d’une variation d’une variable sur une autre. Toujours pour caricaturer, le machine learning se focaliserait sur un simple objectif prédictif en exploitant les relations de corrélations entre les variables. Dans cette perspective, l’important n’est pas la causalité mais le fait qu’une variation de \(x\)% d’une variable permette d’anticiper un changement de \(\beta x\) de la variable d’intérêt ; peu importe la raison. Mullainathan et Spiess (2017) ont ainsi, pour simplifier, proposé la différence fondamentale qui suit : l’économétrie se préoccupe de \(\widehat{\beta}\) là où le machine learning se focalise sur \(\widehat{y}\). Les deux sont bien sûr reliés dans un cadre linéaire mais cette différence d’approche a des implications importantes sur la structure des modèles étudiés, notamment leur parcimonie2.
3 Quelques définitions
Dans cette partie du cours nous allons employer un certain nombre de termes devenus familiers aux praticiens du machine learning mais qui méritent d’être explicités pour comprendre les prochains chapitres.
3.1 Entraînement et inférence
Le machine learning est une approche opérationnelle: l’objectif est généralement d’estimer des relations entre variables observées pour avoir une règle de décision puis extrapoler celle-ci sur un autre échantillon de données. Les deux prochains chapitres visent à présenter la démarche scientifique pour avoir une extrapolation de qualité.
L’entraînement (ou apprentissage) est la phase du travail où un modèle de machine learning affine des relations à partir d’un ensemble de données. Pour faire l’analogie avec l’apprentissage humain, il s’agit de la phase où le machine learning va réviser ses cours avant le contrôle.
👈️ Apprentissage, entraînement
L’inférence est la phase où la règle de décision est mise en oeuvre sur de nouvelles données, qui n’ont pas été vues lors de l’entraînement. Pour reprendre l’analogie précédente, il peut s’agir de nouvelles questions lors du contrôle (phase d’évaluation) ou de l’application au monde réel des connaissances acquises lors de l’apprentissage.
👈️ Inférence
3.2 Machine learning et deep learning
Jusqu’à présent nous avons beaucoup utilisé, sans le définir, le concept de machine learning, dont la traduction française est apprentissage automatique mais le terme anglo-saxon est suffisamment utilisé pour être considéré comme standard.
Le machine learning est un ensemble de techniques algorithmiques qui permettent aux ordinateurs d’apprendre, à partir d’exemples, à ajuster un modèle sans avoir explicitement défini celui-ci. A partir d’algorithmes itératifs et d’une métrique de performance, des règles de classification ou de prédiction vont permettre de mettre en relation des caractéristiques (features) avec une variable d’intérêt (label)3.
👈️ Machine learning, label, features
De nombreux algorithmes existent et se distinguent sur la manière d’introduire une structure plus ou
moins formelle dans la relation entre les variables observées. Nous n’allons voir que quelques-uns
de ces algorithmes : support vector machine (SVM), régression logistique, arbres de décision, forêts
aléatoires, etc. Simples à mettre en oeuvre grâce à la librairie Scikit-Learn
, ils permettront
déjà de comprendre la démarche originale du machine learning que vous pourrez approfondir
ultérieurement.
Au sein de la grande famille des algorithmes de machine learning, tendent de plus à plus à devenir autonomes les techniques de réseaux de neurone. Les techniques qui s’appuient sur les réseaux de neurones sont regroupées dans une famille qu’on appelle deep learning (apprentissage profond en Français). Ces réseaux sont inspirés du fonctionnement du cerveau humain et sont composés de nombreuses couches de neurones interconnectés. La structure canonique bien connue est illustrée dans la Figure 3.1. Le deep learning est intéressant pour créer des modèles capables d’apprendre de représentations de données complexes et abstraites à partir de données brutes, ce qui évite parfois la complexe tâche de définir manuellement des caractéristiques spécifiques à cibler. Les champs de l’analyse d’image (computer vision) ou du traitement du langage naturel sont les principaux cas d’application de ces méthodes.
👈️ Deep learning, réseaux de neurone
Les réseaux de neurone sont des modèles à la structure complexe. Sur des données volumineuses et complexes, ils peuvent être lourds, voire impossible à entraîner sur des machines classiques. Si les données qu’on possède correspondent à celles attendues par le modèle, il est tout à fait possible d’utiliser celui-ci pour l’inférence sans le ré-entraîner ou en mettant en oeuvre un apprentissage à la marge, dit fine tuning. Pour reprendre l’analogie avec l’apprentissage humain, le fine tuning ressemble à la manière dont on va mettre à jour ses connaissances avec un nouveau cours avant un contrôle. Il n’est pas nécessaire de tout réapprendre, seulement de peaufiner ses connaissances avec les nouveautés du cours.
De nombreux modèles sont mis à disposition sur HuggingFace
, la
plateforme de partage de modèles de deep learning (le Github
du deep learning en quelques sortes). HuggingFace
propose
propose aussi des cours sur le sujet, notamment sur le traitement du langage naturel (NLP). Nous ferons du traitement du langage naturel dans la prochaine partie de ce cours mais
de manière plus modeste en revenant sur les concepts nécessaires avant de mettre en oeuvre
une modélisation sophistiquée du langage.
👈️ Fine tuning
Nous n’allons pas vraiment parler dans cette partie du cours de deep learning car ces modèles, pour être pertinents, nécessitent soit des données structurées d’un volume important, ce qui est rarement disponible en open data, et pour lesquelles les relations entre variables sont complexes, soit des données non structurées telles que des données textuelles, des images, des vidéos, etc. Les données textuelles sont l’objet de la prochaine partie du cours car elles font appel à des concepts spécifiques, qui nécessitent déjà la compréhension des enjeux de la modélisation sur données structurées.
3.3 Apprentissage supervisé ou non supervisé
Une ligne de clivage importante entre les méthodes à mettre en oeuvre est le fait d’observer ou non le label (la variable \(y\)) qu’on désire modéliser.
Prenons par exemple un site de commerce qui dispose d’informations sur ses clients comme l’âge, le sexe, le lieu de résidence. Ce site peut désirer exploiter cette information de différentes manières pour modéliser le comportement d’achat.
En premier lieu, ce site peut désirer anticiper le volume d’achat d’un nouveau client ayant certaines caractéristiques. Dans ce cas, il est possible d’utiliser les montants dépensés par d’autres clients en fonction de leurs caractéristiques. L’information pour notre nouveau client n’est pas mesurée mais elle peut s’appuyer sur un ensemble d’observations de la même variable.
Mais il est tout à fait possible d’entraîner un modèle sur un label qu’on ne mesure pas, en supposant qu’il fasse sens. Par exemple notre site de commerce peut désirer déterminer, en fonction des caractéristiques de notre nouveau client et de sa clientèle existante, s’il appartient à tel ou tel groupe de consommateurs : les dépensiers, les économes… Bien sûr on ne sait jamais a priori à quel groupe appartient un consommateur mais le rapprochement entre consommateurs ayant un comportement similaire permettra de donner du sens à cette catégorie. Dans ce cas, l’algorithme apprendra à reconnaître quelles caractéristiques sont structurantes dans la constitution de groupes au comportement similaire et permettra d’associer tout nouveau consommateur à un groupe.
Ces deux exemples illustrent l’approche différente selon qu’on essaie de construire des modèles sur un label observé ou non. Cela constitue même l’une des dualités fondamentales dans les techniques de machine learning :
👈️ Apprentissage supervisé, apprentissage non supervisé
- Apprentissage supervisé : la valeur cible est connue et peut être utilisée pour évaluer la qualité d’un modèle ;
- Apprentissage non supervisé : la valeur cible est inconnue et ce sont des critères statistiques qui vont amener à sélectionner la structure de données la plus plausible.
Cette partie du cours illustrera ces deux approches de manière différente à partir du même jeu de données, les résultats des élections américaines. Dans le cas de l’apprentissage supervisé, nous chercherons à modéliser directement le résultat des candidats aux élections (soit le score, soit le gagnant). Dans le cas de l’apprentissage non supervisé, nous essaierons de regrouper les territoires au comportement de vote similaire en fonction de facteurs socio-démographiques.
3.4 Classification et régression
Une deuxième dualité fondamentale qui est déterminante dans le choix de la méthode de machine learning à mettre en oeuvre est la nature du label. S’agit-il d’une variable continue ou d’une variable discrète, c’est-à-dire prenant un nombre limité de modalités ?
Cette différence de nature entre les données amène à distinguer deux types d’approche :
👈️ Classification, régression
- Dans les problématiques de classification, où notre label \(y\) a un nombre fini de valeurs4, on cherche à prédire dans quelle classe ou à quel groupe il est possible de rattacher nos données. Par exemple, si vous prenez du café le matin, faites-vous partie du groupe des personnes ronchons au lever ? Les métriques de performance utilisent généralement la proportion de bonnes ou mauvaises classifications pour estimer la qualité d’un modèle.
- Dans les problématiques de régression, où notre label est une grandeur numérique, on cherche à prédire directement la valeur de notre variable dans le modèle. Par exemple, si vous avez tel ou tel âge, quel est votre dépense quotidienne en fast food ? Les métriques de performance sont généralement des moyennes plus ou moins sophistiquées d’écarts entre la prédiction et la valeur observée.
En résumé, l’aide-mémoire suivante, issue de l’aide de Scikit-Learn
, peut déjà donner de premiers enseignements sur les différentes familles de modèles :
4 Données
La plupart des exemples de cette partie s’appuient sur les résultats des élections US 2020 au niveau comtés. Plusieurs bases sont utilisées pour cela :
- Les données électorales sont une reconstruction à partir des données du MIT Election lab
proposées sur
Github
partonmcg
ou directement disponibles sur le site du MIT Election Lab. - Les données socioéconomiques (population, données de revenu et de pauvreté, taux de chômage, variables d’éducation) proviennent de l’USDA (source)
- Le shapefile utilisé pour les cartes provient des données du Census Bureau. Le fichier peut être téléchargé directement depuis cet url: https://www2.census.gov/geo/tiger/GENZ2019/shp/cb_2019_us_county_20m.zip
Le code pour construire une base unique à partir de ces sources diverses est visible ci-dessous, pour les curieux :
Voir le code de récupération des données
import urllib
import urllib.request
import os
import zipfile
from urllib.request import Request, urlopen
from pathlib import Path
import numpy as np
import pandas as pd
import geopandas as gpd
def download_url(url, save_path):
with urllib.request.urlopen(url) as dl_file:
with open(save_path, "wb") as out_file:
out_file.write(dl_file.read())
def create_votes_dataframes():
"data").mkdir(parents=True, exist_ok=True)
Path(
download_url("https://www2.census.gov/geo/tiger/GENZ2019/shp/cb_2019_us_county_20m.zip",
"data/shapefile",
)with zipfile.ZipFile("data/shapefile", "r") as zip_ref:
"data/counties")
zip_ref.extractall(
= gpd.read_file("data/counties/cb_2019_us_county_20m.shp")
shp = shp[~shp["STATEFP"].isin(["02", "69", "66", "78", "60", "72", "15"])]
shp
shp
= pd.read_csv(
df_election "https://raw.githubusercontent.com/tonmcg/US_County_Level_Election_Results_08-20/master/2020_US_County_Level_Presidential_Results.csv"
)2)
df_election.head(= pd.read_excel(
population "https://www.ers.usda.gov/webdocs/DataFiles/48747/PopulationEstimates.xls?v=290.4",
=2,
header={"FIPStxt": "FIPS"})
).rename(columns= pd.read_excel(
education "https://www.ers.usda.gov/webdocs/DataFiles/48747/Education.xls?v=290.4",
=4,
header={"FIPS Code": "FIPS", "Area name": "Area_Name"})
).rename(columns= pd.read_excel(
unemployment "https://www.ers.usda.gov/webdocs/DataFiles/48747/Unemployment.xls?v=290.4",
=4,
header={"fips_txt": "FIPS", "area_name": "Area_Name", "Stabr": "State"})
).rename(columns= pd.read_excel(
income "https://www.ers.usda.gov/webdocs/DataFiles/48747/PovertyEstimates.xls?v=290.4",
=4,
header={"FIPStxt": "FIPS", "Stabr": "State", "Area_name": "Area_Name"})
).rename(columns
= [
dfs "FIPS", "State"])
df.set_index([for df in [population, education, unemployment, income]
]= pd.concat(dfs, axis=1)
data_county = df_election.merge(
df_election ="county_fips", right_on="FIPS"
data_county.reset_index(), left_on
)"county_fips"] = df_election["county_fips"].astype(str).str.lstrip("0")
df_election["FIPS"] = shp["GEOID"].astype(str).str.lstrip("0")
shp[= shp.merge(df_election, left_on="FIPS", right_on="county_fips")
votes
= Request(
req "https://dataverse.harvard.edu/api/access/datafile/3641280?gbrecs=false"
)
req.add_header("User-Agent",
"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:77.0) Gecko/20100101 Firefox/77.0",
)= urlopen(req)
content = pd.read_csv(content, sep="\t")
df_historical # df_historical = pd.read_csv('https://dataverse.harvard.edu/api/access/datafile/3641280?gbrecs=false', sep = "\t")
= df_historical.dropna(subset=["FIPS"])
df_historical "FIPS"] = df_historical["FIPS"].astype(int)
df_historical["share"] = (
df_historical["candidatevotes"] / df_historical["totalvotes"]
df_historical[
)= df_historical[["year", "FIPS", "party", "candidatevotes", "share"]]
df_historical "party"] = df_historical["party"].fillna("other")
df_historical[
= df_historical.pivot_table(
df_historical_wide ="FIPS", values=["candidatevotes", "share"], columns=["year", "party"]
index
)= [
df_historical_wide.columns "_".join(map(str, s)) for s in df_historical_wide.columns.values
]= df_historical_wide.reset_index()
df_historical_wide "FIPS"] = df_historical_wide["FIPS"].astype(str).str.lstrip("0")
df_historical_wide["FIPS"] = votes["GEOID"].astype(str).str.lstrip("0")
votes[= votes.merge(df_historical_wide, on="FIPS")
votes "winner"] = np.where(
votes["votes_gop"] > votes["votes_dem"], "republican", "democrats"
votes[
)
return votes
Cette partie n’est absolument pas exhaustive. Elle constitue un point d’entrée sur la modélisation à partir d’une série d’exemples construits à partir d’un fil rouge. mériteraient d’être évoqués. Pour les personnes désirant en savoir plus sur les modèles économétriques, qui seront moins évoqués que ceux de machine learning, je recommande la lecture de Turrell et contributors (2021).
5 Pour aller plus loin
Cette partie est une introduction au machine learning. Elle n’évoque pas les axes de recherche récents. Parmi ceux-ci on peut mettre en avant:
👈️ Interprétabilité, prédiction conforme, bayesian methods
- L’interprétabilité : un ensemble de méthodes visant à ouvrir la boite noire des modèles de machine learning. Il s’agit d’un ensemble de techniques permettant de mieux comprendre la manière dont un modèle, à partir de certains inputs, abouti à une prédiction. Parmi les méthodes en vogue aujourd’hui, on peut citer LIME et les valeurs de Shapley. Pour en apprendre plus, un bon point d’entrée est Christoph (2020).
- La prédiction conforme : approche statistique qui permet de donner une estimation de l’incertitude d’une prédiction, en générant des intervalles de confiance pour chaque prédiction individuelle. Elle garantit un niveau de précision fixé a priori, ce qui aide à fournir des prédictions fiables et compréhensibles. Pour en apprendre plus, se référer à l’article technique d’Angelopoulos et Bates (2021).
- Les méthodes bayésiennes: ensemble de méthodes qui consistent à introduire une incertitude dans l’estimation des paramètres et à mettre à jour celle-ci à partir des données observées. Ces méthodes sont fréquemment utilisées dans un cadre statistique où on désire néanmoins avoir de la flexibilité par rapport aux hypothèses de modélisation. Elles ont été popularisées par l’ouvrage grand public Silver (2012) (créateur du site fivethirtyeight) qui présente plusieurs cas d’application (prévisions sportives, électorales, etc.) et sont l’objet de plusieurs cours dédiés à l’ENSAE, notamment le cours de Monte Carlo Markov Chain (MCMC) en troisième année. Nous évoquerons néanmoins parfois cette famille de méthode, notamment lorsque nous présenterons le classifieur naif de Bayes.
Pour faire vos premiers pas en modélisation, notamment sur le preprocessing de données, vous pouvez également consulter le sujet 3 d’un hackathon organisé par l’Insee en 2023, Explorer les habitudes alimentaires des Français, sur le SSP Cloud ou sur Github.
Le but du sujet est de travailler sur les données de consommations et habitudes alimentaires de l’étude INCA 3. Vous y travaillerez plusieurs thèmes :
- Analyse exploratoire de données et visualisations
- Clustering d’individus : du preprocessing jusqu’aux méthodes classiques d’apprentissage non supervisé (ACP, K-moyennes, Clustering Ascendant Hiérarchique)
- Prédiction de l’IMC : Premiers pas vers les méthodes d’apprentissage supervisé et les preprocessings associés
5.1 Références
Informations additionnelles
environment files have been tested on.
Latest built version: 2024-11-20
Python version used:
Package | Version |
---|---|
affine | 2.4.0 |
aiobotocore | 2.15.1 |
aiohappyeyeballs | 2.4.3 |
aiohttp | 3.10.8 |
aioitertools | 0.12.0 |
aiosignal | 1.3.1 |
alembic | 1.13.3 |
altair | 5.4.1 |
aniso8601 | 9.0.1 |
annotated-types | 0.7.0 |
appdirs | 1.4.4 |
archspec | 0.2.3 |
asttokens | 2.4.1 |
attrs | 24.2.0 |
babel | 2.16.0 |
bcrypt | 4.2.0 |
beautifulsoup4 | 4.12.3 |
black | 24.8.0 |
blinker | 1.8.2 |
blis | 0.7.11 |
bokeh | 3.5.2 |
boltons | 24.0.0 |
boto3 | 1.35.23 |
botocore | 1.35.23 |
branca | 0.7.2 |
Brotli | 1.1.0 |
cachetools | 5.5.0 |
cartiflette | 0.0.2 |
Cartopy | 0.24.1 |
catalogue | 2.0.10 |
cattrs | 24.1.2 |
certifi | 2024.8.30 |
cffi | 1.17.1 |
charset-normalizer | 3.3.2 |
click | 8.1.7 |
click-plugins | 1.1.1 |
cligj | 0.7.2 |
cloudpathlib | 0.20.0 |
cloudpickle | 3.0.0 |
colorama | 0.4.6 |
comm | 0.2.2 |
commonmark | 0.9.1 |
conda | 24.9.1 |
conda-libmamba-solver | 24.7.0 |
conda-package-handling | 2.3.0 |
conda_package_streaming | 0.10.0 |
confection | 0.1.5 |
contextily | 1.6.2 |
contourpy | 1.3.0 |
cryptography | 43.0.1 |
cycler | 0.12.1 |
cymem | 2.0.8 |
cytoolz | 1.0.0 |
dask | 2024.9.1 |
dask-expr | 1.1.15 |
databricks-sdk | 0.33.0 |
debugpy | 1.8.6 |
decorator | 5.1.1 |
Deprecated | 1.2.14 |
diskcache | 5.6.3 |
distributed | 2024.9.1 |
distro | 1.9.0 |
docker | 7.1.0 |
duckdb | 0.10.1 |
en-core-web-sm | 3.7.1 |
entrypoints | 0.4 |
et_xmlfile | 2.0.0 |
exceptiongroup | 1.2.2 |
executing | 2.1.0 |
fastexcel | 0.11.6 |
fastjsonschema | 2.20.0 |
fiona | 1.10.1 |
Flask | 3.0.3 |
folium | 0.17.0 |
fontawesomefree | 6.6.0 |
fonttools | 4.54.1 |
frozendict | 2.4.4 |
frozenlist | 1.4.1 |
fsspec | 2023.12.2 |
gensim | 4.3.2 |
geographiclib | 2.0 |
geopandas | 1.0.1 |
geoplot | 0.5.1 |
geopy | 2.4.1 |
gitdb | 4.0.11 |
GitPython | 3.1.43 |
google-auth | 2.35.0 |
graphene | 3.3 |
graphql-core | 3.2.4 |
graphql-relay | 3.2.0 |
graphviz | 0.20.3 |
great-tables | 0.12.0 |
greenlet | 3.1.1 |
gunicorn | 22.0.0 |
h2 | 4.1.0 |
hpack | 4.0.0 |
htmltools | 0.6.0 |
hyperframe | 6.0.1 |
idna | 3.10 |
imageio | 2.36.0 |
importlib_metadata | 8.5.0 |
importlib_resources | 6.4.5 |
inflate64 | 1.0.0 |
ipykernel | 6.29.5 |
ipython | 8.28.0 |
itsdangerous | 2.2.0 |
jedi | 0.19.1 |
Jinja2 | 3.1.4 |
jmespath | 1.0.1 |
joblib | 1.4.2 |
jsonpatch | 1.33 |
jsonpointer | 3.0.0 |
jsonschema | 4.23.0 |
jsonschema-specifications | 2024.10.1 |
jupyter-cache | 1.0.0 |
jupyter_client | 8.6.3 |
jupyter_core | 5.7.2 |
kaleido | 0.2.1 |
kiwisolver | 1.4.7 |
langcodes | 3.5.0 |
language_data | 1.3.0 |
lazy_loader | 0.4 |
libmambapy | 1.5.9 |
locket | 1.0.0 |
lxml | 5.3.0 |
lz4 | 4.3.3 |
Mako | 1.3.5 |
mamba | 1.5.9 |
mapclassify | 2.8.1 |
marisa-trie | 1.2.1 |
Markdown | 3.6 |
markdown-it-py | 3.0.0 |
MarkupSafe | 2.1.5 |
matplotlib | 3.9.2 |
matplotlib-inline | 0.1.7 |
mdurl | 0.1.2 |
menuinst | 2.1.2 |
mercantile | 1.2.1 |
mizani | 0.11.4 |
mlflow | 2.16.2 |
mlflow-skinny | 2.16.2 |
msgpack | 1.1.0 |
multidict | 6.1.0 |
multivolumefile | 0.2.3 |
munkres | 1.1.4 |
murmurhash | 1.0.10 |
mypy-extensions | 1.0.0 |
narwhals | 1.14.1 |
nbclient | 0.10.0 |
nbformat | 5.10.4 |
nest_asyncio | 1.6.0 |
networkx | 3.3 |
nltk | 3.9.1 |
numpy | 1.26.4 |
opencv-python-headless | 4.10.0.84 |
openpyxl | 3.1.5 |
opentelemetry-api | 1.16.0 |
opentelemetry-sdk | 1.16.0 |
opentelemetry-semantic-conventions | 0.37b0 |
OWSLib | 0.28.1 |
packaging | 24.1 |
pandas | 2.2.3 |
paramiko | 3.5.0 |
parso | 0.8.4 |
partd | 1.4.2 |
pathspec | 0.12.1 |
patsy | 0.5.6 |
Pebble | 5.0.7 |
pexpect | 4.9.0 |
pickleshare | 0.7.5 |
pillow | 10.4.0 |
pip | 24.2 |
platformdirs | 4.3.6 |
plotly | 5.24.1 |
plotnine | 0.13.6 |
pluggy | 1.5.0 |
polars | 1.8.2 |
preshed | 3.0.9 |
prometheus_client | 0.21.0 |
prometheus_flask_exporter | 0.23.1 |
prompt_toolkit | 3.0.48 |
protobuf | 4.25.3 |
psutil | 6.0.0 |
ptyprocess | 0.7.0 |
pure_eval | 0.2.3 |
py7zr | 0.20.8 |
pyarrow | 17.0.0 |
pyarrow-hotfix | 0.6 |
pyasn1 | 0.6.1 |
pyasn1_modules | 0.4.1 |
pybcj | 1.0.2 |
pycosat | 0.6.6 |
pycparser | 2.22 |
pycryptodomex | 3.21.0 |
pydantic | 2.9.2 |
pydantic_core | 2.23.4 |
Pygments | 2.18.0 |
PyNaCl | 1.5.0 |
pynsee | 0.1.8 |
pyogrio | 0.10.0 |
pyOpenSSL | 24.2.1 |
pyparsing | 3.1.4 |
pyppmd | 1.1.0 |
pyproj | 3.7.0 |
pyshp | 2.3.1 |
PySocks | 1.7.1 |
python-dateutil | 2.9.0 |
python-dotenv | 1.0.1 |
python-magic | 0.4.27 |
pytz | 2024.1 |
pyu2f | 0.1.5 |
pywaffle | 1.1.1 |
PyYAML | 6.0.2 |
pyzmq | 26.2.0 |
pyzstd | 0.16.2 |
querystring_parser | 1.2.4 |
rasterio | 1.4.2 |
referencing | 0.35.1 |
regex | 2024.9.11 |
requests | 2.32.3 |
requests-cache | 1.2.1 |
retrying | 1.3.4 |
rich | 13.9.4 |
rpds-py | 0.21.0 |
rsa | 4.9 |
ruamel.yaml | 0.18.6 |
ruamel.yaml.clib | 0.2.8 |
s3fs | 2023.12.2 |
s3transfer | 0.10.2 |
scikit-image | 0.24.0 |
scikit-learn | 1.5.2 |
scipy | 1.13.0 |
seaborn | 0.13.2 |
setuptools | 74.1.2 |
shapely | 2.0.6 |
shellingham | 1.5.4 |
six | 1.16.0 |
smart-open | 7.0.5 |
smmap | 5.0.0 |
sortedcontainers | 2.4.0 |
soupsieve | 2.5 |
spacy | 3.7.5 |
spacy-legacy | 3.0.12 |
spacy-loggers | 1.0.5 |
SQLAlchemy | 2.0.35 |
sqlparse | 0.5.1 |
srsly | 2.4.8 |
stack-data | 0.6.2 |
statsmodels | 0.14.4 |
tabulate | 0.9.0 |
tblib | 3.0.0 |
tenacity | 9.0.0 |
texttable | 1.7.0 |
thinc | 8.2.5 |
threadpoolctl | 3.5.0 |
tifffile | 2024.9.20 |
toolz | 1.0.0 |
topojson | 1.9 |
tornado | 6.4.1 |
tqdm | 4.66.5 |
traitlets | 5.14.3 |
truststore | 0.9.2 |
typer | 0.13.1 |
typing_extensions | 4.12.2 |
tzdata | 2024.2 |
Unidecode | 1.3.8 |
url-normalize | 1.4.3 |
urllib3 | 1.26.20 |
wasabi | 1.1.3 |
wcwidth | 0.2.13 |
weasel | 0.4.1 |
webdriver-manager | 4.0.2 |
websocket-client | 1.8.0 |
Werkzeug | 3.0.4 |
wheel | 0.44.0 |
wordcloud | 1.9.3 |
wrapt | 1.16.0 |
xgboost | 2.1.1 |
xlrd | 2.0.1 |
xyzservices | 2024.9.0 |
yarl | 1.13.1 |
yellowbrick | 1.5 |
zict | 3.0.0 |
zipp | 3.20.2 |
zstandard | 0.23.0 |
View file history
SHA | Date | Author | Description |
---|---|---|---|
cbe6459 | 2024-11-12 07:24:15 | lgaliana | Revoir quelques abstracts |
e945ff4 | 2024-11-07 18:02:05 | lgaliana | update |
a251709 | 2024-11-07 09:31:19 | lgaliana | Exemple |
f3bbddc | 2024-11-06 16:48:47 | lgaliana | Commence revoir premier chapitre modélisation |
e56a219 | 2024-10-30 17:13:03 | Lino Galiana | Intro partie modélisation & typo geopandas (#571) |
c326488 | 2024-10-10 14:31:57 | Romain Avouac | Various fixes (#565) |
005d89b | 2023-12-20 17:23:04 | Lino Galiana | Finalise l’affichage des statistiques Git (#478) |
e52cc8a | 2023-12-19 21:40:01 | Lino Galiana | Automatic black formatting for python examples (#477) |
3437373 | 2023-12-16 20:11:06 | Lino Galiana | Améliore l’exercice sur le LASSO (#473) |
1f23de2 | 2023-12-01 17:25:36 | Lino Galiana | Stockage des images sur S3 (#466) |
a06a268 | 2023-11-23 18:23:28 | Antoine Palazzolo | 2ème relectures chapitres ML (#457) |
69cf52b | 2023-11-21 16:12:37 | Antoine Palazzolo | [On-going] Suggestions chapitres modélisation (#452) |
09654c7 | 2023-11-14 15:16:44 | Antoine Palazzolo | Suggestions Git & Visualisation (#449) |
a771183 | 2023-10-09 11:27:45 | Antoine Palazzolo | Relecture TD2 par Antoine (#418) |
154f09e | 2023-09-26 14:59:11 | Antoine Palazzolo | Des typos corrigées par Antoine (#411) |
8082302 | 2023-08-25 17:48:36 | Lino Galiana | Mise à jour des scripts de construction des notebooks (#395) |
3bdf3b0 | 2023-08-25 11:23:02 | Lino Galiana | Simplification de la structure 🤓 (#393) |
f2905a7 | 2023-08-11 17:24:57 | Lino Galiana | Introduction de la partie NLP (#388) |
5d4874a | 2023-08-11 15:09:33 | Lino Galiana | Pimp les introductions des trois premières parties (#387) |
f5f0f9c | 2022-11-02 19:19:07 | Lino Galiana | Relecture début partie modélisation KA (#318) |
8e5edba | 2022-09-02 11:59:57 | Lino Galiana | Ajoute un chapitre dask (#264) |
12965ba | 2022-05-25 15:53:27 | Lino Galiana | :launch: Bascule vers quarto (#226) |
5c10490 | 2021-12-03 17:44:08 | Lino Galiana | Relec (antuki?) partie modelisation (#183) |
4cdb759 | 2021-05-12 10:37:23 | Lino Galiana | :sparkles: :star2: Nouveau thème hugo :snake: :fire: (#105) |
7f9f97b | 2021-04-30 21:44:04 | Lino Galiana | 🐳 + 🐍 New workflow (docker 🐳) and new dataset for modelization (2020 🇺🇸 elections) (#99) |
671f75a | 2020-10-21 15:15:24 | Lino Galiana | Introduction au Machine Learning (#72) |
Notes de bas de page
Nous reviendrons de manière épisodique sur ce principe des grands modèles de langage qui sont devenus, en quelques années, centraux dans l’écosystème de la data science mais sont également amenés à devenir des outils grands publics, à la manière de
ChatGPT
.↩︎Comme nous l’avons dit, cette différenciation est un peu caricaturale, notamment maintenant que les économistes sont plus familiarisés aux concepts d’évaluation de performance prédictive sur des sous-ensembles d’apprentissage et de test (mais l’évolution est lente) et qu’à l’inverse la recherche en machine learning est très dynamique sur la question de l’explicabilité et de l’interprétabilité des modèles de machine learning, notamment autour du concept de valeurs de Shapley. Néanmoins, cette différence philosophique entre ces deux écoles de pensée continue à influencer la manière dont est pratiquée l’économétrie ou le machine learning dans différents champs scientifiques.↩︎
Pour faire l’analogie avec le cadre économétrique, les features sont les variables explicatives ou covariates (la matrice \(X\)) et le label est la variable expliquée (\(y\)).↩︎
Nous allons nous focaliser sur le cas binaire, le plus simple. Dans ce type de problèmes, la variable \(y\) a deux modalités : gagnant-perdant, 0-1, oui-non… Néanmoins il existe de nombreux cas d’usage où la variable dispose de plus de modalités, par exemples des scores de satisfaction entre 0 et 5 ou A et D. La mise en oeuvre de modèles est plus complexe mais l’idée générale est souvent de se ramener à un ensemble de modèles dichotomiques pour pouvoir appliquer des métriques simples et stables.↩︎
Citation
@book{galiana2023,
author = {Galiana, Lino},
title = {Python pour la data science},
date = {2023},
url = {https://pythonds.linogaliana.fr/},
doi = {10.5281/zenodo.8229676},
langid = {fr}
}