Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/documentation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,6 @@ jobs:
exit 1
fi

- uses: actions/upload-artifact@v3
- uses: actions/upload-artifact@v4
with:
path: ./dist/html/**
2 changes: 1 addition & 1 deletion .github/workflows/wheels-any.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,6 @@ jobs:
- name: build wheel
run: python -m pip wheel .

- uses: actions/upload-artifact@v3
- uses: actions/upload-artifact@v4
with:
path: ./teachpyx*.whl
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ _doc/LICENSE.txt
_doc/auto_examples/*
_doc/articles/2024/pyramide.png
_doc/articles/2024/tsp_simple.png
_doc/articles/2024/anim_evolution.png
_doc/articles/2024/vie_1.png
_doc/examples/**/plot_*.png
_doc/examples/**/plot_*.xlsx
_doc/examples/prog/*.proto
Expand Down
4 changes: 2 additions & 2 deletions _doc/api/practice/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@ teachpyx.practice
:maxdepth: 1
:caption: modules


ml_skl
rues_paris
tsp_bresenham
tsp_kohonen
tsp_kruskal
tsp_kruskal


.. automodule:: teachpyx.practice
Expand Down
7 changes: 7 additions & 0 deletions _doc/api/practice/ml_skl.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@

teachpyx.practice.ml_skl
========================

.. automodule:: teachpyx.practice.ml_skl
:members:
:no-undoc-members:
Binary file removed _doc/articles/2024/anim_evolution.png
Binary file not shown.
Binary file removed _doc/articles/2024/pyramide.png
Binary file not shown.
Binary file removed _doc/articles/2024/tsp_simple.png
Binary file not shown.
Binary file removed _doc/articles/2024/vie_1.png
Binary file not shown.
120 changes: 120 additions & 0 deletions _doc/articles/2025/2025-01-31-local_llm.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
.. _l-2025-01-31-local-llm:

======================
2025-01-31 : local LLM
======================

Il est parfois impossible d'utiliser un outils tels que ChatGPT
parce qu'on ne veut pas que certains données ou questions s'évadent.
J'ai donc suivi le tutoriel décrit sur le site de HuggingFace :
`microsoft/Phi-3.5-mini-instruct <https://huggingface.co/microsoft/Phi-3.5-mini-instruct>`_.
Une fois le modèle téléchargé, j'ai exécuté le script avec une question
différente.

.. code-block:: python

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline

torch.random.manual_seed(0)

model = AutoModelForCausalLM.from_pretrained(
"microsoft/Phi-3.5-mini-instruct",
device_map="cuda",
torch_dtype="auto",
trust_remote_code=True,
)
tokenizer = AutoTokenizer.from_pretrained("microsoft/Phi-3.5-mini-instruct")

messages = [
{"role": "system", "content": "You are a helpful AI assistant."},
{
"role": "user",
"content": "Peux-tu écrire un code python implémentant un transformer personnalisé pour scikit-learn ?",
},
# {"role": "assistant", "content": "Sure! <type the answer of the model>"},
# {"role": "user", "content": "<continue with yours>"},
]

pipe = pipeline(
"text-generation",
model=model,
tokenizer=tokenizer,
)

generation_args = {
"max_new_tokens": 500,
"return_full_text": False,
"temperature": 0.0,
"do_sample": False,
}

output = pipe(messages, **generation_args)
print(output[0]["generated_text"])

Et le modèle répond :

.. code-block:: text

Certainement! Pour créer un transformateur personnalisé pour scikit-learn,
vous devez implémenter les classes `BaseEstimator` et `TransformerMixin`.
Voici un exemple simple de transformateur personnalisé qui normalise les données :

```python
from sklearn.base import BaseEstimator, TransformerMixin

class NormalizationTransformer(BaseEstimator, TransformerMixin):
def __init__(self):
# Initialiser avec des valeurs par défaut si nécessaire
pass

def fit(self, X, y=None):
# Calculer les statistiques de la distribution des données
self.means_ = X.mean(axis=0)
self.stds_ = X.std(axis=0)
return self

def transform(self, X):
# Appliquer la normalisation aux données
return (X - self.means_) / self.stds_

def fit_transform(self, X, y=None, **fit_params):
# Appeler fit puis transform
return self.fit(X, y, **fit_params).transform(X)

# Exemple d'utilisation
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LinearRegression

# Créer un pipeline avec le transformateur personnalisé et un modèle
pipeline = Pipeline(steps=[
('normalize', NormalizationTransformer()),
('regressor', LinearRegression())
])

# Supposons que vous avez un ensemble de données X et des étiquettes y
# pipeline.fit(X, y)
# prédictions = pipeline.predict(X_test)
```

Dans cet exemple, `NormalizationTransformer` calcule la moyenne et
l'écart type de chaque colonne lors du processus de `fit` et applique
ensuite la normalisation lors du processus de `transform`.
La méthode `fit_transform` combine les deux pour une efficacité.

Vous pouvez personnaliser ce transformateur pour répondre à vos besoins spécifiques.

Pas si mal pour un petit modèle.
D'autres modèles sont accessibles comme celui-ci
`DeepSeek-R1 <https://huggingface.co/deepseek-ai/DeepSeek-R1>`_
mais qui nécessite une machine un peu plus costaude qu'un simple
ordinateur portable pour tourner.
D'autres modèles sont capables de prendre des images en entrée :
`microsoft/Phi-3.5-vision-instruct <https://huggingface.co/microsoft/Phi-3.5-vision-instruct>`_
tout en gardant une taille raisonnable.

Quelques idées de questions qui font gagner du temps :

* Peux-tu expliquer ce que fait cette fonction ?
* Peux-tu générer la documentation pour cette fonction ?
* Peux-tu générer des tests unitaires pour cette fonctions ?
139 changes: 134 additions & 5 deletions _doc/articles/2025/2025-03-01-route2025.rst
Original file line number Diff line number Diff line change
@@ -1,13 +1,32 @@
.. _l-feuille-route-2025:

==================================
2025-03-01 : feuille de route 2025
==================================
=========================================
2025-03-01 : feuille de route 2025 - mars
=========================================

site web : `sdpython.github.io <https://sdpython.github.io/>`_

`Apprendre la programmation avec Python
<https://sdpython.github.io/doc/teachpyx/dev/>`_

Séance 1 (31/1)
===============

* site web : `sdpython.github.io <https://sdpython.github.io/>`_
Un jeu de données :

* `Demandes de valeurs foncières
<https://www.data.gouv.fr/fr/datasets/demandes-de-valeurs-foncieres/>`_

*Quatre thèmes*

* Deux types de problèmes : régression, classifications
* Problèmes dérivés : ranking, clustering, série temporelles
* Calculs, puissances de calculs, CUDA, CPU
* Environnement de travail, coder avec un LLM en local,
:ref:`l-2025-01-31-local-llm`, avenir du datascientiste

*Autres notes*

* :ref:`l-ml-rappel`
* programmation (python :epkg:`numpy`, :epkg:`pandas`, :epkg:`matplotlib`, :epkg:`jupyter`)
* :ref:`Tests unitaires <nbl-practice-py-base-tests_unitaires>`, package python
Expand All @@ -22,4 +41,114 @@ Séance 1 (31/1)
* `ChatGPT <https://chat.openai.com/>`_,
`LLM <https://en.wikipedia.org/wiki/Large_language_model>`_,
(Large Language Model), SLLM (Small LLM)
* Coder avec un LLM en local.
* Coder avec un LLM en local : :ref:`l-2025-01-31-local-llm`
* Notebooks, Visual Studio Code

Séance 2 (7/2)
==============

* arbre de régression, de classification
:ref:`RandomForest, Overfitting <nbl-practice-ml-ml_a_tree_overfitting>`
* Gradient Boosting, :ref:`Gradient Boosting et Learning Rate avec les Random Forest <nbl-practice-ml-gradient_boosting>`
* Régression linéaire et contraintes sur les coefficients,
`Ridge <https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Ridge.html>`_,
`Lasso <https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Lasso.html>`_,
`ElasticNet <https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.ElasticNet.html>`_,
:ref:`Ridge, Lasso, mathématiques <nbl-practice-ml-ridge_lasso>`
* paramètres et hyper paramètres, :ref:`Sélection des hyper-paramètres <nbl-practice-ml-winesr_knn_hyper>`,
:class:`sklearn.model_selection.GridSearchCV`
* `Data challenge - Algorithme machine learning qui permet de prédire la gravité d’un accident de la rout
<https://www.data.gouv.fr/fr/reuses/data-challenge-algorithme-machine-learning-qui-permet-de-predire-la-gravite-dun-accident-de-la-route/>`_

Séance 3 (14/2)
===============

*un peu plus de code*

* pipelines
* créer son propre estimateur
* tests unitaires

Pour cette séance, on souhaite construire un estimateur qui estime
une régression linéaire à coefficients positifs, une autre avec
des coefficients uniquement négatifs puis pour finir une dernière
régression linéaire qui considère les deux premières comme features.

Une régression linéaire minimise l'erreur
:math:`\sum_i \left\Vert X_i\theta - y_i \right\Vert^2`.
Le gradient est :math:`\sum_i X_i'\left( X_i\theta - y_i \right)`.

Comme le modèle souhaité est équivalent à une optimisation sous contrainte,
on propose de le résoudre comme ceci :

* On applique une itération de l'algorithme de la descente de gradient :
:math:`\theta_{t+1} = \theta_t - \epsilon_t \sum_i X_i'\left( X_i\theta - y_i \right)`.
* On ne garde que les coefficients positifs : :math:`\theta_{t+1} = \max(0, \theta_t)`.
* On retourne à l'étape 1 ou on s'arrête si l'algorithme a convergé.

On appliquera cela au jeu de données :func:`sklearn.datasets.load_diabetes` ou
`Wine Quality <https://archive.ics.uci.edu/datasets?search=wine>`_
on comparera à une simple régression linéaire, les coefficients sont-ils
équivalents ? Comment comparer les modèles ?

* :ref:`Nouvel estimateur <nbl-practice-ml-custom_estimator>`

Séance 4 (21/2)
===============

* prétraitements
* anomalie
* cartes

**Cartes**

* :ref:`Tracer une carte <nbl-c_data-enedis_cartes>`

**Réseaux de neurones**

* `Réseau de neurones <https://sdpython.github.io/doc/mlstatpy/dev/c_ml/rn/rn.html>`_,
`LeNet <https://en.wikipedia.org/wiki/LeNet>`_
* `Seq2Seq <https://en.wikipedia.org/wiki/Seq2seq>`_,
`Sequence To Sequnce <https://paperswithcode.com/method/seq2seq>`_,
`Sequence to Sequence (seq2seq) and Attention
<https://lena-voita.github.io/nlp_course/seq2seq_and_attention.html>`_,
`Transformers <https://research.google/blog/transformer-a-novel-neural-network-architecture-for-language-understanding/>`_,
`Attention is All You Need
<https://france.devoteam.com/paroles-dexperts/attention-is-all-you-need-comprendre-le-traitement-naturel-du-langage-avec-les-modeles-transformers/>`_

**Anomalies**

* `Novelty and Outlier Detection <https://scikit-learn.org/stable/modules/outlier_detection.html>`_

**Prétraitement**

* Dates, Catégories : `category_encoders <https://contrib.scikit-learn.org/category_encoders/>`,
`skrub <https://skrub-data.org/stable/>`_,
:ref:`Prétraitement des catégories <nbl-practice-ml-pretraitement_cat>`
* Son : :epkg:`librosa`, voir :ref:`Prétraitement du son <nbl-practice-ml-pretraitement_son>`
* Image : :epkg:`scikit-image`, voir :ref:`Prétraitement d'une image <nbl-practice-ml-pretraitement_image>`
* Texte : :ref:`Prétraitement d'une image <nbl-practice-ml-pretraitement_texte>`

Pour la suite, on souhaite comparer ces approches sur un jeu
accessible depuis le package `datasets <https://huggingface.co/docs/datasets/en/index>`_.
`Large Movie Review Dataset <https://ai.stanford.edu/~amaas/data/sentiment/>`_

.. code-block:: python

from datasets import load_dataset

dataset = load_dataset("stanfordnlp/imdb", split="train")

print(dataset)
Dataset({
features: ['text', 'label'],
num_rows: 25000
})

Séance 5 (6/3)
==============

* série temporelles
* analyses de survie
* DeepAR
* temps réel
Loading
Loading