samedi 10 septembre 2016

Début septembre et conclusion

Test de la prédiction dans Biwee

Dès mon retour  de vacances, j’ai entamé une phase de test de performances de la prédiction que j’ai construit dans Biwee. Pour ce faire, j’ai été chercher des données réelles de prédiction quantitative (régression) sur des sites comme UCI. J’ai ensuite pu réaliser quelques prédictions et analyser leurs performances directement au sein de Biwee avec un tableau de bord. Ces tableaux de bord m’ont permis d’afficher pour un jeu de données et sa prédiction des graphiques (permettant de comparer les valeurs connues et leur prédiction) mais aussi de calculer des indices de performance comme le MAE (Mean Absolute Error de la prédiction) et enfin de mettre des couleurs et des pourcentages me permettant de savoir à quel point ma prédiction est précise.


Amélioration de la prédiction

Grâce à cette phase de test, j’ai pu identifier les points à améliorer dans mon modèle prédictif de régression.
J’ai tout d’abord commencé par ajouter des modules sur mon modèle d’Azure Machine Learning me permettant d’avoir quelques statistiques essentielles sur le jeu de données (Valeurs manquantes, moyennes ...).
J’ai également ajouté un module python utilisant les librairies scikit learn et matplotlib réalisant une prédiction très rapide et affichant des « Learning Curves »  me permettant de savoir si mon modèle « overfit » ou « underfit » le jeu de données.
J’ai ensuite créé une partie de « Feature engineering » au début de mon modèle qui nettoie les données manquantes, mais aussi transforme les dates en nouvelles données  intéressantes (année, mois, jour de la semaine…) et enfin transforme les données catégoriques de texte inexploitables par un algorithme en valeurs qualitatives numériques. J’ai réalisé cela avec des modules Azure ML et Python.
Enfin, j’ai tenté d’améliorer mes algorithmes avec des modèles ensemblistes avec du « voting » ou « stacking ».


Point prédiction et Intégration web

Enfin, j’ai listé les fonctionnalités que propose actuellement ma prédiction et j’ai énuméré toutes les choses qu’il faut changer ou améliorer afin de pouvoir faire un point avec la direction sur la suite.
Pour finir, dans les semaines qui suivent et qui vont précéder la rentrée, je vais réaliser de l’intégration de pages web avec Drupal sur le site weenove.fr pour le pôle marketing.

Conclusion

En conclusion, ces 3 mois de stage au sein de Weenove m’ont permis de mettre en pratique mes compétences théorique en Machine Learning, mais aussi d’en acquérir de nouvelles, en Machine Learning (Azure Machine Learning, Feature Engineering…), mais également dans d’autres domaines (Talend, Crawling web, Drupal, R&D en autonomie). Ce stage m’a également permis de gérer des projets à responsabilité et en autonomie.
Je suis vraiment satisfait de ce stage qui a pleinement répondu à mes attentes concernant le Machine Learning et la réalisation d’un projet d’analyse prédictive.

Pour finir, j’enchaîne dès la rentrée sur un stage alterné chez Weenove.

vendredi 26 août 2016

Fin de juillet et début août

Fin de la première implémentation

Après quelques jours de test et de modification, la jointure du jeu de données initial avec le résultat de la prédiction est fonctionnelle. Cette opération a fait apparaitre quelques bugs dans le code de jointure mais ceux-ci étaient mineurs et ont été rapidement corrigés.
Il m’a ensuite été possible de tester les performances de ma prédiction sur différents jeux de données directement depuis Biwee.

Job Talend

Suite à cela, un client a eu urgemment besoin d’un job Talend. Talend nous a permis de mettre en place un ETL (Extract Transform Load), qui est la base d’un projet de Business Intelligence classique, avant d’intégrer les données du client dans Biwee.

En effet, cet ETL devait permettre de récupérer des fichiers CSV quotidiennement déposés sur un FTP, de mettre les données en forme, et enfin de les insérer dans une base de données. Biwee pourra ensuite avoir un simple connecteur sur cette base de données.

N’ayant jamais fait de Talend auparavant, j’ai eu l’aide d’autres développeurs. Ce job est en fait à la fin un simple fichier « .jar » que l’on dépose sur un serveur (dans notre cas Azure) et que l’on fait exécuter à la fréquence désirée (dans notre cas tous les jours). Tout d’abord, celui-ci récupère les fichiers qui n’ont pas encore été insérés en base de données (il se base sur une table de la BDD qui contient les fichiers déjà insérés). Ensuite, fichier par fichier, il va mettre en forme les données comme nous le voulons, puis tenter de les insérer dans la BDD. Si le contenu du fichier a bien été inséré, on insère son nom dans la table des fichiers déjà insérés afin que celui-ci ne soit pas récupéré à la prochaine exécution.

La création de ce job m’a prise 4 jours.


Dernière semaine

Durant cette dernière semaine avant que je parte en vacances pour 3 semaines (première semaine d’août), nous avons tout d’abord déménagé. Nous sommes maintenant installés au 78 rue de Leybardie. Les nouveaux locaux nous offrent un cadre de travail très agréable avec beaucoup d’espace et une terrasse.

Le mercredi, on m’a demandé de retravailler sur le crawler web que j’avais réalisé l’année dernière pour trouver des informations sur des entreprises française du numérique. J’ai dû modifier mon code pour récupérer le code SIRET et SIREN des entreprises déjà crawlées. Je n’ai pu récupérer les informations que sur environ 75% des entreprises.
Ce travail m’a pris 2 jours.

Enfin, j’ai eu un peu de temps pour travailler sur l’amélioration de mon modèle de régression sur Azure Machine Learning. J’y ai rajouté un nouvel algorithme de régression non linéaire, et ai modifié les plages de paramètres qu’Azure ML doit tester sur chaque algorithme. J’ai enfin fait quelques tests sur l’impact d’ajout de module de « Normalization » et de réduction de dimension sur les performances de mon modèle.


Je pars maintenant en vacances et nous ferons un point à mon retour sur ce que j’ai fait et ce qu’il faut maintenant faire.

jeudi 25 août 2016

Finalisation de la première version

Ces deux dernières semaines de travail ont été consacrées à continuer d’intégrer une Régression linéaire dans Biwee. Ainsi j’ai tout d’abord fait en sorte que ma prédiction utilise les données du tableau de bord.
Ensuite je me suis attaqué à l’état de la prédiction.


Etat de la prédiction

Comme dit dans l’article précédent, lorsqu’on lance une prédiction, on doit savoir où elle en est mais également que celle-ci continue lorsque l’on ferme Biwee. J’ai ainsi travaillé sur une solution pour sauvegarder l’état d’une prédiction en base.
Ensuite, j’ai dû gérer toutes les erreurs qui pouvaient arriver lors d’une prédiction et faire en sorte que ces erreurs soient gérées par le code et affichées au client. De plus, au fur et à mesure d’une prédiction, des choses sont stockées (modèles de prédiction, résultats…). Ainsi, en fonction du moment où la prédiction échoue et si une précédente prédiction existe, j’ai dû sauvegarder temporairement l’ancienne, supprimer les résultats de la nouvelle si celle-ci échoue et restaurer l’ancienne.
Ainsi, on peut maintenant accéder à l’état d’une prédiction même lorsqu’on ferme Biwee, et ses erreurs et ses problématiques de stockage (si une ancienne prédiction existait par exemple) sont gérés.

Jointure du résultat

Sur ces derniers jours, je me suis concentré sur le résultat d’une prédiction. En effet, l’objectif final et de joindre une colonne de résultat de la prédiction au jeu de données initial. La première étape a donc été de stocker la prédiction (son format, sa localisation…).
Ensuite, pour pouvoir joindre la prédiction à la source de donnée, il a fallu établir une solution afin de créer une clé unique pour identifier une ligne et s’en servir de colonne de jointure. De plus, cette solution devait être performante et ne pas prendre trop de temps et de ressources pour calculer cette colonne.
Une fois la solution choisie, j’ai travaillé avec le développeur ayant réalisé la jointure de plusieurs jeux de données dans un tableau de bord pour intégrer la jointure d’une prédiction. Ce code est pratiquement fini, il nous reste maintenant à le tester la semaine prochaine.

Une fois ceci fini, je ferai le point avec la direction sur ce qui a été réalisé et sur la suite.

Intégration de la prédiction dans Biwee

Tests de la solution

Pendant deux semaines, j’ai testé la solution que nous avions choisie : Azure Machine Learning.
Mes tests n’étant pas centrés sur le Machine Learning en lui-même, j’ai rapidement créé un modèle assez générique et peu performant (il était inutile de passer trop de temps là-dessus).
Mes consignes étaient de prendre le modèle de machine learning le plus simple et rapide à réaliser, et de trouver un jeu de données pour pouvoir tester l’API de Microsoft pour utiliser ce modèle depuis un projet .NET. J’ai donc choisi de faire une Régression linéaire.
J’ai d’abord tenté d’utiliser un premier jeu de données fourni par un collègue mais celui-ci n’était pas adapté, j’ai donc pris un jeu de données d’exemple fourni par Microsoft sur Azure Machine Learning (ainsi forcément adapté).
J’ai donc ensuite créé un projet .NET qui appelle avec les données de mon choix mon modèle pré créé sur Azure ML, choisi le meilleur algorithme à utiliser, et créé une API permettant d’appeler cet algorithme entraîné. Etant un projet de R&D, personne ne pouvait vraiment m’aider. De plus, l’API de Azure ML étant très récente, il n’existe presque pas de documentation ni de sujet sur des forums dessus.
Une fois ce projet développé, nous avons eu une réunion avec les fondateurs et le « team leader » du pôle développement afin de montrer mes résultats et de décider de la suite. Le choix a été d’intégrer cette première solution à Biwee

Prédiction dans Biwee

Ma mission de cette semaine a été d’intégrer à l’interface visuelle de Biwee mon module de prédiction. Nous avons tout d’abord réfléchi à l’architecture de ce module de prédiction. Nous avons ainsi décidé s’il s’exécutait côté client ou serveur, sa structure dans la base de données, l’intégration des résultats obtenus de la prédiction…
Ainsi après une semaine de travail, j’ai réalisé au sein des tableaux de bords une première interface graphique où l’on choisit la colonne à prédire. La prédiction se lance ensuite.

Je dois maintenant travailler sur la base de données pour stocker la prédiction et connaître son état pour l’afficher sur l’interface graphique. Je dois également gérer le fait que lorsque Biwee se ferme la prédiction doit continuer et être accessible à la ré ouverture de Biwee. Enfin, je devrais gérer le résultat de la prédiction et l’intégrer aux données du tableau de bord.

Mes deux premières semaines

Afficher l'image d'origine

L’entreprise

Je réalise cet été un stage de 3 mois (du 30 Juin au 23/09/2016 avec une absence du 08/08/2016 au 26/08/2016) dans l’entreprise Weenove. Pour rappel j’avais déjà fait mon stage de l’année dernière dans cette même entreprise avec principalement des missions de développeur C# (mon blog). J’aborderais le sujet de ma mission dans la partie concernée.
Weenove est une entreprise fondée en 2012 développant un logiciel de Business Intelligence (aide les entreprises à prendre des décisions grâce à la visualisation de leurs données). Ce logiciel appelé Biwee propose de se connecter à tout type de données (fichiers plats, Excel, Bases de données, Apis …) et de créer de manière très facile des tableaux de bords avec des graphiques. Ces tableaux de bords sont ensuite partageables à ses collaborateurs et accessibles en ligne avec les données en temps réel.

Le cadre

Weenove a actuellement ses bureaux au sein de la pépinière éco créative de Bordeaux (http://www.emploi-bordeaux.fr/pepiniere-eco-creative.html). Nous étions l’année dernière dans un Open Space avec une autre entreprise, nous sommes aujourd’hui dans des bureaux seuls. Mais nous allons déménager début Août dans des locaux où nous serons seuls (78 Rue de Leybardie).
L’entreprise est constituée des 3 fondateurs, et de 10 employés (5 développeurs, un commercial, deux marketeurs, un conseiller Business Intelligence, et moi). Parmi ceux-ci, 6 étaient déjà là pour mon stage l’année dernière dont 4 de Ingésup (mon intégration a donc été assez facile).




Afficher l'image d'origine

La mission

Weenove a pour objectif d’ajouter cette année une Intelligence Artificielle à Biwee. Celle-ci proposerait deux choses :
-        Un outil rapide et facile pour les clients leur permettant de faire de la prédiction avec leurs données
-        Un système permettant d’analyser les données des clients et de leurs proposer des tableaux de bords avec des corrélations avec d’éventuelles données extérieurs (Open Data).
Grâce à mon expérience et mes compétences en IA et Machine Learning acquises au sein du laboratoire Enimia d’Ingésup, j’ai pour mission de réaliser ce projet de R&D et de mettre en place une première version fonctionnelle de l’outil de prédiction d’ici Septembre.


Mes deux première semaines

Après une réunion le premier jour, ma première tâche a été de faire la liste des solutions techniques actuelles. J’ai donc fait un premier tour de l’état de l’art des solutions pour implémenter du Machine Learning. J’ai ainsi trouvé une vingtaine de solutions potentielles et réalisé des tests sur celles les plus possibles à intégrer dans Biwee.

Après une réunion en début de deuxième semaine, nous avons décidé d’orienter nos recherches sur Microsoft Azure Machine Learning. J’ai donc passé la deuxième semaine à tester cette solution avec un jeu de données concret.