Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

a-piscine avec son binder + mlExplore post visio + orthographe #25

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
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
23 changes: 23 additions & 0 deletions binder/environment.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
name: la-piscine
channels:
- conda-forge
dependencies:
- pandas
- r-base=3.6
- r-dt
- r-future
- r-rmarkdown
- r-shinydashboard
- r-reticulate
- r-ranger
- r-shinyeffects
- r-stringr
- r-tictoc
- r-tidyverse
- scikit-learn
- scikit-plot
- r-data.table
- r-mltools
- r-dplyr
- r-shinyAce

1 change: 1 addition & 0 deletions mlExplore/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,4 @@ ml_fiche1.html
README.html
README.pdf
randomForest.html
util.R
170 changes: 134 additions & 36 deletions mlExplore/README.RMD
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,9 @@ Il apporte plutôt une dimension pédagogique en présentant aux *utilisateurs*
- des modèles,
- un concentré d'éléments de connaissances relatives au ML, adapté *à eux* puisque enrichi *par eux*.

Mais l'intérêt pédagogique ne se résume pas au produit fini.
Mais l'intérêt pédagogique ne se résume pas à l'application produite.

Au contraire, l'élaboration elle-même du projet constitut l'essentiel de la démarche engagée ici.
Au contraire, l'élaboration elle-même de *mlExplore** constitut l'essentiel de la démarche engagée ici.

Les apports pour notre connaissance et savoir-faire sont multiples :

Expand All @@ -73,15 +73,44 @@ Au tout début...

Mais voyons d'un peu plus près sous 2 angles différents

### Du point de vue de l'utilisateur, que trouve-t-on dans ce projet ?
### Du point de vue de l'utilisateur, que trouve-t-on dans cette application ?

Une interface permettant de choisir nos propres fichiers pour les soumettre au ML
Une interface permettant de

Un premier modèle est proposé : **Random Forest**, avec une implémentation **Python/scikit-learn**
#### Choisir nos propres fichiers pour les soumettre au ML

et une autre avec **R** associé au costaud **ranger**
- Un fichier de données, livré pour l'exemple : churn2.csv

C'est lui qui est traité par défaut au démarrage de l'appli, en guise de validation du bon déroulement de chaque fonctionnalité de l'appli.

- Tout fichier envoyé dans le dossier data (dans l'arborescence du projet), via un bouton **< upload >**

- Le minimum syndical pour le <span style="color: #FE446A;">*preprocessing*</span> :

+ définition de la cible ou *target*,
+ colonnes à retirer,
+ découpage des colonnes catégorielles (*factors* dans le jargon R) en *dummies*.

Remarque au passage, je remercie [email protected] et ses collègues pour leur très bon
[article](https://linogaliana.netlify.app/post/datatable/datatable-intro/ "article") sur la librairie **data.table** et dont Spyrales à fait l'echo. Je développe (un peu) ce thème un peu plus bas, dans la rubrique *Point de vue du développeur*.

#### Choisir le modèle à ajuster

Une indication est donnée sur la <span style="color: #FE446A;">validité du modèle</span> choisi en rapport avec l'état des données (pré-traitées)

Un premier modèle est proposé : <span style="color: #FE446A;">*Random Forest*</span>,

+ avec une implémentation **Python/scikit-learn**

+ et une autre en lagage **R** associé au costaud **ranger** ...Juste une remarque en passant, je ne suis pas encore copain avec lui
et il a l'air suceptible question paramétrage. Je vais donc prendre mon temps...

#### L'interface permet aussi d'afficher les scripts de *Machine Learning*

On peut <span style="color: #FE446A;">*contrôler les scripts*</span> précis (R ou Python) mis en oeuvre pour l'ajustement du modèle et la restitution des résultats.

Cela pourra peut-être servir pour faciliter leur mise au point avec le concours des utilisateurs qui ne prendraient part au projet
que (et c'est déjà beaucoup) au travers de l'interface.

### Du point de vue du développeur, qu'avons-nous appris/mis en oeuvre ?

Expand All @@ -98,7 +127,18 @@ Environnement de dev
Bibliothèques

- scikitlearn
- panda
- pandas

Dans le détail du développement :

L'article de Lino Galiana nous encourage à <span style="color: blue;">*mettre en oeuvre data.table*</span>, j'ajoute <span style="color: blue;">*selon les circonstances*</span> en pensant à une remarque qui m'a été faite par un certain Romain Lesur (il ne m'en voudra pas de le citer, j'espère), malgré l'attachement parfois aveugle que l'on peut porter à dplyr.
C'est chose faite (au moins partiellement) dans ce projet, pour le bénéfice qu'apporte la <span style="color: blue;">méthode *one_hot*</span>.
Pour être complet et ne pas me mettre à dos les sujets ensorcellés par le gros serpent, un procédé similaire en Python/pandas a fait l'affaire : <span style="color: blue;">*get_dummies*</span>

Plus sur le fond, lorsque l'implémentation du modèle est écrite en Python, un script <span style="color: blue;">*modele*.py</span> définit la méthode *fit*.
Le programme principal use alors de la magie de la librairie <span style="color: blue;">*reticulate*</span> pour sourcer le script et appeler la méthode. Il fait ça dans un prolongement de lui même, visible de l'utilisateur (c'est là l'intérêt), que constitue le script <span style="color: blue;">fit_*modele*.R</span>
Pour l'utilisateur, les deux scripts sont visibles et c'est ce qui compte.



## Que faire de plus ?
Expand All @@ -112,44 +152,52 @@ On peut commencer par...
- Tous les fichiers utilisateurs .csv ne sont pas bien pris en compte
- ?

### Faire une présentation générale du Machine Learning

Proposer en première page une présentation succinte du domaine, si possible infographies (libres de droit) à l'appui.

En bref, réserver un accueil plus chaleureux aux utilisateurs les plus novices.

Faire apparaître clairement les **composantes** de ce monde **de l'apprentissage automatique** qui sont **prises en compte** dans
la dernière version de l'application. On cherchera alors à faire bouger le curseur entre ce qui est fait et ce qu'il reste à faire

Ajouter des références, des liens vers des sites que Spyrales recommanderait pour l'approfondissement de différentes notions.

### Ajouter des modèles

- Bien les décrire
- Proposer au moins une implémentation (nous sommes à peu près sûr de la trouver dans scikit-learn)
- Soigner l'affichage de la sortie (exemple de la courbe de gain cumulée pour *random forest*)

### Donner plus de possibilité aux utilisateurs

- Prise en compte des modifications des scripts dans l'éditeur de texte (shinyAce)
- Permettre la recherche des bons hyper-paramètres (gridSearchCV)
- Définition des pipelines
- ?

## Conseils pour le bon démarrage de l'application

Pré-requis :
Deux possibilités :

1) Pour ceux qui traverse des proxies, on m'a soufflé qu'une ligne telle que
**Sys.setenv(http_proxy = "xxxx")**
peut aider dans global.R
2) Un certain nombre de librairies sont bien sûr nécessaires
**=> Profiter de l'application directement à partir du lien suivant :**

Pour les scripts python d'une part :
Version stable sur Spyrales : cliquez sur ce lien [![Binder](http://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/spyrales/la-piscine/master?urlpath=shiny/mlExplore/)

- pandas
- scikit-learn`
L'appli met du temps à démarrer, mais normalement ça fonctionne ! (un raffraîchissement de la page - touche F5 - est parfois utile suite à l'erreur 500 trop fréquente à mon goût...)

Mais tant qu'on y est, on peut installer aussi d'autres librairies qui seront utiles rapidement.
**=> ou alors installer l'appli sur votre machine (dans l'idée à plus ou moins long terme de contribuer au projet)**

Dans une console R, j'ai fait comme ceci :
Pré-requis :

```{}
library(reticulate)
0) Le logiciel R installé (évidemment). On en est à la version 4 depuis le 24 avril, mais une version antérieure devrait encore convenir durablement.

conda_install("r-reticulate", "scipy")
conda_install("r-reticulate", "scikit-learn")
conda_install("r-reticulate", "pandas")
conda_install("r-reticulate", "matplotlib")
conda_install("r-reticulate", "scikit-plot")
conda_install("r-reticulate", "seaborn")
```
1) Pour ceux qui traversent des proxies, on m'a soufflé qu'une ligne telle que
**Sys.setenv(http_proxy = "xxxx")**
peut aider dans global.R
2) Un certain nombre de librairies sont bien sûr nécessaires

Pour les scripts R d'autres part :
Pour les scripts R d'une part :

- reticulate (pour articuler R et Python)
- DT (pour afficher efficacement les tableaux de données)
Expand All @@ -159,10 +207,13 @@ Pour les scripts R d'autres part :
- tictoc (pour mesurer les temps d'exécution, elle est tip top !)
- shinyEffects (pour faire joli)
- shinydashboard (parce que c'est beau)
- data.table (Spyrales en a parlé, alors...)
- mltools (bien pratique)
- shinyAce (pour afficher un éditeur de texte dans l'appli)

- ranger : le petit dernier pour faire du randomForest efficace sous R, alternativement à scikitlearn qui s'avèrera là-dessus moins bon. A confirmer.

Les commandes à passer, toujours sous R :
Les commandes à passer, dans une console R :

```{}
install.packages('reticulate')
Expand All @@ -172,31 +223,74 @@ install.packages('shinydashboard')
install.packages('DT')
install.packages('dplyr')
install.packages('readr')
install.packages('mltools')
install.packages('data.table')
install.packages('shinyAce')
install.packages('ranger')
```

Pour les scripts python d'autre part :

- pandas
- scikit-learn

Mais tant qu'on y est, on peut installer aussi d'autres librairies qui seront utiles rapidement.

Toujours sous R, j'ai fait comme ceci :

```{}
library(reticulate)

conda_install("r-reticulate", "scipy")
conda_install("r-reticulate", "scikit-learn")
conda_install("r-reticulate", "pandas")
conda_install("r-reticulate", "matplotlib")
conda_install("r-reticulate", "scikit-plot")
conda_install("r-reticulate", "seaborn")
```

Après avoir récupéré tout le paquet (avec l'outil git à priori), je vois 2 options :

1) le déposer dans le dossier ShinyApps s'il existe et qu'un serveur Shiny tourne sur votre machine locale.
Après avoir tout récupéré (le plus simple est de faire un fork depuis [la-piscine](https://github.com/spyrales/la-piscine/) et utiliser le sytème de contrôle de version [git]( https://spyrales.netlify.app/blog/20200329-memogit/)), déposer le dossier mlExplore

2) le déposer où bon vous semble pour le reconnaître ensuite dans vos projets à partir de l'environnement Rstudio.
1) dans ShinyApps/ si un serveur Shiny tourne sur votre machine locale (ce dernier, sauf configuration particulière, scrute vos projets dans le dossier ShinyApps/)

2) sinon où bon vous semble pour le reconnaître ensuite dans vos projets à partir de votre environnement de développement, disons ... Rstudio !

C'est presque tout :

Option 1 : accédez classiquement depuis le navigateur à la page @ip/users/votreUser/mlExplore/

Option 2 : sous Rstudio, se positionner sur global.R, ui.R ou server.R puis runApp
Option 2 : sous Rstudio,
-> ouvrir le projet mlExplore.Rproj, puis au moins l'un des 3 fichiers : global.R, ui.R ou server.R
-> puis runApp

Autre option : Installation et éxecution locale, en l'absence d'un serveur Shiny

-> Pour lancer l'appli dans votre navigateur comme le ferait le serveur Shiny, vous pouvez exécuter en ligne de commande :
```{}
Rscript -e 'shiny::runApp("mlExplore/", port=8000)'
```

-> Si vous utilisez conda et que vous voulez en maîtriser l'environnement d'exécution

```{}
conda env create -f binder/environment.yml
conda activate la-piscine
Rscript -e 'shiny::runApp("mlExplore/", port=8000)'
```

L'application sera disponible à l'adresse http://localhost:8000

Personnellement, je n'ai pas pris le temps d'installer (sur mon pc nouvellement acquis) un server Shiny. Vous me direz si vous rencontrez des problèmes en choisissant l'option 1, mais à priori il n'y aura pas de soucis.

Je suis dans le cas de l'option 2
Je suis dans le cas de l'option 2 lorsque je travaille sur le projet

- pour mon pc perso, tout fonctionne parfaitement.

- et puis aussi sur une machine bien plus puissante ...qui n'est pas à moi et à laquelle j'accède par ssh.
- et puis aussi sur une machine bien plus puissante ...qui n'est pas à moi et à laquelle j'accède par ssh et Rstudio server.

Il se trouve que l'affichage du DISPLAY sur la machine distante est un peu rebel. Pour franchir l'obstacle, je n'ai rien trouvé de mieux que de lancer le petit script python **plot.py** que vous trouverez dans src_python/ . Cela m'active l'affichage et tout fonctionne alors à merveilles. C'est de la bidouille, conseillez moi vite un truc plus pro si vous savez et avez du temps à consacrer à ça !
Il se trouve que l'affichage du *DISPLAY* sur ma machine distante est un peu rebel. Vous n'aurez sans doute pas le soucis chez vous, ignorez alors la remarque qui suit.
Pour forcer le *DISPLAY*, je n'ai rien trouvé de mieux que de lancer le petit script python **plot.py** que vous trouverez dans src_python/ . Cela m'active l'affichage et tout fonctionne alors à merveilles. C'est de la bidouille, conseillez moi vite un truc plus pro si vous savez et avez du temps à consacrer à ça !


## Et à quoi ça ressemble en images ?
Expand All @@ -206,7 +300,11 @@ Vous demander de commencer par corriger les bugs, c'est pas très vendeur je rec
Plus vendeur, une image :


![Sortie d'un modèle célèbre](mlExplore.png)
![Sortie d'un modèle célèbre](mlExplore1.png)

Et puis une autre, l'interface ayant un peu évolué entre temps :


![Le code python est affiché dans l'appli](mlExplore2.png)


Loading