Skip to content

Commit 5c17e93

Browse files
authored
Merge branch 'sess1' into copilot/sub-pr-89
2 parents 220e337 + 355cf1f commit 5c17e93

6 files changed

Lines changed: 1146 additions & 21 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,3 +78,4 @@ _doc/c_data/*.txt
7878
_doc/c_data/*.xlsx
7979
_doc/c_data/*.zip
8080
_doc/c_data/*.dbf
81+
_notebooks/*qwen*

_doc/articles/2026/2026-03-15-route2026-ml.rst

Lines changed: 137 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ Fonctions utiles:
1717

1818
* :func:`teachpyx.tools.pandas.read_csv_cached`
1919

20-
Séance 1 (6/2)
21-
==============
20+
Séance 1 (27/2)
21+
===============
2222

2323
* rappels sur la régression, classification, clustering, ACP, prétraitements
2424
* train test, validation croisée
@@ -44,24 +44,151 @@ Peut-on prédire le nombre de candidatures en 2026 pour chaque établissement ?
4444

4545
:ref:`Données parcours-sup 2021-2025 <nbl-practice-years-2026-parcoursup_2026>`
4646

47-
Séance 2 (13/2)
47+
Séance 2 (5/3)
48+
==============
49+
50+
* tests unitaires, pourquoi en faire
51+
* pipelines : pourquoi en faire
52+
* arbre de décision, comment ça marche ?
53+
* pourquoi les random forest sont résistantes à l'overfitting
54+
* qu'est-ce que le gradient boosting tree ?
55+
* réseau de neurones, comment ça marche ?
56+
* réseau diabolo et la compression
57+
* notion d'embedding
58+
59+
quelques notebooks
60+
61+
* arbre de régression, de classification
62+
:ref:`RandomForest, Overfitting <nbl-practice-ml-ml_a_tree_overfitting>`
63+
* Gradient Boosting, :ref:`Gradient Boosting et Learning Rate avec les Random Forest <nbl-practice-ml-gradient_boosting>`
64+
* Régression linéaire et contraintes sur les coefficients,
65+
`Ridge <https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Ridge.html>`_,
66+
`Lasso <https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Lasso.html>`_,
67+
`ElasticNet <https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.ElasticNet.html>`_,
68+
:ref:`Ridge, Lasso, mathématiques <nbl-practice-ml-ridge_lasso>`
69+
* paramètres et hyper paramètres, :ref:`Sélection des hyper-paramètres <nbl-practice-ml-winesr_knn_hyper>`,
70+
:class:`sklearn.model_selection.GridSearchCV`
71+
* `Data challenge - Algorithme machine learning qui permet de prédire la gravité d’un accident de la rout
72+
<https://www.data.gouv.fr/fr/reuses/data-challenge-algorithme-machine-learning-qui-permet-de-predire-la-gravite-dun-accident-de-la-route/>`_
73+
74+
Séance 3 (12/3)
4875
===============
4976

77+
* Régression linéaire et contraintes sur les coefficients,
78+
`Ridge <https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Ridge.html>`_,
79+
`Lasso <https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Lasso.html>`_,
80+
`ElasticNet <https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.ElasticNet.html>`_,
81+
:ref:`Ridge, Lasso, mathématiques <nbl-practice-ml-ridge_lasso>`
82+
* paramètres et hyper paramètres, :ref:`Sélection des hyper-paramètres <nbl-practice-ml-winesr_knn_hyper>`,
83+
:class:`sklearn.model_selection.GridSearchCV`
84+
* pipelines (encore)
85+
* créer son propre estimateur
5086
* tests unitaires
51-
* pipelines : pourquoi en faire
5287

53-
Séance 3 (27/2)
54-
===============
88+
Pour cette séance, on souhaite construire un estimateur qui estime
89+
une régression linéaire à coefficients positifs, une autre avec
90+
des coefficients uniquement négatifs puis pour finir une dernière
91+
régression linéaire qui considère les deux premières comme features.
5592

56-
Séance 4 (6/3)
57-
==============
93+
Une régression linéaire minimise l'erreur
94+
:math:`\sum_i \left\Vert X_i\theta - y_i \right\Vert^2`.
95+
Le gradient est :math:`\sum_i X_i'\left( X_i\theta - y_i \right)`.
96+
97+
Comme le modèle souhaité est équivalent à une optimisation sous contrainte,
98+
on propose de le résoudre comme ceci :
5899

59-
Séance 5 (13/3)
100+
* On applique une itération de l'algorithme de la descente de gradient :
101+
:math:`\theta_{t+1} = \theta_t - \epsilon_t \sum_i X_i'\left( X_i\theta - y_i \right)`.
102+
* On ne garde que les coefficients positifs : :math:`\theta_{t+1} = \max(0, \theta_t)`.
103+
* On retourne à l'étape 1 ou on s'arrête si l'algorithme a convergé.
104+
105+
On appliquera cela au jeu de données :func:`sklearn.datasets.load_diabetes` ou
106+
`Wine Quality <https://archive.ics.uci.edu/datasets?search=wine>`_
107+
on comparera à une simple régression linéaire, les coefficients sont-ils
108+
équivalents ? Comment comparer les modèles ?
109+
110+
* :ref:`Nouvel estimateur <nbl-practice-ml-custom_estimator>`
111+
112+
Si on a le temps, traitement des données manquantes.
113+
114+
Séance 4 (19/3)
60115
===============
61116

62-
Séance 6 (20/3)
117+
* rappel : créer son propre estimateur
118+
* retour sur les tests unitaires
119+
120+
Et puis
121+
122+
* prétraitements : catégorie, dirty catégories, :epkg:`category_encoders`
123+
* anomalie
124+
* cartes : :ref:`Tracer une carte <nbl-c_data-enedis_cartes>`,
125+
:epkg:`cartopy`, :epkg:`folium`, :epkg:`geopandas`
126+
* clustering (trainable and pas trainable)
127+
* TSNE
128+
129+
Un exemple :
130+
131+
* `clustering <https://scikit-learn.org/stable/modules/clustering.html>`_
132+
* Vieux notebooks sur l'utilisation de vélos à Chicago
133+
`City Bike Views <https://github.com/sdpython/ensae_projects/blob/master/_doc/notebooks/challenges/city_bike/city_bike_views.ipynb>`_,
134+
`City Bike Clustering <https://github.com/sdpython/ensae_projects/blob/master/_doc/notebooks/challenges/city_bike/city_bike_solution_cluster_start.ipynb>`_,
135+
136+
Séance 5 (26/3)
63137
===============
64138

139+
série temporelles
140+
141+
Le modèle de référence est :epkg:`statsmodels`
142+
143+
* :ref:`Single Spectrum Analysis (SSA) <nbl-practice-ml-timeseries_ssa>`
144+
* :ref:`Décomposition d'une série temporelle <nbl-practice-ml-timeseries_seasonal>`
145+
146+
:epkg:`sktime` propose une API plus proche de :epkg:`scikit-learn`
147+
et d'autres modèles comme le clusting ou la segmentation de séries temporelles.
148+
Voir `Estimator Overview <https://www.sktime.net/en/v0.40.1/estimator_overview.html>`_.
149+
150+
* moyennes mobiles
151+
* saisonnalité
152+
* DTW
153+
* HMM, Gaussian HMM
154+
* ruptures (changements de régime)
155+
156+
:epkg:`prophet` fait aussi de la prédiction et contient aussi des algorithmes
157+
de détection de changement de régime, il contient une bonne base de jours
158+
fériés.
159+
160+
**Analyse de survie**
161+
162+
* :epkg:`scikit-survival`, :epkg:`lifelines`, analyses de survie,
163+
`Analyse de survie <https://sdpython.github.io/doc/mlstatpy/dev/c_ml/survival_analysis.html>`_,
164+
165+
**Interprétabilité**
166+
167+
* `Partial Dependence <https://scikit-learn.org/stable/modules/partial_dependence.html>`_
168+
* `Permutation Importance <https://scikit-learn.org/stable/modules/permutation_importance.html>`_
169+
* `LIME <https://arxiv.org/abs/1602.04938>`_
170+
* `Shapley value <https://en.wikipedia.org/wiki/Shapley_value>`_,
171+
`SHAP <https://shap.readthedocs.io/en/latest/index.html>`_
172+
* `Counterfactual Reasoning and Learning Systems <https://arxiv.org/abs/1209.2355>`_
173+
174+
**Municipales 2026**
175+
176+
* `premier tour <https://www.data.gouv.fr/datasets/elections-municipales-2026-resultats-du-premier-tour>`_
177+
* `liste candidates second tour <https://www.data.gouv.fr/datasets/elections-municipales-2026-listes-candidates-au-second-tour>`_
178+
* `second tour <https://www.data.gouv.fr/datasets/elections-municipales-2026-resultats-du-second-tour>`_
179+
180+
Séance 6 (3/4)
181+
==============
182+
183+
* anonymisation : `Latanya Sweeney <https://en.wikipedia.org/wiki/Latanya_Sweeney>`_, vidéo : `Latanya Sweeney: When anonymized data is anything but anonymous <https://www.youtube.com/watch?v=tivCK_fBBfo>`_
184+
(k-anonimity, l-diversité, hasard, ...)
185+
* éthique : apprendre avec et sans, grille
186+
* LLMs et code
187+
188+
* `premier tour <https://www.data.gouv.fr/datasets/elections-municipales-2026-resultats-du-premier-tour>`_
189+
* `liste candidates second tour <https://www.data.gouv.fr/datasets/elections-municipales-2026-listes-candidates-au-second-tour>`_
190+
* `second tour <https://www.data.gouv.fr/datasets/elections-municipales-2026-resultats-du-second-tour>`_
191+
65192
Evaluation
66193
==========
67194

_doc/conf.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ def linkcode_resolve(domain, info):
113113
nitpick_ignore = [
114114
("py:class", "False"),
115115
("py:class", "True"),
116+
("py:class", "pandas.core.frame.DataFrame"),
116117
("py:class", "pipeline.Pipeline"),
117118
("py:class", "default=sklearn.utils.metadata_routing.UNCHANGED"),
118119
("py:class", "sklearn.utils._metadata_requests.RequestMethod"),

_doc/examples/ml/plot_template_data.py

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,12 @@ def compute_oracle(table, cible):
7373
.dropna(axis=0)
7474
.sort_index()
7575
)
76+
# Keep only rows where both 2024 and 2025 have non-missing values
77+
piv = piv.dropna(axis=0, how="any")
78+
if piv.empty:
79+
raise ValueError(
80+
"Not enough overlapping data between 2024 and 2025 to compute oracle."
81+
)
7682
return mean_absolute_error(piv[2025], piv[2024])
7783

7884

@@ -95,16 +101,19 @@ def make_pipeline(table, cible):
95101
num_cols = ["Capacité de l’établissement par formation"]
96102
cat_cols = [c for c in vars if c not in num_cols]
97103

104+
transformers = []
105+
if num_cols:
106+
transformers.append(("num", StandardScaler(), num_cols))
107+
if cat_cols:
108+
transformers.append(
109+
("cats", OneHotEncoder(handle_unknown="ignore"), cat_cols)
110+
)
111+
98112
model = Pipeline(
99113
[
100114
(
101115
"preprocessing",
102-
ColumnTransformer(
103-
[
104-
("num", StandardScaler(), num_cols),
105-
("cats", OneHotEncoder(handle_unknown="ignore"), cat_cols),
106-
]
107-
),
116+
ColumnTransformer(transformers),
108117
),
109118
("regressor", HistGradientBoostingRegressor()),
110119
]
@@ -114,9 +123,9 @@ def make_pipeline(table, cible):
114123

115124
data = get_data()
116125
table, cible = select_variables_and_clean(data)
117-
oracle = compute_oracle(table, cible)
118-
print(f"oracle : {oracle}")
126+
# oracle = compute_oracle(table, cible)
127+
# print(f"oracle : {oracle}")
119128

120-
train_X, test_X, train_y, test_y = split_train_test(table, cible)
121-
model = make_pipeline(table, cible)
122-
model.fit(train_X, train_y)
129+
# train_X, test_X, train_y, test_y = split_train_test(table, cible)
130+
# model = make_pipeline(table, cible)
131+
# model.fit(train_X, train_y)

_notebooks/celine_pairs.csv

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
normal,celine
2+
"Machine learning is transforming the tech industry.","Ça bouge là… le machine learning… tout fout le camp… la tech qui crie…"
3+
"Deep learning allows computers to recognize images.","Les machines… elles voient… elles comprennent… images partout… t'y crois pas…"
4+
"Neural networks mimic the brain's structure.","Les réseaux neurones… comme le cerveau… ça gigote… et toi t'attends quoi…"
5+
"AI models improve with more data.","Les modèles… plus t'as de données… mieux ça tourne… ou pas…"
6+
"Supervised learning uses labeled datasets.","Supervisé… c'est toi qui dis quoi… les données… qui doivent parler…"
7+
"Reinforcement learning rewards good behavior.","Apprentissage par renforcement… tu fais bien… on te tape dans le dos… ou pas…"
8+
"Training a model requires lots of computation.","Faut calculer… calculer… le modèle… il chauffe… ça fuse…"
9+
"Overfitting happens when a model learns noise.","Surapprentissage… le modèle écoute trop… le bruit… il croit que c'est vrai…"
10+
"Hyperparameters need careful tuning.","Hyperparamètres… faut les tripoter… doucement… ou tout foirer…"
11+
"Data preprocessing is essential for quality results.","Préparer les données… sinon rien… résultat pourri…"
12+
"L'apprentissage automatique transforme l'industrie technologique.","Ça bouge là… l'apprentissage automatique… la tech qui s'agite…"
13+
"L'apprentissage profond permet aux ordinateurs de reconnaître des images.","Les machines… elles voient… elles pigent… images partout…"
14+
"Les réseaux de neurones imitent la structure du cerveau.","Réseaux de neurones… comme le cerveau… ça bouge… et toi t'attends quoi…"
15+
"Les modèles d'IA s'améliorent avec plus de données.","Les modèles… plus t'as de données… mieux ça marche… ou pas…"
16+
"L'apprentissage supervisé utilise des ensembles de données étiquetées.","Supervisé… c'est toi qui dis quoi… les données… faut qu'elles parlent…"
17+
"L'apprentissage par renforcement récompense les bons comportements.","Renforcement… tu fais bien… on te tape dans le dos… ou pas…"
18+
"L'entraînement d'un modèle nécessite beaucoup de calculs.","Faut calculer… calculer… le modèle… ça chauffe…"
19+
"Le surapprentissage se produit quand un modèle apprend le bruit.","Surapprentissage… le modèle écoute trop… le bruit… il croit que c'est vrai…"
20+
"Les hyperparamètres nécessitent un réglage minutieux.","Hyperparamètres… faut tripoter… doucement… ou tout foirer…"
21+
"La prétraitement des données est essentiel pour obtenir des résultats de qualité.","Préparer les données… sinon rien… résultat pourri…"
22+
"L'automatisation de la gestion des ressources : Cette idée propose de développer une application qui permet de gérer les ressources en utilisant des algorithmes de machine learning. Les utilisateurs peuvent ajouter ou supprimer des ressources, et les algorithmes de machine learning peuvent les optimiser pour maximiser la performance de la machine.","Ça commence comme ça… automatiser la gestion des ressources… une application… tu vois… qui gère tout… avec des algos… machine learning… qui décident… tu peux ajouter… enlever des ressources… et les algos… ils optimisent… pour que la machine tourne… au max… tout ça… tout le temps… ça bouge… ça chauffe…"

0 commit comments

Comments
 (0)