<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
		<id>https://projets-ima.plil.fr/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Abrossas</id>
		<title>Wiki de Projets IMA - Contributions de l’utilisateur [fr]</title>
		<link rel="self" type="application/atom+xml" href="https://projets-ima.plil.fr/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Abrossas"/>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php/Sp%C3%A9cial:Contributions/Abrossas"/>
		<updated>2026-05-14T00:57:54Z</updated>
		<subtitle>Contributions de l’utilisateur</subtitle>
		<generator>MediaWiki 1.29.2</generator>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88072</id>
		<title>IMA3/IMA4 2020/2022 P5</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88072"/>
				<updated>2022-05-04T13:44:22Z</updated>
		
		<summary type="html">&lt;p&gt;Abrossas : /* Rapports */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 0px; padding: 20px; font-weight: bold; text-align: center; font-size: 80%; background: #61798F; vertical-align: top; width: 100%;&amp;quot;&amp;gt; '''PARTIE I (S6-S7)''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Introduction et cahier des charges''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce projet est la mise en place d’algorithmes de machine Learning afin de diagnostiquer l’état de machines industrielles. Nous travaillerons sur ce projet durant 2 semestres. &lt;br /&gt;
Durant le premier semestre, nous avions comme objectifs d’acquérir la maîtrise des différentes librairies primordiales pour traiter les données en machine Learning, ainsi que d’étudier et d’utiliser certains algorithmes basiques (régression linéaire, logistique, Bayes) sur des datasets que nous traiterons nous même. &lt;br /&gt;
Pour ce qui est du second semestre, notre objectif était de concrétiser les connaissances acquises durant le premier semestre. Nous avons donc essayé de créer notre propre dataset à l’aide des matériels mis à notre disposition, de la prétraiter et d’y appliquer différents algorithmes de Machine Learning en critiquant les résultats.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning pour la détection de défaut s'inscrit parfaitement dans le contexte scientifique actuel, notamment grâce à l’industrie 4.0.&lt;br /&gt;
En effet, cette nouvelle industrie fait apparaître des systèmes communicants (l’IOT : Internet Of Things) interconnectés les uns entre les autres. Ces différents systèmes peuvent êtres nécessaires les uns, les autres afin de réaliser une tâche complexe telle que l'usinage de pièces. Le système devient dès lors potentiellement extrêmement fragile aux pannes.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning a pour but de pouvoir détecter, et localiser les pannes, voir les futures pannes potentielles afin de pouvoir dans un premier temps prévenir un opérateur. Mais il peut aussi potentiellement permettre au système de continuer de tourner, en attendant un technicien. Le machine Learning peut donc aussi permettre à une chaîne de production de continuer de tourner par l’envoie d’un autre robot par exemple, le temps que la panne soit réparée.&lt;br /&gt;
&lt;br /&gt;
Dans le schéma ci-dessous nous avons un exemple de système de système.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Intro1.png|500px|thumb|center|Schéma d'un système de systèmes]]&lt;br /&gt;
&lt;br /&gt;
Il y a deux cas de figure:&lt;br /&gt;
* Un autre système peut être envoyé pour remplacer le système 4.&lt;br /&gt;
* Les systèmes 1 et 2 peuvent permettre à la chaîne de production de continuer de tourner&lt;br /&gt;
* La chaîne de production est hors service jusqu'à réparation.&lt;br /&gt;
&lt;br /&gt;
==Cahier de charges==&lt;br /&gt;
&lt;br /&gt;
'''Ressources disponibles :'''&lt;br /&gt;
&lt;br /&gt;
* Livres sur le machine learning &lt;br /&gt;
* Bases de données (afin d'appliquer divers algorithmes de machine learning) que nous prendrons sur ces sites : [https://www.kaggle.com/datasets] et [https://archive.ics.uci.edu/ml/datasets.php]&lt;br /&gt;
* Librairies Python (Scikit-learn, Pandas, Numpy, Seaborn, Matplotlib)&lt;br /&gt;
* Google Colab&lt;br /&gt;
* Matlab (version étudiante)&lt;br /&gt;
&lt;br /&gt;
'''Objectifs poursuivis :'''&lt;br /&gt;
&lt;br /&gt;
* Détecter les dysfonctionnements de systèmes mécatroniques (par exemple les robots Khepera, Robotino…), grâce au machine learning.&lt;br /&gt;
* Apprendre à implémenter différentes méthodes machine learning .&lt;br /&gt;
&lt;br /&gt;
'''Profil du public cible :'''&lt;br /&gt;
* Secteur mécatronique&lt;br /&gt;
* Entreprises disposant d'ingénieurs pour maintenir le système informatique opérationnel&lt;br /&gt;
* Entreprises utilisant des machines dans le secteur public.&lt;br /&gt;
&lt;br /&gt;
'''Analyse des besoins :'''&lt;br /&gt;
* L’industrie a de plus en plus besoin du machine learning pour détecter les erreurs des systèmes. En effet, cette technologie devient indispensable pour les industriels, notamment afin d'accroître la productivité et l’efficacité des systèmes industriels.&lt;br /&gt;
* Le programme peut ne pas être aussi rapide et optimisé en espace mémoire que d'autres programmes, nous visons l’efficacité de notre algorithme plutôt que la rapidité.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Librairies''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
En Machine Learning, il est très important, voire primordial, de savoir manipuler les différentes librairies mises à notre disposition afin de visualiser, traiter nos différentes dataset ou même appliquer les différents algorithmes de machine Learning.&lt;br /&gt;
Durant les premières semaines de notre projet, nous avons donc appris à utiliser ces différentes librairies nécessaires pour le machine Learning, telles que Numpy, Seaborn, Panda, Matplotlib, Scikit-learn... Nous allons dans un premier temps nous intéresser à l'importation des différentes bibliothèques puis résumer les commandes importantes de ces différentes librairies.&lt;br /&gt;
&lt;br /&gt;
Ces différentes librairies ne sont pas incluses de base dans Python, il est donc nécessaire de les ajouter à Python puis à notre programme.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc choisi d'utiliser google colab car ces librairies y sont déjà installées (et aussi pratique pour travailler à plusieurs sur un même code).&lt;br /&gt;
Puis nous devons importer ces bibliothèques au début de notre programme.&lt;br /&gt;
&lt;br /&gt;
Attention : Plusieurs bibliothèques peuvent avoir la même commande mais avec des significations différentes, comme par exemple la commande randint du module numpy et celle du module random et cela peut conduire à des erreurs. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de pallier à ces problèmes nous apporterons nos librairie au début de nos programmes comme suit :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:librairies1.png]]&lt;br /&gt;
&lt;br /&gt;
Ici le np permet de dire que lorsque nous utilisons np.array alors nous utilisons la commande array () contenu dans la bibliothèque Numpy.&lt;br /&gt;
&lt;br /&gt;
Ceci nous permettra d’utiliser en simultané différentes librairies, toutes les bibliothèques seront importées selon ce schéma.&lt;br /&gt;
Nous allons par la suite, nous intéresser à différentes commandes incluses dans ces librairies.&lt;br /&gt;
&lt;br /&gt;
==Numpy==&lt;br /&gt;
&lt;br /&gt;
Numpy est une bibliothèque dédiée aux calculs mathématiques et à la gestion des listes (telles que des matrices).&lt;br /&gt;
Matplotlib, quant à lui, est dédié aux affichages graphiques de données.&lt;br /&gt;
Nous allons dans cette partie nous intéresser aux commandes principales de ces deux bibliothèques de python.&lt;br /&gt;
&lt;br /&gt;
Sous numpy, les tableaux sont des types array, ils définissent l'équivalent des tableaux statiques en langage C. La taille d’un tableau numpy ne peut donc pas être changée après leur création. &lt;br /&gt;
&lt;br /&gt;
Néanmoins grâce a Numpy nous pouvons simplement effectuer des tâches sur les tableaux comme en extraire un sous tableaux, et d’effectuer simplement les produits entre matrice, vecteur.&lt;br /&gt;
&lt;br /&gt;
Dans notre projet, nous utiliserons plus courament les fonctions : &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.shape&amp;lt;/FONT&amp;gt; permet d’obtenir la taille de la matrice sous forme d’un tuple, suffit de choisir le bon numéro&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.zeros&amp;lt;/FONT&amp;gt; permet de créer une ligne de x zéro(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.ones&amp;lt;/FONT&amp;gt; permet de créer une ligne de x un(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.vstack&amp;lt;/FONT&amp;gt; permet de rajouter des lignes dans une matrice déjà créer en paramètre&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.transpose&amp;lt;/FONT&amp;gt; permet de transposer une matrice en paramètre&lt;br /&gt;
&lt;br /&gt;
==Seaborn==&lt;br /&gt;
&lt;br /&gt;
Seaborn est une bibliothèque de visualisation de données Python basée sur matplotlib. Il fournit une interface de haut niveau pour dessiner des graphiques statistiques attrayants et informatifs.&lt;br /&gt;
&lt;br /&gt;
'''Différences entre Matplotlib et Seaborn'''&lt;br /&gt;
&lt;br /&gt;
Les défauts de Matplotlib qui ne parlent généralement pas aux utilisateurs sont les couleurs, les marques de tiques sur les axes supérieur et droit, le style,...&lt;br /&gt;
Les exemples ci-dessus rendent également une autre frustration des utilisateurs plus apparente: le fait que travailler avec DataFrames ne va pas aussi bien avec Matplotlib, ce qui peut être ennuyeux si vous faites une analyse exploratoire avec Pandas. Et c’est exactement ce que Seaborn adresse : les fonctions de traçage fonctionnent sur dataframes et tableaux qui contiennent tout un ensemble de données.&lt;br /&gt;
[[Fichier:seaborn1.png|300px|thumb|right|Résultat du code python ci gauche]]&lt;br /&gt;
&lt;br /&gt;
   # Import necessary libraries&lt;br /&gt;
   import seaborn as sns&lt;br /&gt;
   import matplotlib.pyplot as plt&lt;br /&gt;
   &lt;br /&gt;
   # Load iris data&lt;br /&gt;
   iris = sns.load_dataset(&amp;quot;iris&amp;quot;) #DATASET ALREADY EXISTING&lt;br /&gt;
   &lt;br /&gt;
   # Construct iris plot&lt;br /&gt;
   sns.swarmplot(x=&amp;quot;species&amp;quot;, y=&amp;quot;petal_length&amp;quot;, data=iris)&lt;br /&gt;
   &lt;br /&gt;
   # Show plot&lt;br /&gt;
   plt.show()&lt;br /&gt;
&lt;br /&gt;
==Pandas==&lt;br /&gt;
&lt;br /&gt;
Pandas est une API d'analyse de données orientée colonnes. C'est un excellent outil pour manipuler et analyser des données d'entrée. Beaucoup de frameworks d'apprentissage automatique acceptent les structures de données Pandas en entrée.&lt;br /&gt;
&lt;br /&gt;
Comme évoqué précédemment, Pandas travaille avec des matrices colonnes communément appelées ‘Series’ mais aussi et surtout avec des tableaux de données appelés ‘DataFrames’.&lt;br /&gt;
Une Series est tout simplement une colonne et une DataFrame est un tableau à plusieurs dimensions constitué de Series.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Panda.JPG]]&lt;br /&gt;
&lt;br /&gt;
A l'aide de Pandas, on peut ainsi créer, importer, lire et manipuler des bases de données facilement.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Théories des algorithmes étudiés''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Il y a différents types d’algorithmes en machine learning, pour notre sujet qui consiste à classer des machines en défectueuse ou fonctionnelles (1 ou 0), nous aurons surtout besoin d’algorithmes de classification binaire. De manière générale, la conception de la plupart des algorithmes fonctionnent de cette manière : &lt;br /&gt;
&lt;br /&gt;
* Élaborer un modèle &lt;br /&gt;
* Établir une fonction coût pour celui-ci correspondant à l’erreur entre le modèle et les données réelles&lt;br /&gt;
* Trouver un algorithme de minimisation de cette fonction coût&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression linéaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression1.png|200px|thumb|right|Exemple de régression linéaire]]&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est un algorithme de prédiction et non un algorithme de classification, nous aurons surtout besoin de ce deuxième type d’algorithme pour notre projet mais nous tenons à présenter cet algorithme qui est le plus basique en machine learning et un bon début pour une formation pédagogique.&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est une méthode de modélisation qui cherche à établir une relation linéaire entre une ou des &amp;quot;features&amp;quot; (variables explicatives) et une &amp;quot;target&amp;quot; (variable expliquée qu'on cherche à prévoir à partir des variables explicatives). En machine learning, la régression linéaire est un modèle d'apprentissage supervisé, c'est-à-dire qu'on apprend à l'algorithme de prédiction à partir d'exemples dont on dispose dans une dataset. Nous nous intéresserons à la régression affine qui est la plus simple pour débuter.&lt;br /&gt;
&lt;br /&gt;
===Modèle et estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
La régression affine consiste donc à trouver un modèle de type&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt;y=ax+b&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
avec x une &amp;quot;feature&amp;quot;, y la target et avec a et b des paramètres qu'il nous faudra déterminer. Le but est donc de trouver les paramètres a et b tels que la distance entre chaque point du nuage et la droite du modèle soit la plus petite possible.&lt;br /&gt;
Mathématiquement, il suffit de résoudre cette formule:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression2.png|200px|thumb|right|Méthode des moindres carrés illustrée]]&lt;br /&gt;
[[Fichier:regression3.png]]&lt;br /&gt;
&lt;br /&gt;
On utilise donc la méthode des moindres carrés pour mesurer l'erreur entre le modèle de prédiction et les données et ainsi fabriquer notre fonction coût :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression4.png]]&lt;br /&gt;
&lt;br /&gt;
avec m le nombre de points du nuage.&lt;br /&gt;
&lt;br /&gt;
L'objectif de l'algorithme est donc de trouver les paramètres optimaux qui minimisent cette fonction J.&lt;br /&gt;
En machine learning, une des méthodes les plus populaires pour faire ceci est la descente de gradient, car c'est une méthode adaptée quand on fait du traitement de grosses dataset (&amp;quot;faible&amp;quot; temps de calcul). En effet, la fonction coût J est une parabole admettant un unique minimum dépendant des paramètres a et b. La descente de gradient consiste à chercher le point de celle-ci où la dérivée est nulle (donc le minimum)&lt;br /&gt;
&lt;br /&gt;
===Méthode de la descente du gradient===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression6.png|200px|thumb|right|Méthode gradient]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression7.png|200px|thumb|right|Généralisation gradient fct parabolique]]&lt;br /&gt;
&lt;br /&gt;
Soit une fonction parabolique ne dépendant que de x. On cherche à trouver le minimum de cette fonction en utilisant la méthode de la descente du gradient&lt;br /&gt;
Pour cela on choisit un point aléatoirement &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;et on va descendre à partir de celui-ci jusqu'à atteindre un minimum en utilisant&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression5.png]]&lt;br /&gt;
&lt;br /&gt;
avec un paramètre  qui influencera la taille du pas de la descente.&lt;br /&gt;
&lt;br /&gt;
Il faut faire attention à ne pas prendre un pas trop grand, ni trop petit, pour éviter de &amp;quot;tourner&amp;quot; autour du minimum ou de prendre trop de temps pour l'atteindre.&lt;br /&gt;
Note : On peut généraliser cela pour une fonction parabolique à n paramètres qui aurait donc une forme de bol.&lt;br /&gt;
&lt;br /&gt;
===Application sur notre fonction coût===&lt;br /&gt;
&lt;br /&gt;
Notre fonction coût dépend des 2 paramètres a et b :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression8.png]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression9.png]]&lt;br /&gt;
&lt;br /&gt;
On choisit &amp;lt;math&amp;gt;a_0&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; aléatoirement et on applique ceci pour un pas :&lt;br /&gt;
&lt;br /&gt;
Avec &lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression10.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d'un certain nombre d'itérations on trouve le couple &amp;lt;math&amp;gt;(a,b)&amp;lt;/math&amp;gt; qui minimise notre fonction coût.&lt;br /&gt;
&lt;br /&gt;
Note : Nous avons démontré la théorie de la régression linéaire affine mais on pourrait généraliser celle-ci pour un modèle polynomiale d’ordre n, la courbe de prédiction serait donc parabolique et il faudrait trouver le tuple &amp;lt;math&amp;gt;(a_1,a_2,...,a_n)&amp;lt;/math&amp;gt; qui minimise la fonction coût.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression logistique binaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo1.png|200px|thumb|right|Modèle régression logistique]]&lt;br /&gt;
&lt;br /&gt;
La régression logistique binaire est un algorithme de classification, contrairement à la régression linéaire qui est un algorithme de prédiction. De la même façon que la régression linéaire,  il s'agit de modéliser au mieux un modèle mathématique simple à des observations réelles nombreuses. Cette méthode se base sur de l’analyse mathématiques et statistique. Il faut donc associer à des “features” &amp;lt;math&amp;gt;(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; une variable Y valant 1 ou 0 (d’où le terme classification binaire).&lt;br /&gt;
&lt;br /&gt;
L’objectif de l’algorithme est donc de trouver la fonction F dépendant d’une loi de probabilité telle que :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo2.png]]&lt;br /&gt;
&lt;br /&gt;
avec S un certain seuil (fixé la plupart du temps à 0,5).&lt;br /&gt;
&lt;br /&gt;
===Modèle===&lt;br /&gt;
&lt;br /&gt;
Comme cette méthode repose principalement sur des statistiques, il est important d’adopter une notation explicite lors de l’explication théorique :&lt;br /&gt;
&lt;br /&gt;
* On notera Y la variable à prédire (qui vaudra 0 ou 1) et &amp;lt;math&amp;gt;X=(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; les variables permettant de prédire Y&lt;br /&gt;
* On travaillera dans un univers  de N échantillons (taille de la dataset)&lt;br /&gt;
* On notera &amp;lt;math&amp;gt;P(Y=1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;P(Y=0)&amp;lt;/math&amp;gt; les probabilités que Y valent respectivement 1 ou 0 &amp;lt;math&amp;gt;p(1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0)&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;p(X|1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(X|0)&amp;lt;/math&amp;gt; sont les distributions conditionnelles des caractéristiques X sachant la valeur prise par Y&lt;br /&gt;
* &amp;lt;math&amp;gt;p(1|X)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0|X)&amp;lt;/math&amp;gt; sont donc les probabilités d’obtenir la valeur de Y (1 ou 0) sachant les valeurs de X&lt;br /&gt;
&lt;br /&gt;
La régression logistique utilise l’hypothèse fondamentale (mesure de l’évidence) :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo3.png]]&lt;br /&gt;
&lt;br /&gt;
On en déduit donc (comme &amp;lt;math&amp;gt;p(0|X)=1-p(1|X))&amp;lt;/math&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo4.png]]&lt;br /&gt;
&lt;br /&gt;
Avec &amp;lt;math&amp;gt;(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; des variables à déterminer.&lt;br /&gt;
&lt;br /&gt;
''Note :'' ce modèle est appelé modèle LOGIT.&lt;br /&gt;
&lt;br /&gt;
===Estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
Contrairement à la régression linéaire affine, on ne peut pas utiliser la méthode des moindres carrés, on utilise alors la méthode de maximisation de la vraisemblance.&lt;br /&gt;
“La vraisemblance mesure une adéquation entre la distribution observée sur un échantillon aléatoire et une loi de probabilité supposée décrire une réalité sur la population dont l'échantillon est issu.” (source : [www.jybaudot.fr])&lt;br /&gt;
&lt;br /&gt;
Le calcul de la vraisemblance L dans un univers  de N échantillons est le suivant :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo5.png]]&lt;br /&gt;
&lt;br /&gt;
Plus la vraisemblance est élevée, alors plus la loi de probabilité est proche de la réalité. Le but est donc de maximiser cette valeur et de trouver les valeurs optimales de &amp;lt;math&amp;gt;A =(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; qui influent directement sur la loi de probabilité établie dans la partie modèle.&lt;br /&gt;
&lt;br /&gt;
===Algorithme d'optimisation===&lt;br /&gt;
&lt;br /&gt;
Afin de trouver la valeur optimale du vecteur A, nous utiliserons encore une fois la méthode de descente du gradient adaptée à notre cas.&lt;br /&gt;
&lt;br /&gt;
Celle-ci utilise la relation suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo6.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d’un certain nombre d’itérations, on trouvera la valeur optimale de A afin de maximiser la vraisemblance.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Mise en pratique''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Pour la mise en pratique, nous avons décidé d’appliquer les méthodes sur un dataset de prédiction de maintenance pour l’industrie, nous importons grâce à la librairie panda : &amp;lt;code&amp;gt; dataset = pd.read_csv('ai4i2020.csv') &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette dataset contient 14 colonnes de données, nous pouvons visualiser la proportion de données saines et non-saines par ce code seaborn : &amp;lt;code&amp;gt; sns.factorplot('Machine failure',data=dataset,kind='count') &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on traitera cette dataset pour la préparer sur l’intervention des modèles de machine learning, puis on appliquera ces méthodes.&lt;br /&gt;
&lt;br /&gt;
==Pré-traitement de la dataset==&lt;br /&gt;
&lt;br /&gt;
Avant d’appliquer les algorithme sur notre dataset, il faut la traiter, le traitement sera le même pour tous les algorithmes et suivra cet ordre :&lt;br /&gt;
* Traitement des valeurs manquantes&lt;br /&gt;
* Équilibrage des données&lt;br /&gt;
* Séparations des données en entrainement et test&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous devons regarder si notre base de données contient des valeurs manquante, pour cela nous implantons ce code : &lt;br /&gt;
&lt;br /&gt;
   import missingno as msno&lt;br /&gt;
   msno.matrix(dataset)&lt;br /&gt;
&lt;br /&gt;
Les lignes blanches dans le résultat correspond aux valeurs manquantes, ci-dessous nous voyons que nous avons aucune données manquantes dans la base que nous avons importer : [[Fichier:Miseenpratique.png]]&lt;br /&gt;
&lt;br /&gt;
Dans le cas, où nous avons des valeurs manquante, il y a plusieurs méthodes pour traiter les valeurs manquantes mais nous retenons 2 méthodes :&lt;br /&gt;
* Une méthode qui consiste à supprimer les lignes où des valeurs manquantes sont présentes : &amp;lt;code&amp;gt; data.dropna(inplace=True) &amp;lt;/code&amp;gt;&lt;br /&gt;
L’avantage de cette méthode est de créer un modèle robuste. L’inconvénient majeur est le fait qu’on peut perdre énormément de données, pour des données où les valeurs manquantes sont excessives, mieux vaut appliquer une autre méthode.&lt;br /&gt;
&lt;br /&gt;
* Une méthode qui consiste à remplacer les valeurs manquantes par la moyenne des données de la colonne : &amp;lt;code&amp;gt; data[0]=drop[0].replace(np.NaN,data[0].mean()) &amp;lt;/code&amp;gt; L’avantage de cette méthode permet d’éviter la suppression de lignes, ce qui permet de garder les autres données comparé à l’autre méthode. Cependant cette méthode n’est que applicable sur les données numériques&lt;br /&gt;
&lt;br /&gt;
Nous passons alors sur l'équilibrage des données. Avant d’appliquer la méthode SMOTE, nous devons mettre dans 2 variables, la target (y) et les features (X) :&lt;br /&gt;
&lt;br /&gt;
   X = dataset.drop(['Machine failure','UDI','Product ID','Type','TWF','HDF','PWF','OSF','RNF'],axis=1).values&lt;br /&gt;
   y = dataset['Machine failure']&lt;br /&gt;
&lt;br /&gt;
Notre target sera seulement ‘Machine failure’ et nos features seront : la température de l’air, la température du processus, le couple, et l’usure des outils.&lt;br /&gt;
&lt;br /&gt;
Durant notre projet , nous avons implémenté la technique SMOTE pour traiter les ensembles de données déséquilibrées.&lt;br /&gt;
Le principe de SMOTE est de générer de nouveaux échantillons en combinant les données de la classe minoritaire avec celles de leurs voisins proches. Techniquement, on peut décomposer SMOTE en 5 étapes :&lt;br /&gt;
* 1 - Choix d’un vecteur caractéristique de notre classe minoritaire que nous appellerons vc &lt;br /&gt;
* 2 - Sélection des k-voisins les plus proches (k=5 par défaut) et choix de l’un d’eux au hasard que l’on appellera pv &lt;br /&gt;
* 3 - Calcul de la différence pour chaque valeur caractéristique (feature value) i, vc[i]-pv[i] et multiplication de celle-ci par un nombre aléatoire entre [0,1]&lt;br /&gt;
* 4 - Ajout du résultat précédent à la valeur de la caractéristique i du vecteur vc afin d’obtenir un nouveau point (une nouvelle donnée) dans l’espace des caractéristiques &lt;br /&gt;
* 5 - Répétition de ces opérations pour chaque point de données de la classe minoritaire &lt;br /&gt;
Nous remarquons que cette technique marche après smote (50% données saines, 50% données non-saines)&lt;br /&gt;
&lt;br /&gt;
Code : &lt;br /&gt;
&lt;br /&gt;
   oversample = SMOTE()&lt;br /&gt;
   Xsmote, ysmote = oversample.fit_resample(X,y)&lt;br /&gt;
   Xsmote = pd.DataFrame(Xsmote)&lt;br /&gt;
   ysmote = pd.DataFrame(ysmote)&lt;br /&gt;
   X=Xsmote&lt;br /&gt;
   y=ysmote&lt;br /&gt;
&lt;br /&gt;
On remarque que la technique smote a ajouté 9322 lignes sur notre base, Maintenant que nous avons un équilibre entre les données ‘sains’ et ‘malsains’, nous pouvons voir la répartitions des points sur 2 axes :&lt;br /&gt;
&lt;br /&gt;
(image)&lt;br /&gt;
&lt;br /&gt;
Nous pouvons alors procéder à la séparation de nos données en données d'entraînement et de test&lt;br /&gt;
&lt;br /&gt;
Nous devons séparer en deux nos données pour pouvoir appliquer les algorithmes de machine learning, ainsi : &lt;br /&gt;
Les données d'entraînement serviront de repères pour l’algorithme&lt;br /&gt;
Les données de test seront entraînées par celle d’entrainement pour créer une prédiction&lt;br /&gt;
&lt;br /&gt;
Nous allons utiliser la fonction train_test_split de la librairie sklearn pour séparer nos données : &lt;br /&gt;
&lt;br /&gt;
   X_train, X_test, y_train, y_test = train_test_split(X,y, test_size = 0.2, random_state = 100)&lt;br /&gt;
&lt;br /&gt;
Ici dans les paramètres :&lt;br /&gt;
X  correspond aux features&lt;br /&gt;
y correspond à la target&lt;br /&gt;
test_size correspond au pourcentage de séparation (soit 0.2 = 20% test et 80% d'entraînement)&lt;br /&gt;
random_state permet d’initialiser le choix aléatoire pour avoir la même répartition à chaque exécution&lt;br /&gt;
&lt;br /&gt;
Maintenant nous pouvons appliquer les algorithme à notre modèle&lt;br /&gt;
&lt;br /&gt;
==Application des algorithmes==&lt;br /&gt;
&lt;br /&gt;
En général, nous allons appliquer les algorithme en suivant cet ordre : &lt;br /&gt;
* Importation de la méthode sur la librairie sklearn&lt;br /&gt;
* Entraînement des données&lt;br /&gt;
* Prédiction&lt;br /&gt;
* Méthodes d’évaluations&lt;br /&gt;
&lt;br /&gt;
===Régression linéaire===&lt;br /&gt;
&lt;br /&gt;
Nous allons commencer par le plus simple : la régression linéaire, nous commençons par importer l’algorithme à partir de la librairie sklearn : &amp;lt;code&amp;gt; from sklearn.linear_model import LinearRegression &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis nous appelons l’algorithme avec les paramètres de base, puis nous entraînons notre dataset : &lt;br /&gt;
   #Méthode de régréssion linéaire&lt;br /&gt;
   lr = LinearRegression()&lt;br /&gt;
   #Training&lt;br /&gt;
   lr.fit(X_train,y_train)&lt;br /&gt;
&lt;br /&gt;
Ensuite la prédiction : &lt;br /&gt;
   #Prediction&lt;br /&gt;
   y_pred = lr.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
Et enfin l'évaluation, nous avons vu 2 méthodes pour évaluer notre modèle : &lt;br /&gt;
* Afficher le score de prédiction&lt;br /&gt;
* Afficher la matrice de confusion, une matrice de taille 2x2 qui donne ces informations : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatrixConfusion.png]]&lt;br /&gt;
&lt;br /&gt;
Le score de prédiction (accuracy) est également calculé à partir de cette matrice&lt;br /&gt;
Pour la régression linéaire, nous allons qu’afficher le score de prédiction, car cet algorithme nous donne en retour des valeurs non-binaire, la construction d’une matrice de confusion et impossible.&lt;br /&gt;
&lt;br /&gt;
   #Evaluation&lt;br /&gt;
   print(lr.score(X_test,y_test))&lt;br /&gt;
&lt;br /&gt;
Nous obtenons ainsi un score de 0.48, un score qui est plus élevé sans la méthode SMOTE (0.14), sauf que cette méthode n’est pas la plus optimisée pour cette base de données, car nous avons en target des valeurs binaires. Il vaut mieux appliquer la méthode de régression logistique ou la méthode de Naives-Bayes.&lt;br /&gt;
&lt;br /&gt;
===Régression logistique===&lt;br /&gt;
&lt;br /&gt;
Dans le même modèle que la régression linéaire, nous procédons à l’import de la méthode, l’appel de la méthode, l'entraînement des données et de la prédiction :&lt;br /&gt;
&lt;br /&gt;
   from sklearn import linear_model&lt;br /&gt;
&lt;br /&gt;
   #Modèle régression logistique&lt;br /&gt;
   modele_regLog = linear_model.LogisticRegression() &lt;br /&gt;
   #random_state = 100, solver = 'liblinear', multi_class = 'auto'&lt;br /&gt;
&lt;br /&gt;
   #training&lt;br /&gt;
   modele_regLog.fit(X_train,y_train)&lt;br /&gt;
&lt;br /&gt;
   #prediction&lt;br /&gt;
   y_pred = modele_regLog.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
   #précision du modèle&lt;br /&gt;
   precision = modele_regLog.score(X_test,y_test)&lt;br /&gt;
   print(precision)&lt;br /&gt;
&lt;br /&gt;
Pour la régression logistique, nous allons afficher la matrice de confusion et le score :&lt;br /&gt;
&lt;br /&gt;
   from sklearn.metrics import plot_confusion_matrix&lt;br /&gt;
   plot_confusion_matrix(modele_regLog, X_test, y_test)  &lt;br /&gt;
   plt.show() &lt;br /&gt;
&lt;br /&gt;
(images)&lt;br /&gt;
&lt;br /&gt;
Nous obtenons un score de 0.82, contre 0.97 sans la méthode de SMOTE, ce qui est cohérent car le score obtenu sans SMOTE n’est pas précis car il y avait peu de données où la machine a planté. Avec SMOTE, nous obtenons certes un score moins élevé mais plus précis.&lt;br /&gt;
Grâce à la matrice de confusion nous pouvons voir que : &lt;br /&gt;
* Il y a 2396 fois où l’algorithme a prédit Machine failure = 0 et a eu raison&lt;br /&gt;
* Il y a 2377 fois où l’algorithme a prédit Machine failure = 1 et a eu raison&lt;br /&gt;
* Il y a 546 fois où l’algorithme a prédit Machine failure = 1 et a eu faux&lt;br /&gt;
* Il y a 478 fois où l’algorithme a prédit Machine failure = 0 et a eu faux&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 0px; padding: 20px; font-weight: bold; text-align: center; font-size: 80%; background: #61798F; vertical-align: top; width: 100%;&amp;quot;&amp;gt; '''PARTIE II (S8)''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Développement du projet''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Durant les deux premiers semestres de ce projet, nous avons découvert et étudié le Machine Learning, que ce soit la théorie de différents algorithmes connus ou l'application pratique à des datasets que nous pouvons récupérer sur Internet ou bien créer nous même.&lt;br /&gt;
&lt;br /&gt;
La création de notre dataset ayant été fastidieuse et peu concluante (voir résultats du semestre précédent), nous avons comme objectif pour ce semestre d'implémenter nos algorithmes (et principalement le réseau de neurones) à des machines dont nous avons accès à l'école.&lt;br /&gt;
&lt;br /&gt;
Après discussion avec notre tuteur de projet Monsieur Lakhal, nous avons décidé d'utiliser des Robotino plutôt que d'utiliser la chaîne de production présente à l'école car il existe des logiciels simples permettant d'effectuer des simulations de réseaux logistiques de Robotinos (Robotino View et Robotino Simulation) dont nous allons récupérer les données en temps réel, les traiter puis commander les différents Robotino à l'aide d’un algorithme de réseaux de neurones.&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce semestre est ainsi de réaliser le scénario d'un réseau logistique autonome (à l'image d'Amazon par exemple) composé de plusieurs Robotino effectuant chacun une tâche et d'y introduire des erreurs puis de les traiter grâce au Machine Learning afin de ne pas perturber la logistique et d’obtenir un maximum d’efficacité.&lt;br /&gt;
&lt;br /&gt;
Nous avons organisé ce projet en plusieurs étapes où chacun des membres a pu plus ou moins participé en fonction de ses capacités :&lt;br /&gt;
&lt;br /&gt;
* Conception du Grafcet pour la commande des Robotino&lt;br /&gt;
&lt;br /&gt;
* Récupération et traitement des données en temps réel&lt;br /&gt;
&lt;br /&gt;
* Utilisation du Machine Learning afin de commander les Robotino&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous avons constitué 2 équipes : une équipe spécialisée dans la commande du Robotino constituée de Loïc et Aymen et l’autre dans le traitement des données avec le Machine Learning avec Antoine, Tom et Florian.&lt;br /&gt;
Nous avons ensuite organisé notre projet à l’aide du diagramme de Gantt ci-dessous.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:GanttMLP5.png]]&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Grafcet pour la commande des Robotino''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Communication avec les Robotinos''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Réseau de neurones''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
=Recherche bibliographique=&lt;br /&gt;
&lt;br /&gt;
* https://www.wikipedia.com&lt;br /&gt;
&lt;br /&gt;
* https://www.jybaudot.fr&lt;br /&gt;
&lt;br /&gt;
* https://datascientest.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.ipgirl.com&lt;br /&gt;
&lt;br /&gt;
* Cours de probabilités et statistiques de l’Université Jules Vernes&lt;br /&gt;
&lt;br /&gt;
* Chaine youtube Machine Learning : https://www.youtube.com/channel/UCmpptkXu8iIFe6kfDK5o7VQ&lt;br /&gt;
&lt;br /&gt;
* Machine Learning with scikit-learn Quick Start Guide écrit par Kevin Jolly&lt;br /&gt;
&lt;br /&gt;
* https://lucidar.me/&lt;br /&gt;
&lt;br /&gt;
* https://archive.ics.uci.edu/ml/datasets.php&lt;br /&gt;
&lt;br /&gt;
* https://www.kaggle.com/datasets&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com/&lt;br /&gt;
&lt;br /&gt;
* Machine Learning algorithms - Second Edition écrit par Giuseppe Bonaccorso&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com&lt;br /&gt;
&lt;br /&gt;
* https://towardsdatascience.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.learndatasci.com/&lt;br /&gt;
&lt;br /&gt;
==Rapports et présentation==&lt;br /&gt;
&lt;br /&gt;
===Librairies===&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1CQZ1s6fNY_6MsmbBa5TP1OzSedqFeaWI?usp=sharing/ Rapport Numpy]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1tdu_B2wRsUiqdnSeskQENdn_wX3pJMeT?usp=sharing/ Rapport Pandas]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1DPS4ZT91SIEhscwST8kfER7u21tKoM3a?usp=sharing/ Rapport Seaborn]&lt;br /&gt;
&lt;br /&gt;
===Rapports===&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/document/d/1yR0vLePV3hI1_HVtTZWwGIwy0Cb-oLOsOTK3Um5KAYE/edit?usp=sharing/ Rapport S6-S7]&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/presentation/d/1Je_yF0dgc-s9gB7LLsfOg0b05xcwIFJbaqpVytxWv5A/edit?usp=sharing/ Présentation]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1y_NMo9XKJ0WzwE2zmcRblUyuIebwfoN8?usp=sharing/ Régression linéaire]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1bRyrnL1JM870cEcEvfGaS8ItrG16rchy?usp=sharing/ Google Colab]&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/document/d/1siLnQpgWSokm_J4l_XAxlv7r-kt-Dq5Jvg3PmN0AneQ/edit?usp=sharing/ Rapport S8]&lt;/div&gt;</summary>
		<author><name>Abrossas</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88071</id>
		<title>IMA3/IMA4 2020/2022 P5</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88071"/>
				<updated>2022-05-04T13:43:19Z</updated>
		
		<summary type="html">&lt;p&gt;Abrossas : /*  Communication avec les Robotinos  */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 0px; padding: 20px; font-weight: bold; text-align: center; font-size: 80%; background: #61798F; vertical-align: top; width: 100%;&amp;quot;&amp;gt; '''PARTIE I (S6-S7)''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Introduction et cahier des charges''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce projet est la mise en place d’algorithmes de machine Learning afin de diagnostiquer l’état de machines industrielles. Nous travaillerons sur ce projet durant 2 semestres. &lt;br /&gt;
Durant le premier semestre, nous avions comme objectifs d’acquérir la maîtrise des différentes librairies primordiales pour traiter les données en machine Learning, ainsi que d’étudier et d’utiliser certains algorithmes basiques (régression linéaire, logistique, Bayes) sur des datasets que nous traiterons nous même. &lt;br /&gt;
Pour ce qui est du second semestre, notre objectif était de concrétiser les connaissances acquises durant le premier semestre. Nous avons donc essayé de créer notre propre dataset à l’aide des matériels mis à notre disposition, de la prétraiter et d’y appliquer différents algorithmes de Machine Learning en critiquant les résultats.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning pour la détection de défaut s'inscrit parfaitement dans le contexte scientifique actuel, notamment grâce à l’industrie 4.0.&lt;br /&gt;
En effet, cette nouvelle industrie fait apparaître des systèmes communicants (l’IOT : Internet Of Things) interconnectés les uns entre les autres. Ces différents systèmes peuvent êtres nécessaires les uns, les autres afin de réaliser une tâche complexe telle que l'usinage de pièces. Le système devient dès lors potentiellement extrêmement fragile aux pannes.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning a pour but de pouvoir détecter, et localiser les pannes, voir les futures pannes potentielles afin de pouvoir dans un premier temps prévenir un opérateur. Mais il peut aussi potentiellement permettre au système de continuer de tourner, en attendant un technicien. Le machine Learning peut donc aussi permettre à une chaîne de production de continuer de tourner par l’envoie d’un autre robot par exemple, le temps que la panne soit réparée.&lt;br /&gt;
&lt;br /&gt;
Dans le schéma ci-dessous nous avons un exemple de système de système.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Intro1.png|500px|thumb|center|Schéma d'un système de systèmes]]&lt;br /&gt;
&lt;br /&gt;
Il y a deux cas de figure:&lt;br /&gt;
* Un autre système peut être envoyé pour remplacer le système 4.&lt;br /&gt;
* Les systèmes 1 et 2 peuvent permettre à la chaîne de production de continuer de tourner&lt;br /&gt;
* La chaîne de production est hors service jusqu'à réparation.&lt;br /&gt;
&lt;br /&gt;
==Cahier de charges==&lt;br /&gt;
&lt;br /&gt;
'''Ressources disponibles :'''&lt;br /&gt;
&lt;br /&gt;
* Livres sur le machine learning &lt;br /&gt;
* Bases de données (afin d'appliquer divers algorithmes de machine learning) que nous prendrons sur ces sites : [https://www.kaggle.com/datasets] et [https://archive.ics.uci.edu/ml/datasets.php]&lt;br /&gt;
* Librairies Python (Scikit-learn, Pandas, Numpy, Seaborn, Matplotlib)&lt;br /&gt;
* Google Colab&lt;br /&gt;
* Matlab (version étudiante)&lt;br /&gt;
&lt;br /&gt;
'''Objectifs poursuivis :'''&lt;br /&gt;
&lt;br /&gt;
* Détecter les dysfonctionnements de systèmes mécatroniques (par exemple les robots Khepera, Robotino…), grâce au machine learning.&lt;br /&gt;
* Apprendre à implémenter différentes méthodes machine learning .&lt;br /&gt;
&lt;br /&gt;
'''Profil du public cible :'''&lt;br /&gt;
* Secteur mécatronique&lt;br /&gt;
* Entreprises disposant d'ingénieurs pour maintenir le système informatique opérationnel&lt;br /&gt;
* Entreprises utilisant des machines dans le secteur public.&lt;br /&gt;
&lt;br /&gt;
'''Analyse des besoins :'''&lt;br /&gt;
* L’industrie a de plus en plus besoin du machine learning pour détecter les erreurs des systèmes. En effet, cette technologie devient indispensable pour les industriels, notamment afin d'accroître la productivité et l’efficacité des systèmes industriels.&lt;br /&gt;
* Le programme peut ne pas être aussi rapide et optimisé en espace mémoire que d'autres programmes, nous visons l’efficacité de notre algorithme plutôt que la rapidité.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Librairies''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
En Machine Learning, il est très important, voire primordial, de savoir manipuler les différentes librairies mises à notre disposition afin de visualiser, traiter nos différentes dataset ou même appliquer les différents algorithmes de machine Learning.&lt;br /&gt;
Durant les premières semaines de notre projet, nous avons donc appris à utiliser ces différentes librairies nécessaires pour le machine Learning, telles que Numpy, Seaborn, Panda, Matplotlib, Scikit-learn... Nous allons dans un premier temps nous intéresser à l'importation des différentes bibliothèques puis résumer les commandes importantes de ces différentes librairies.&lt;br /&gt;
&lt;br /&gt;
Ces différentes librairies ne sont pas incluses de base dans Python, il est donc nécessaire de les ajouter à Python puis à notre programme.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc choisi d'utiliser google colab car ces librairies y sont déjà installées (et aussi pratique pour travailler à plusieurs sur un même code).&lt;br /&gt;
Puis nous devons importer ces bibliothèques au début de notre programme.&lt;br /&gt;
&lt;br /&gt;
Attention : Plusieurs bibliothèques peuvent avoir la même commande mais avec des significations différentes, comme par exemple la commande randint du module numpy et celle du module random et cela peut conduire à des erreurs. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de pallier à ces problèmes nous apporterons nos librairie au début de nos programmes comme suit :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:librairies1.png]]&lt;br /&gt;
&lt;br /&gt;
Ici le np permet de dire que lorsque nous utilisons np.array alors nous utilisons la commande array () contenu dans la bibliothèque Numpy.&lt;br /&gt;
&lt;br /&gt;
Ceci nous permettra d’utiliser en simultané différentes librairies, toutes les bibliothèques seront importées selon ce schéma.&lt;br /&gt;
Nous allons par la suite, nous intéresser à différentes commandes incluses dans ces librairies.&lt;br /&gt;
&lt;br /&gt;
==Numpy==&lt;br /&gt;
&lt;br /&gt;
Numpy est une bibliothèque dédiée aux calculs mathématiques et à la gestion des listes (telles que des matrices).&lt;br /&gt;
Matplotlib, quant à lui, est dédié aux affichages graphiques de données.&lt;br /&gt;
Nous allons dans cette partie nous intéresser aux commandes principales de ces deux bibliothèques de python.&lt;br /&gt;
&lt;br /&gt;
Sous numpy, les tableaux sont des types array, ils définissent l'équivalent des tableaux statiques en langage C. La taille d’un tableau numpy ne peut donc pas être changée après leur création. &lt;br /&gt;
&lt;br /&gt;
Néanmoins grâce a Numpy nous pouvons simplement effectuer des tâches sur les tableaux comme en extraire un sous tableaux, et d’effectuer simplement les produits entre matrice, vecteur.&lt;br /&gt;
&lt;br /&gt;
Dans notre projet, nous utiliserons plus courament les fonctions : &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.shape&amp;lt;/FONT&amp;gt; permet d’obtenir la taille de la matrice sous forme d’un tuple, suffit de choisir le bon numéro&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.zeros&amp;lt;/FONT&amp;gt; permet de créer une ligne de x zéro(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.ones&amp;lt;/FONT&amp;gt; permet de créer une ligne de x un(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.vstack&amp;lt;/FONT&amp;gt; permet de rajouter des lignes dans une matrice déjà créer en paramètre&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.transpose&amp;lt;/FONT&amp;gt; permet de transposer une matrice en paramètre&lt;br /&gt;
&lt;br /&gt;
==Seaborn==&lt;br /&gt;
&lt;br /&gt;
Seaborn est une bibliothèque de visualisation de données Python basée sur matplotlib. Il fournit une interface de haut niveau pour dessiner des graphiques statistiques attrayants et informatifs.&lt;br /&gt;
&lt;br /&gt;
'''Différences entre Matplotlib et Seaborn'''&lt;br /&gt;
&lt;br /&gt;
Les défauts de Matplotlib qui ne parlent généralement pas aux utilisateurs sont les couleurs, les marques de tiques sur les axes supérieur et droit, le style,...&lt;br /&gt;
Les exemples ci-dessus rendent également une autre frustration des utilisateurs plus apparente: le fait que travailler avec DataFrames ne va pas aussi bien avec Matplotlib, ce qui peut être ennuyeux si vous faites une analyse exploratoire avec Pandas. Et c’est exactement ce que Seaborn adresse : les fonctions de traçage fonctionnent sur dataframes et tableaux qui contiennent tout un ensemble de données.&lt;br /&gt;
[[Fichier:seaborn1.png|300px|thumb|right|Résultat du code python ci gauche]]&lt;br /&gt;
&lt;br /&gt;
   # Import necessary libraries&lt;br /&gt;
   import seaborn as sns&lt;br /&gt;
   import matplotlib.pyplot as plt&lt;br /&gt;
   &lt;br /&gt;
   # Load iris data&lt;br /&gt;
   iris = sns.load_dataset(&amp;quot;iris&amp;quot;) #DATASET ALREADY EXISTING&lt;br /&gt;
   &lt;br /&gt;
   # Construct iris plot&lt;br /&gt;
   sns.swarmplot(x=&amp;quot;species&amp;quot;, y=&amp;quot;petal_length&amp;quot;, data=iris)&lt;br /&gt;
   &lt;br /&gt;
   # Show plot&lt;br /&gt;
   plt.show()&lt;br /&gt;
&lt;br /&gt;
==Pandas==&lt;br /&gt;
&lt;br /&gt;
Pandas est une API d'analyse de données orientée colonnes. C'est un excellent outil pour manipuler et analyser des données d'entrée. Beaucoup de frameworks d'apprentissage automatique acceptent les structures de données Pandas en entrée.&lt;br /&gt;
&lt;br /&gt;
Comme évoqué précédemment, Pandas travaille avec des matrices colonnes communément appelées ‘Series’ mais aussi et surtout avec des tableaux de données appelés ‘DataFrames’.&lt;br /&gt;
Une Series est tout simplement une colonne et une DataFrame est un tableau à plusieurs dimensions constitué de Series.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Panda.JPG]]&lt;br /&gt;
&lt;br /&gt;
A l'aide de Pandas, on peut ainsi créer, importer, lire et manipuler des bases de données facilement.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Théories des algorithmes étudiés''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Il y a différents types d’algorithmes en machine learning, pour notre sujet qui consiste à classer des machines en défectueuse ou fonctionnelles (1 ou 0), nous aurons surtout besoin d’algorithmes de classification binaire. De manière générale, la conception de la plupart des algorithmes fonctionnent de cette manière : &lt;br /&gt;
&lt;br /&gt;
* Élaborer un modèle &lt;br /&gt;
* Établir une fonction coût pour celui-ci correspondant à l’erreur entre le modèle et les données réelles&lt;br /&gt;
* Trouver un algorithme de minimisation de cette fonction coût&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression linéaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression1.png|200px|thumb|right|Exemple de régression linéaire]]&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est un algorithme de prédiction et non un algorithme de classification, nous aurons surtout besoin de ce deuxième type d’algorithme pour notre projet mais nous tenons à présenter cet algorithme qui est le plus basique en machine learning et un bon début pour une formation pédagogique.&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est une méthode de modélisation qui cherche à établir une relation linéaire entre une ou des &amp;quot;features&amp;quot; (variables explicatives) et une &amp;quot;target&amp;quot; (variable expliquée qu'on cherche à prévoir à partir des variables explicatives). En machine learning, la régression linéaire est un modèle d'apprentissage supervisé, c'est-à-dire qu'on apprend à l'algorithme de prédiction à partir d'exemples dont on dispose dans une dataset. Nous nous intéresserons à la régression affine qui est la plus simple pour débuter.&lt;br /&gt;
&lt;br /&gt;
===Modèle et estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
La régression affine consiste donc à trouver un modèle de type&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt;y=ax+b&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
avec x une &amp;quot;feature&amp;quot;, y la target et avec a et b des paramètres qu'il nous faudra déterminer. Le but est donc de trouver les paramètres a et b tels que la distance entre chaque point du nuage et la droite du modèle soit la plus petite possible.&lt;br /&gt;
Mathématiquement, il suffit de résoudre cette formule:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression2.png|200px|thumb|right|Méthode des moindres carrés illustrée]]&lt;br /&gt;
[[Fichier:regression3.png]]&lt;br /&gt;
&lt;br /&gt;
On utilise donc la méthode des moindres carrés pour mesurer l'erreur entre le modèle de prédiction et les données et ainsi fabriquer notre fonction coût :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression4.png]]&lt;br /&gt;
&lt;br /&gt;
avec m le nombre de points du nuage.&lt;br /&gt;
&lt;br /&gt;
L'objectif de l'algorithme est donc de trouver les paramètres optimaux qui minimisent cette fonction J.&lt;br /&gt;
En machine learning, une des méthodes les plus populaires pour faire ceci est la descente de gradient, car c'est une méthode adaptée quand on fait du traitement de grosses dataset (&amp;quot;faible&amp;quot; temps de calcul). En effet, la fonction coût J est une parabole admettant un unique minimum dépendant des paramètres a et b. La descente de gradient consiste à chercher le point de celle-ci où la dérivée est nulle (donc le minimum)&lt;br /&gt;
&lt;br /&gt;
===Méthode de la descente du gradient===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression6.png|200px|thumb|right|Méthode gradient]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression7.png|200px|thumb|right|Généralisation gradient fct parabolique]]&lt;br /&gt;
&lt;br /&gt;
Soit une fonction parabolique ne dépendant que de x. On cherche à trouver le minimum de cette fonction en utilisant la méthode de la descente du gradient&lt;br /&gt;
Pour cela on choisit un point aléatoirement &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;et on va descendre à partir de celui-ci jusqu'à atteindre un minimum en utilisant&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression5.png]]&lt;br /&gt;
&lt;br /&gt;
avec un paramètre  qui influencera la taille du pas de la descente.&lt;br /&gt;
&lt;br /&gt;
Il faut faire attention à ne pas prendre un pas trop grand, ni trop petit, pour éviter de &amp;quot;tourner&amp;quot; autour du minimum ou de prendre trop de temps pour l'atteindre.&lt;br /&gt;
Note : On peut généraliser cela pour une fonction parabolique à n paramètres qui aurait donc une forme de bol.&lt;br /&gt;
&lt;br /&gt;
===Application sur notre fonction coût===&lt;br /&gt;
&lt;br /&gt;
Notre fonction coût dépend des 2 paramètres a et b :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression8.png]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression9.png]]&lt;br /&gt;
&lt;br /&gt;
On choisit &amp;lt;math&amp;gt;a_0&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; aléatoirement et on applique ceci pour un pas :&lt;br /&gt;
&lt;br /&gt;
Avec &lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression10.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d'un certain nombre d'itérations on trouve le couple &amp;lt;math&amp;gt;(a,b)&amp;lt;/math&amp;gt; qui minimise notre fonction coût.&lt;br /&gt;
&lt;br /&gt;
Note : Nous avons démontré la théorie de la régression linéaire affine mais on pourrait généraliser celle-ci pour un modèle polynomiale d’ordre n, la courbe de prédiction serait donc parabolique et il faudrait trouver le tuple &amp;lt;math&amp;gt;(a_1,a_2,...,a_n)&amp;lt;/math&amp;gt; qui minimise la fonction coût.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression logistique binaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo1.png|200px|thumb|right|Modèle régression logistique]]&lt;br /&gt;
&lt;br /&gt;
La régression logistique binaire est un algorithme de classification, contrairement à la régression linéaire qui est un algorithme de prédiction. De la même façon que la régression linéaire,  il s'agit de modéliser au mieux un modèle mathématique simple à des observations réelles nombreuses. Cette méthode se base sur de l’analyse mathématiques et statistique. Il faut donc associer à des “features” &amp;lt;math&amp;gt;(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; une variable Y valant 1 ou 0 (d’où le terme classification binaire).&lt;br /&gt;
&lt;br /&gt;
L’objectif de l’algorithme est donc de trouver la fonction F dépendant d’une loi de probabilité telle que :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo2.png]]&lt;br /&gt;
&lt;br /&gt;
avec S un certain seuil (fixé la plupart du temps à 0,5).&lt;br /&gt;
&lt;br /&gt;
===Modèle===&lt;br /&gt;
&lt;br /&gt;
Comme cette méthode repose principalement sur des statistiques, il est important d’adopter une notation explicite lors de l’explication théorique :&lt;br /&gt;
&lt;br /&gt;
* On notera Y la variable à prédire (qui vaudra 0 ou 1) et &amp;lt;math&amp;gt;X=(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; les variables permettant de prédire Y&lt;br /&gt;
* On travaillera dans un univers  de N échantillons (taille de la dataset)&lt;br /&gt;
* On notera &amp;lt;math&amp;gt;P(Y=1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;P(Y=0)&amp;lt;/math&amp;gt; les probabilités que Y valent respectivement 1 ou 0 &amp;lt;math&amp;gt;p(1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0)&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;p(X|1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(X|0)&amp;lt;/math&amp;gt; sont les distributions conditionnelles des caractéristiques X sachant la valeur prise par Y&lt;br /&gt;
* &amp;lt;math&amp;gt;p(1|X)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0|X)&amp;lt;/math&amp;gt; sont donc les probabilités d’obtenir la valeur de Y (1 ou 0) sachant les valeurs de X&lt;br /&gt;
&lt;br /&gt;
La régression logistique utilise l’hypothèse fondamentale (mesure de l’évidence) :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo3.png]]&lt;br /&gt;
&lt;br /&gt;
On en déduit donc (comme &amp;lt;math&amp;gt;p(0|X)=1-p(1|X))&amp;lt;/math&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo4.png]]&lt;br /&gt;
&lt;br /&gt;
Avec &amp;lt;math&amp;gt;(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; des variables à déterminer.&lt;br /&gt;
&lt;br /&gt;
''Note :'' ce modèle est appelé modèle LOGIT.&lt;br /&gt;
&lt;br /&gt;
===Estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
Contrairement à la régression linéaire affine, on ne peut pas utiliser la méthode des moindres carrés, on utilise alors la méthode de maximisation de la vraisemblance.&lt;br /&gt;
“La vraisemblance mesure une adéquation entre la distribution observée sur un échantillon aléatoire et une loi de probabilité supposée décrire une réalité sur la population dont l'échantillon est issu.” (source : [www.jybaudot.fr])&lt;br /&gt;
&lt;br /&gt;
Le calcul de la vraisemblance L dans un univers  de N échantillons est le suivant :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo5.png]]&lt;br /&gt;
&lt;br /&gt;
Plus la vraisemblance est élevée, alors plus la loi de probabilité est proche de la réalité. Le but est donc de maximiser cette valeur et de trouver les valeurs optimales de &amp;lt;math&amp;gt;A =(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; qui influent directement sur la loi de probabilité établie dans la partie modèle.&lt;br /&gt;
&lt;br /&gt;
===Algorithme d'optimisation===&lt;br /&gt;
&lt;br /&gt;
Afin de trouver la valeur optimale du vecteur A, nous utiliserons encore une fois la méthode de descente du gradient adaptée à notre cas.&lt;br /&gt;
&lt;br /&gt;
Celle-ci utilise la relation suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo6.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d’un certain nombre d’itérations, on trouvera la valeur optimale de A afin de maximiser la vraisemblance.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Mise en pratique''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Pour la mise en pratique, nous avons décidé d’appliquer les méthodes sur un dataset de prédiction de maintenance pour l’industrie, nous importons grâce à la librairie panda : &amp;lt;code&amp;gt; dataset = pd.read_csv('ai4i2020.csv') &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette dataset contient 14 colonnes de données, nous pouvons visualiser la proportion de données saines et non-saines par ce code seaborn : &amp;lt;code&amp;gt; sns.factorplot('Machine failure',data=dataset,kind='count') &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on traitera cette dataset pour la préparer sur l’intervention des modèles de machine learning, puis on appliquera ces méthodes.&lt;br /&gt;
&lt;br /&gt;
==Pré-traitement de la dataset==&lt;br /&gt;
&lt;br /&gt;
Avant d’appliquer les algorithme sur notre dataset, il faut la traiter, le traitement sera le même pour tous les algorithmes et suivra cet ordre :&lt;br /&gt;
* Traitement des valeurs manquantes&lt;br /&gt;
* Équilibrage des données&lt;br /&gt;
* Séparations des données en entrainement et test&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous devons regarder si notre base de données contient des valeurs manquante, pour cela nous implantons ce code : &lt;br /&gt;
&lt;br /&gt;
   import missingno as msno&lt;br /&gt;
   msno.matrix(dataset)&lt;br /&gt;
&lt;br /&gt;
Les lignes blanches dans le résultat correspond aux valeurs manquantes, ci-dessous nous voyons que nous avons aucune données manquantes dans la base que nous avons importer : [[Fichier:Miseenpratique.png]]&lt;br /&gt;
&lt;br /&gt;
Dans le cas, où nous avons des valeurs manquante, il y a plusieurs méthodes pour traiter les valeurs manquantes mais nous retenons 2 méthodes :&lt;br /&gt;
* Une méthode qui consiste à supprimer les lignes où des valeurs manquantes sont présentes : &amp;lt;code&amp;gt; data.dropna(inplace=True) &amp;lt;/code&amp;gt;&lt;br /&gt;
L’avantage de cette méthode est de créer un modèle robuste. L’inconvénient majeur est le fait qu’on peut perdre énormément de données, pour des données où les valeurs manquantes sont excessives, mieux vaut appliquer une autre méthode.&lt;br /&gt;
&lt;br /&gt;
* Une méthode qui consiste à remplacer les valeurs manquantes par la moyenne des données de la colonne : &amp;lt;code&amp;gt; data[0]=drop[0].replace(np.NaN,data[0].mean()) &amp;lt;/code&amp;gt; L’avantage de cette méthode permet d’éviter la suppression de lignes, ce qui permet de garder les autres données comparé à l’autre méthode. Cependant cette méthode n’est que applicable sur les données numériques&lt;br /&gt;
&lt;br /&gt;
Nous passons alors sur l'équilibrage des données. Avant d’appliquer la méthode SMOTE, nous devons mettre dans 2 variables, la target (y) et les features (X) :&lt;br /&gt;
&lt;br /&gt;
   X = dataset.drop(['Machine failure','UDI','Product ID','Type','TWF','HDF','PWF','OSF','RNF'],axis=1).values&lt;br /&gt;
   y = dataset['Machine failure']&lt;br /&gt;
&lt;br /&gt;
Notre target sera seulement ‘Machine failure’ et nos features seront : la température de l’air, la température du processus, le couple, et l’usure des outils.&lt;br /&gt;
&lt;br /&gt;
Durant notre projet , nous avons implémenté la technique SMOTE pour traiter les ensembles de données déséquilibrées.&lt;br /&gt;
Le principe de SMOTE est de générer de nouveaux échantillons en combinant les données de la classe minoritaire avec celles de leurs voisins proches. Techniquement, on peut décomposer SMOTE en 5 étapes :&lt;br /&gt;
* 1 - Choix d’un vecteur caractéristique de notre classe minoritaire que nous appellerons vc &lt;br /&gt;
* 2 - Sélection des k-voisins les plus proches (k=5 par défaut) et choix de l’un d’eux au hasard que l’on appellera pv &lt;br /&gt;
* 3 - Calcul de la différence pour chaque valeur caractéristique (feature value) i, vc[i]-pv[i] et multiplication de celle-ci par un nombre aléatoire entre [0,1]&lt;br /&gt;
* 4 - Ajout du résultat précédent à la valeur de la caractéristique i du vecteur vc afin d’obtenir un nouveau point (une nouvelle donnée) dans l’espace des caractéristiques &lt;br /&gt;
* 5 - Répétition de ces opérations pour chaque point de données de la classe minoritaire &lt;br /&gt;
Nous remarquons que cette technique marche après smote (50% données saines, 50% données non-saines)&lt;br /&gt;
&lt;br /&gt;
Code : &lt;br /&gt;
&lt;br /&gt;
   oversample = SMOTE()&lt;br /&gt;
   Xsmote, ysmote = oversample.fit_resample(X,y)&lt;br /&gt;
   Xsmote = pd.DataFrame(Xsmote)&lt;br /&gt;
   ysmote = pd.DataFrame(ysmote)&lt;br /&gt;
   X=Xsmote&lt;br /&gt;
   y=ysmote&lt;br /&gt;
&lt;br /&gt;
On remarque que la technique smote a ajouté 9322 lignes sur notre base, Maintenant que nous avons un équilibre entre les données ‘sains’ et ‘malsains’, nous pouvons voir la répartitions des points sur 2 axes :&lt;br /&gt;
&lt;br /&gt;
(image)&lt;br /&gt;
&lt;br /&gt;
Nous pouvons alors procéder à la séparation de nos données en données d'entraînement et de test&lt;br /&gt;
&lt;br /&gt;
Nous devons séparer en deux nos données pour pouvoir appliquer les algorithmes de machine learning, ainsi : &lt;br /&gt;
Les données d'entraînement serviront de repères pour l’algorithme&lt;br /&gt;
Les données de test seront entraînées par celle d’entrainement pour créer une prédiction&lt;br /&gt;
&lt;br /&gt;
Nous allons utiliser la fonction train_test_split de la librairie sklearn pour séparer nos données : &lt;br /&gt;
&lt;br /&gt;
   X_train, X_test, y_train, y_test = train_test_split(X,y, test_size = 0.2, random_state = 100)&lt;br /&gt;
&lt;br /&gt;
Ici dans les paramètres :&lt;br /&gt;
X  correspond aux features&lt;br /&gt;
y correspond à la target&lt;br /&gt;
test_size correspond au pourcentage de séparation (soit 0.2 = 20% test et 80% d'entraînement)&lt;br /&gt;
random_state permet d’initialiser le choix aléatoire pour avoir la même répartition à chaque exécution&lt;br /&gt;
&lt;br /&gt;
Maintenant nous pouvons appliquer les algorithme à notre modèle&lt;br /&gt;
&lt;br /&gt;
==Application des algorithmes==&lt;br /&gt;
&lt;br /&gt;
En général, nous allons appliquer les algorithme en suivant cet ordre : &lt;br /&gt;
* Importation de la méthode sur la librairie sklearn&lt;br /&gt;
* Entraînement des données&lt;br /&gt;
* Prédiction&lt;br /&gt;
* Méthodes d’évaluations&lt;br /&gt;
&lt;br /&gt;
===Régression linéaire===&lt;br /&gt;
&lt;br /&gt;
Nous allons commencer par le plus simple : la régression linéaire, nous commençons par importer l’algorithme à partir de la librairie sklearn : &amp;lt;code&amp;gt; from sklearn.linear_model import LinearRegression &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis nous appelons l’algorithme avec les paramètres de base, puis nous entraînons notre dataset : &lt;br /&gt;
   #Méthode de régréssion linéaire&lt;br /&gt;
   lr = LinearRegression()&lt;br /&gt;
   #Training&lt;br /&gt;
   lr.fit(X_train,y_train)&lt;br /&gt;
&lt;br /&gt;
Ensuite la prédiction : &lt;br /&gt;
   #Prediction&lt;br /&gt;
   y_pred = lr.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
Et enfin l'évaluation, nous avons vu 2 méthodes pour évaluer notre modèle : &lt;br /&gt;
* Afficher le score de prédiction&lt;br /&gt;
* Afficher la matrice de confusion, une matrice de taille 2x2 qui donne ces informations : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatrixConfusion.png]]&lt;br /&gt;
&lt;br /&gt;
Le score de prédiction (accuracy) est également calculé à partir de cette matrice&lt;br /&gt;
Pour la régression linéaire, nous allons qu’afficher le score de prédiction, car cet algorithme nous donne en retour des valeurs non-binaire, la construction d’une matrice de confusion et impossible.&lt;br /&gt;
&lt;br /&gt;
   #Evaluation&lt;br /&gt;
   print(lr.score(X_test,y_test))&lt;br /&gt;
&lt;br /&gt;
Nous obtenons ainsi un score de 0.48, un score qui est plus élevé sans la méthode SMOTE (0.14), sauf que cette méthode n’est pas la plus optimisée pour cette base de données, car nous avons en target des valeurs binaires. Il vaut mieux appliquer la méthode de régression logistique ou la méthode de Naives-Bayes.&lt;br /&gt;
&lt;br /&gt;
===Régression logistique===&lt;br /&gt;
&lt;br /&gt;
Dans le même modèle que la régression linéaire, nous procédons à l’import de la méthode, l’appel de la méthode, l'entraînement des données et de la prédiction :&lt;br /&gt;
&lt;br /&gt;
   from sklearn import linear_model&lt;br /&gt;
&lt;br /&gt;
   #Modèle régression logistique&lt;br /&gt;
   modele_regLog = linear_model.LogisticRegression() &lt;br /&gt;
   #random_state = 100, solver = 'liblinear', multi_class = 'auto'&lt;br /&gt;
&lt;br /&gt;
   #training&lt;br /&gt;
   modele_regLog.fit(X_train,y_train)&lt;br /&gt;
&lt;br /&gt;
   #prediction&lt;br /&gt;
   y_pred = modele_regLog.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
   #précision du modèle&lt;br /&gt;
   precision = modele_regLog.score(X_test,y_test)&lt;br /&gt;
   print(precision)&lt;br /&gt;
&lt;br /&gt;
Pour la régression logistique, nous allons afficher la matrice de confusion et le score :&lt;br /&gt;
&lt;br /&gt;
   from sklearn.metrics import plot_confusion_matrix&lt;br /&gt;
   plot_confusion_matrix(modele_regLog, X_test, y_test)  &lt;br /&gt;
   plt.show() &lt;br /&gt;
&lt;br /&gt;
(images)&lt;br /&gt;
&lt;br /&gt;
Nous obtenons un score de 0.82, contre 0.97 sans la méthode de SMOTE, ce qui est cohérent car le score obtenu sans SMOTE n’est pas précis car il y avait peu de données où la machine a planté. Avec SMOTE, nous obtenons certes un score moins élevé mais plus précis.&lt;br /&gt;
Grâce à la matrice de confusion nous pouvons voir que : &lt;br /&gt;
* Il y a 2396 fois où l’algorithme a prédit Machine failure = 0 et a eu raison&lt;br /&gt;
* Il y a 2377 fois où l’algorithme a prédit Machine failure = 1 et a eu raison&lt;br /&gt;
* Il y a 546 fois où l’algorithme a prédit Machine failure = 1 et a eu faux&lt;br /&gt;
* Il y a 478 fois où l’algorithme a prédit Machine failure = 0 et a eu faux&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 0px; padding: 20px; font-weight: bold; text-align: center; font-size: 80%; background: #61798F; vertical-align: top; width: 100%;&amp;quot;&amp;gt; '''PARTIE II (S8)''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Développement du projet''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Durant les deux premiers semestres de ce projet, nous avons découvert et étudié le Machine Learning, que ce soit la théorie de différents algorithmes connus ou l'application pratique à des datasets que nous pouvons récupérer sur Internet ou bien créer nous même.&lt;br /&gt;
&lt;br /&gt;
La création de notre dataset ayant été fastidieuse et peu concluante (voir résultats du semestre précédent), nous avons comme objectif pour ce semestre d'implémenter nos algorithmes (et principalement le réseau de neurones) à des machines dont nous avons accès à l'école.&lt;br /&gt;
&lt;br /&gt;
Après discussion avec notre tuteur de projet Monsieur Lakhal, nous avons décidé d'utiliser des Robotino plutôt que d'utiliser la chaîne de production présente à l'école car il existe des logiciels simples permettant d'effectuer des simulations de réseaux logistiques de Robotinos (Robotino View et Robotino Simulation) dont nous allons récupérer les données en temps réel, les traiter puis commander les différents Robotino à l'aide d’un algorithme de réseaux de neurones.&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce semestre est ainsi de réaliser le scénario d'un réseau logistique autonome (à l'image d'Amazon par exemple) composé de plusieurs Robotino effectuant chacun une tâche et d'y introduire des erreurs puis de les traiter grâce au Machine Learning afin de ne pas perturber la logistique et d’obtenir un maximum d’efficacité.&lt;br /&gt;
&lt;br /&gt;
Nous avons organisé ce projet en plusieurs étapes où chacun des membres a pu plus ou moins participé en fonction de ses capacités :&lt;br /&gt;
&lt;br /&gt;
* Conception du Grafcet pour la commande des Robotino&lt;br /&gt;
&lt;br /&gt;
* Récupération et traitement des données en temps réel&lt;br /&gt;
&lt;br /&gt;
* Utilisation du Machine Learning afin de commander les Robotino&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous avons constitué 2 équipes : une équipe spécialisée dans la commande du Robotino constituée de Loïc et Aymen et l’autre dans le traitement des données avec le Machine Learning avec Antoine, Tom et Florian.&lt;br /&gt;
Nous avons ensuite organisé notre projet à l’aide du diagramme de Gantt ci-dessous.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:GanttMLP5.png]]&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Grafcet pour la commande des Robotino''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Communication avec les Robotinos''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Réseau de neurones''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
=Recherche bibliographique=&lt;br /&gt;
&lt;br /&gt;
* https://www.wikipedia.com&lt;br /&gt;
&lt;br /&gt;
* https://www.jybaudot.fr&lt;br /&gt;
&lt;br /&gt;
* https://datascientest.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.ipgirl.com&lt;br /&gt;
&lt;br /&gt;
* Cours de probabilités et statistiques de l’Université Jules Vernes&lt;br /&gt;
&lt;br /&gt;
* Chaine youtube Machine Learning : https://www.youtube.com/channel/UCmpptkXu8iIFe6kfDK5o7VQ&lt;br /&gt;
&lt;br /&gt;
* Machine Learning with scikit-learn Quick Start Guide écrit par Kevin Jolly&lt;br /&gt;
&lt;br /&gt;
* https://lucidar.me/&lt;br /&gt;
&lt;br /&gt;
* https://archive.ics.uci.edu/ml/datasets.php&lt;br /&gt;
&lt;br /&gt;
* https://www.kaggle.com/datasets&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com/&lt;br /&gt;
&lt;br /&gt;
* Machine Learning algorithms - Second Edition écrit par Giuseppe Bonaccorso&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com&lt;br /&gt;
&lt;br /&gt;
* https://towardsdatascience.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.learndatasci.com/&lt;br /&gt;
&lt;br /&gt;
==Rapports et présentation==&lt;br /&gt;
&lt;br /&gt;
===Librairies===&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1CQZ1s6fNY_6MsmbBa5TP1OzSedqFeaWI?usp=sharing/ Rapport Numpy]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1tdu_B2wRsUiqdnSeskQENdn_wX3pJMeT?usp=sharing/ Rapport Pandas]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1DPS4ZT91SIEhscwST8kfER7u21tKoM3a?usp=sharing/ Rapport Seaborn]&lt;br /&gt;
&lt;br /&gt;
===Rapports===&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/document/d/1yR0vLePV3hI1_HVtTZWwGIwy0Cb-oLOsOTK3Um5KAYE/edit?usp=sharing/ Rapport]&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/presentation/d/1Je_yF0dgc-s9gB7LLsfOg0b05xcwIFJbaqpVytxWv5A/edit?usp=sharing/ Présentation]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1y_NMo9XKJ0WzwE2zmcRblUyuIebwfoN8?usp=sharing/ Régression linéaire]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1bRyrnL1JM870cEcEvfGaS8ItrG16rchy?usp=sharing/ Google Colab]&lt;/div&gt;</summary>
		<author><name>Abrossas</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88070</id>
		<title>IMA3/IMA4 2020/2022 P5</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88070"/>
				<updated>2022-05-04T13:42:13Z</updated>
		
		<summary type="html">&lt;p&gt;Abrossas : /*  Traitement des erreurs  */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 0px; padding: 20px; font-weight: bold; text-align: center; font-size: 80%; background: #61798F; vertical-align: top; width: 100%;&amp;quot;&amp;gt; '''PARTIE I (S6-S7)''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Introduction et cahier des charges''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce projet est la mise en place d’algorithmes de machine Learning afin de diagnostiquer l’état de machines industrielles. Nous travaillerons sur ce projet durant 2 semestres. &lt;br /&gt;
Durant le premier semestre, nous avions comme objectifs d’acquérir la maîtrise des différentes librairies primordiales pour traiter les données en machine Learning, ainsi que d’étudier et d’utiliser certains algorithmes basiques (régression linéaire, logistique, Bayes) sur des datasets que nous traiterons nous même. &lt;br /&gt;
Pour ce qui est du second semestre, notre objectif était de concrétiser les connaissances acquises durant le premier semestre. Nous avons donc essayé de créer notre propre dataset à l’aide des matériels mis à notre disposition, de la prétraiter et d’y appliquer différents algorithmes de Machine Learning en critiquant les résultats.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning pour la détection de défaut s'inscrit parfaitement dans le contexte scientifique actuel, notamment grâce à l’industrie 4.0.&lt;br /&gt;
En effet, cette nouvelle industrie fait apparaître des systèmes communicants (l’IOT : Internet Of Things) interconnectés les uns entre les autres. Ces différents systèmes peuvent êtres nécessaires les uns, les autres afin de réaliser une tâche complexe telle que l'usinage de pièces. Le système devient dès lors potentiellement extrêmement fragile aux pannes.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning a pour but de pouvoir détecter, et localiser les pannes, voir les futures pannes potentielles afin de pouvoir dans un premier temps prévenir un opérateur. Mais il peut aussi potentiellement permettre au système de continuer de tourner, en attendant un technicien. Le machine Learning peut donc aussi permettre à une chaîne de production de continuer de tourner par l’envoie d’un autre robot par exemple, le temps que la panne soit réparée.&lt;br /&gt;
&lt;br /&gt;
Dans le schéma ci-dessous nous avons un exemple de système de système.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Intro1.png|500px|thumb|center|Schéma d'un système de systèmes]]&lt;br /&gt;
&lt;br /&gt;
Il y a deux cas de figure:&lt;br /&gt;
* Un autre système peut être envoyé pour remplacer le système 4.&lt;br /&gt;
* Les systèmes 1 et 2 peuvent permettre à la chaîne de production de continuer de tourner&lt;br /&gt;
* La chaîne de production est hors service jusqu'à réparation.&lt;br /&gt;
&lt;br /&gt;
==Cahier de charges==&lt;br /&gt;
&lt;br /&gt;
'''Ressources disponibles :'''&lt;br /&gt;
&lt;br /&gt;
* Livres sur le machine learning &lt;br /&gt;
* Bases de données (afin d'appliquer divers algorithmes de machine learning) que nous prendrons sur ces sites : [https://www.kaggle.com/datasets] et [https://archive.ics.uci.edu/ml/datasets.php]&lt;br /&gt;
* Librairies Python (Scikit-learn, Pandas, Numpy, Seaborn, Matplotlib)&lt;br /&gt;
* Google Colab&lt;br /&gt;
* Matlab (version étudiante)&lt;br /&gt;
&lt;br /&gt;
'''Objectifs poursuivis :'''&lt;br /&gt;
&lt;br /&gt;
* Détecter les dysfonctionnements de systèmes mécatroniques (par exemple les robots Khepera, Robotino…), grâce au machine learning.&lt;br /&gt;
* Apprendre à implémenter différentes méthodes machine learning .&lt;br /&gt;
&lt;br /&gt;
'''Profil du public cible :'''&lt;br /&gt;
* Secteur mécatronique&lt;br /&gt;
* Entreprises disposant d'ingénieurs pour maintenir le système informatique opérationnel&lt;br /&gt;
* Entreprises utilisant des machines dans le secteur public.&lt;br /&gt;
&lt;br /&gt;
'''Analyse des besoins :'''&lt;br /&gt;
* L’industrie a de plus en plus besoin du machine learning pour détecter les erreurs des systèmes. En effet, cette technologie devient indispensable pour les industriels, notamment afin d'accroître la productivité et l’efficacité des systèmes industriels.&lt;br /&gt;
* Le programme peut ne pas être aussi rapide et optimisé en espace mémoire que d'autres programmes, nous visons l’efficacité de notre algorithme plutôt que la rapidité.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Librairies''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
En Machine Learning, il est très important, voire primordial, de savoir manipuler les différentes librairies mises à notre disposition afin de visualiser, traiter nos différentes dataset ou même appliquer les différents algorithmes de machine Learning.&lt;br /&gt;
Durant les premières semaines de notre projet, nous avons donc appris à utiliser ces différentes librairies nécessaires pour le machine Learning, telles que Numpy, Seaborn, Panda, Matplotlib, Scikit-learn... Nous allons dans un premier temps nous intéresser à l'importation des différentes bibliothèques puis résumer les commandes importantes de ces différentes librairies.&lt;br /&gt;
&lt;br /&gt;
Ces différentes librairies ne sont pas incluses de base dans Python, il est donc nécessaire de les ajouter à Python puis à notre programme.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc choisi d'utiliser google colab car ces librairies y sont déjà installées (et aussi pratique pour travailler à plusieurs sur un même code).&lt;br /&gt;
Puis nous devons importer ces bibliothèques au début de notre programme.&lt;br /&gt;
&lt;br /&gt;
Attention : Plusieurs bibliothèques peuvent avoir la même commande mais avec des significations différentes, comme par exemple la commande randint du module numpy et celle du module random et cela peut conduire à des erreurs. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de pallier à ces problèmes nous apporterons nos librairie au début de nos programmes comme suit :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:librairies1.png]]&lt;br /&gt;
&lt;br /&gt;
Ici le np permet de dire que lorsque nous utilisons np.array alors nous utilisons la commande array () contenu dans la bibliothèque Numpy.&lt;br /&gt;
&lt;br /&gt;
Ceci nous permettra d’utiliser en simultané différentes librairies, toutes les bibliothèques seront importées selon ce schéma.&lt;br /&gt;
Nous allons par la suite, nous intéresser à différentes commandes incluses dans ces librairies.&lt;br /&gt;
&lt;br /&gt;
==Numpy==&lt;br /&gt;
&lt;br /&gt;
Numpy est une bibliothèque dédiée aux calculs mathématiques et à la gestion des listes (telles que des matrices).&lt;br /&gt;
Matplotlib, quant à lui, est dédié aux affichages graphiques de données.&lt;br /&gt;
Nous allons dans cette partie nous intéresser aux commandes principales de ces deux bibliothèques de python.&lt;br /&gt;
&lt;br /&gt;
Sous numpy, les tableaux sont des types array, ils définissent l'équivalent des tableaux statiques en langage C. La taille d’un tableau numpy ne peut donc pas être changée après leur création. &lt;br /&gt;
&lt;br /&gt;
Néanmoins grâce a Numpy nous pouvons simplement effectuer des tâches sur les tableaux comme en extraire un sous tableaux, et d’effectuer simplement les produits entre matrice, vecteur.&lt;br /&gt;
&lt;br /&gt;
Dans notre projet, nous utiliserons plus courament les fonctions : &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.shape&amp;lt;/FONT&amp;gt; permet d’obtenir la taille de la matrice sous forme d’un tuple, suffit de choisir le bon numéro&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.zeros&amp;lt;/FONT&amp;gt; permet de créer une ligne de x zéro(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.ones&amp;lt;/FONT&amp;gt; permet de créer une ligne de x un(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.vstack&amp;lt;/FONT&amp;gt; permet de rajouter des lignes dans une matrice déjà créer en paramètre&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.transpose&amp;lt;/FONT&amp;gt; permet de transposer une matrice en paramètre&lt;br /&gt;
&lt;br /&gt;
==Seaborn==&lt;br /&gt;
&lt;br /&gt;
Seaborn est une bibliothèque de visualisation de données Python basée sur matplotlib. Il fournit une interface de haut niveau pour dessiner des graphiques statistiques attrayants et informatifs.&lt;br /&gt;
&lt;br /&gt;
'''Différences entre Matplotlib et Seaborn'''&lt;br /&gt;
&lt;br /&gt;
Les défauts de Matplotlib qui ne parlent généralement pas aux utilisateurs sont les couleurs, les marques de tiques sur les axes supérieur et droit, le style,...&lt;br /&gt;
Les exemples ci-dessus rendent également une autre frustration des utilisateurs plus apparente: le fait que travailler avec DataFrames ne va pas aussi bien avec Matplotlib, ce qui peut être ennuyeux si vous faites une analyse exploratoire avec Pandas. Et c’est exactement ce que Seaborn adresse : les fonctions de traçage fonctionnent sur dataframes et tableaux qui contiennent tout un ensemble de données.&lt;br /&gt;
[[Fichier:seaborn1.png|300px|thumb|right|Résultat du code python ci gauche]]&lt;br /&gt;
&lt;br /&gt;
   # Import necessary libraries&lt;br /&gt;
   import seaborn as sns&lt;br /&gt;
   import matplotlib.pyplot as plt&lt;br /&gt;
   &lt;br /&gt;
   # Load iris data&lt;br /&gt;
   iris = sns.load_dataset(&amp;quot;iris&amp;quot;) #DATASET ALREADY EXISTING&lt;br /&gt;
   &lt;br /&gt;
   # Construct iris plot&lt;br /&gt;
   sns.swarmplot(x=&amp;quot;species&amp;quot;, y=&amp;quot;petal_length&amp;quot;, data=iris)&lt;br /&gt;
   &lt;br /&gt;
   # Show plot&lt;br /&gt;
   plt.show()&lt;br /&gt;
&lt;br /&gt;
==Pandas==&lt;br /&gt;
&lt;br /&gt;
Pandas est une API d'analyse de données orientée colonnes. C'est un excellent outil pour manipuler et analyser des données d'entrée. Beaucoup de frameworks d'apprentissage automatique acceptent les structures de données Pandas en entrée.&lt;br /&gt;
&lt;br /&gt;
Comme évoqué précédemment, Pandas travaille avec des matrices colonnes communément appelées ‘Series’ mais aussi et surtout avec des tableaux de données appelés ‘DataFrames’.&lt;br /&gt;
Une Series est tout simplement une colonne et une DataFrame est un tableau à plusieurs dimensions constitué de Series.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Panda.JPG]]&lt;br /&gt;
&lt;br /&gt;
A l'aide de Pandas, on peut ainsi créer, importer, lire et manipuler des bases de données facilement.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Théories des algorithmes étudiés''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Il y a différents types d’algorithmes en machine learning, pour notre sujet qui consiste à classer des machines en défectueuse ou fonctionnelles (1 ou 0), nous aurons surtout besoin d’algorithmes de classification binaire. De manière générale, la conception de la plupart des algorithmes fonctionnent de cette manière : &lt;br /&gt;
&lt;br /&gt;
* Élaborer un modèle &lt;br /&gt;
* Établir une fonction coût pour celui-ci correspondant à l’erreur entre le modèle et les données réelles&lt;br /&gt;
* Trouver un algorithme de minimisation de cette fonction coût&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression linéaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression1.png|200px|thumb|right|Exemple de régression linéaire]]&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est un algorithme de prédiction et non un algorithme de classification, nous aurons surtout besoin de ce deuxième type d’algorithme pour notre projet mais nous tenons à présenter cet algorithme qui est le plus basique en machine learning et un bon début pour une formation pédagogique.&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est une méthode de modélisation qui cherche à établir une relation linéaire entre une ou des &amp;quot;features&amp;quot; (variables explicatives) et une &amp;quot;target&amp;quot; (variable expliquée qu'on cherche à prévoir à partir des variables explicatives). En machine learning, la régression linéaire est un modèle d'apprentissage supervisé, c'est-à-dire qu'on apprend à l'algorithme de prédiction à partir d'exemples dont on dispose dans une dataset. Nous nous intéresserons à la régression affine qui est la plus simple pour débuter.&lt;br /&gt;
&lt;br /&gt;
===Modèle et estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
La régression affine consiste donc à trouver un modèle de type&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt;y=ax+b&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
avec x une &amp;quot;feature&amp;quot;, y la target et avec a et b des paramètres qu'il nous faudra déterminer. Le but est donc de trouver les paramètres a et b tels que la distance entre chaque point du nuage et la droite du modèle soit la plus petite possible.&lt;br /&gt;
Mathématiquement, il suffit de résoudre cette formule:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression2.png|200px|thumb|right|Méthode des moindres carrés illustrée]]&lt;br /&gt;
[[Fichier:regression3.png]]&lt;br /&gt;
&lt;br /&gt;
On utilise donc la méthode des moindres carrés pour mesurer l'erreur entre le modèle de prédiction et les données et ainsi fabriquer notre fonction coût :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression4.png]]&lt;br /&gt;
&lt;br /&gt;
avec m le nombre de points du nuage.&lt;br /&gt;
&lt;br /&gt;
L'objectif de l'algorithme est donc de trouver les paramètres optimaux qui minimisent cette fonction J.&lt;br /&gt;
En machine learning, une des méthodes les plus populaires pour faire ceci est la descente de gradient, car c'est une méthode adaptée quand on fait du traitement de grosses dataset (&amp;quot;faible&amp;quot; temps de calcul). En effet, la fonction coût J est une parabole admettant un unique minimum dépendant des paramètres a et b. La descente de gradient consiste à chercher le point de celle-ci où la dérivée est nulle (donc le minimum)&lt;br /&gt;
&lt;br /&gt;
===Méthode de la descente du gradient===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression6.png|200px|thumb|right|Méthode gradient]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression7.png|200px|thumb|right|Généralisation gradient fct parabolique]]&lt;br /&gt;
&lt;br /&gt;
Soit une fonction parabolique ne dépendant que de x. On cherche à trouver le minimum de cette fonction en utilisant la méthode de la descente du gradient&lt;br /&gt;
Pour cela on choisit un point aléatoirement &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;et on va descendre à partir de celui-ci jusqu'à atteindre un minimum en utilisant&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression5.png]]&lt;br /&gt;
&lt;br /&gt;
avec un paramètre  qui influencera la taille du pas de la descente.&lt;br /&gt;
&lt;br /&gt;
Il faut faire attention à ne pas prendre un pas trop grand, ni trop petit, pour éviter de &amp;quot;tourner&amp;quot; autour du minimum ou de prendre trop de temps pour l'atteindre.&lt;br /&gt;
Note : On peut généraliser cela pour une fonction parabolique à n paramètres qui aurait donc une forme de bol.&lt;br /&gt;
&lt;br /&gt;
===Application sur notre fonction coût===&lt;br /&gt;
&lt;br /&gt;
Notre fonction coût dépend des 2 paramètres a et b :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression8.png]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression9.png]]&lt;br /&gt;
&lt;br /&gt;
On choisit &amp;lt;math&amp;gt;a_0&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; aléatoirement et on applique ceci pour un pas :&lt;br /&gt;
&lt;br /&gt;
Avec &lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression10.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d'un certain nombre d'itérations on trouve le couple &amp;lt;math&amp;gt;(a,b)&amp;lt;/math&amp;gt; qui minimise notre fonction coût.&lt;br /&gt;
&lt;br /&gt;
Note : Nous avons démontré la théorie de la régression linéaire affine mais on pourrait généraliser celle-ci pour un modèle polynomiale d’ordre n, la courbe de prédiction serait donc parabolique et il faudrait trouver le tuple &amp;lt;math&amp;gt;(a_1,a_2,...,a_n)&amp;lt;/math&amp;gt; qui minimise la fonction coût.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression logistique binaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo1.png|200px|thumb|right|Modèle régression logistique]]&lt;br /&gt;
&lt;br /&gt;
La régression logistique binaire est un algorithme de classification, contrairement à la régression linéaire qui est un algorithme de prédiction. De la même façon que la régression linéaire,  il s'agit de modéliser au mieux un modèle mathématique simple à des observations réelles nombreuses. Cette méthode se base sur de l’analyse mathématiques et statistique. Il faut donc associer à des “features” &amp;lt;math&amp;gt;(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; une variable Y valant 1 ou 0 (d’où le terme classification binaire).&lt;br /&gt;
&lt;br /&gt;
L’objectif de l’algorithme est donc de trouver la fonction F dépendant d’une loi de probabilité telle que :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo2.png]]&lt;br /&gt;
&lt;br /&gt;
avec S un certain seuil (fixé la plupart du temps à 0,5).&lt;br /&gt;
&lt;br /&gt;
===Modèle===&lt;br /&gt;
&lt;br /&gt;
Comme cette méthode repose principalement sur des statistiques, il est important d’adopter une notation explicite lors de l’explication théorique :&lt;br /&gt;
&lt;br /&gt;
* On notera Y la variable à prédire (qui vaudra 0 ou 1) et &amp;lt;math&amp;gt;X=(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; les variables permettant de prédire Y&lt;br /&gt;
* On travaillera dans un univers  de N échantillons (taille de la dataset)&lt;br /&gt;
* On notera &amp;lt;math&amp;gt;P(Y=1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;P(Y=0)&amp;lt;/math&amp;gt; les probabilités que Y valent respectivement 1 ou 0 &amp;lt;math&amp;gt;p(1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0)&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;p(X|1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(X|0)&amp;lt;/math&amp;gt; sont les distributions conditionnelles des caractéristiques X sachant la valeur prise par Y&lt;br /&gt;
* &amp;lt;math&amp;gt;p(1|X)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0|X)&amp;lt;/math&amp;gt; sont donc les probabilités d’obtenir la valeur de Y (1 ou 0) sachant les valeurs de X&lt;br /&gt;
&lt;br /&gt;
La régression logistique utilise l’hypothèse fondamentale (mesure de l’évidence) :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo3.png]]&lt;br /&gt;
&lt;br /&gt;
On en déduit donc (comme &amp;lt;math&amp;gt;p(0|X)=1-p(1|X))&amp;lt;/math&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo4.png]]&lt;br /&gt;
&lt;br /&gt;
Avec &amp;lt;math&amp;gt;(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; des variables à déterminer.&lt;br /&gt;
&lt;br /&gt;
''Note :'' ce modèle est appelé modèle LOGIT.&lt;br /&gt;
&lt;br /&gt;
===Estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
Contrairement à la régression linéaire affine, on ne peut pas utiliser la méthode des moindres carrés, on utilise alors la méthode de maximisation de la vraisemblance.&lt;br /&gt;
“La vraisemblance mesure une adéquation entre la distribution observée sur un échantillon aléatoire et une loi de probabilité supposée décrire une réalité sur la population dont l'échantillon est issu.” (source : [www.jybaudot.fr])&lt;br /&gt;
&lt;br /&gt;
Le calcul de la vraisemblance L dans un univers  de N échantillons est le suivant :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo5.png]]&lt;br /&gt;
&lt;br /&gt;
Plus la vraisemblance est élevée, alors plus la loi de probabilité est proche de la réalité. Le but est donc de maximiser cette valeur et de trouver les valeurs optimales de &amp;lt;math&amp;gt;A =(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; qui influent directement sur la loi de probabilité établie dans la partie modèle.&lt;br /&gt;
&lt;br /&gt;
===Algorithme d'optimisation===&lt;br /&gt;
&lt;br /&gt;
Afin de trouver la valeur optimale du vecteur A, nous utiliserons encore une fois la méthode de descente du gradient adaptée à notre cas.&lt;br /&gt;
&lt;br /&gt;
Celle-ci utilise la relation suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo6.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d’un certain nombre d’itérations, on trouvera la valeur optimale de A afin de maximiser la vraisemblance.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Mise en pratique''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Pour la mise en pratique, nous avons décidé d’appliquer les méthodes sur un dataset de prédiction de maintenance pour l’industrie, nous importons grâce à la librairie panda : &amp;lt;code&amp;gt; dataset = pd.read_csv('ai4i2020.csv') &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette dataset contient 14 colonnes de données, nous pouvons visualiser la proportion de données saines et non-saines par ce code seaborn : &amp;lt;code&amp;gt; sns.factorplot('Machine failure',data=dataset,kind='count') &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on traitera cette dataset pour la préparer sur l’intervention des modèles de machine learning, puis on appliquera ces méthodes.&lt;br /&gt;
&lt;br /&gt;
==Pré-traitement de la dataset==&lt;br /&gt;
&lt;br /&gt;
Avant d’appliquer les algorithme sur notre dataset, il faut la traiter, le traitement sera le même pour tous les algorithmes et suivra cet ordre :&lt;br /&gt;
* Traitement des valeurs manquantes&lt;br /&gt;
* Équilibrage des données&lt;br /&gt;
* Séparations des données en entrainement et test&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous devons regarder si notre base de données contient des valeurs manquante, pour cela nous implantons ce code : &lt;br /&gt;
&lt;br /&gt;
   import missingno as msno&lt;br /&gt;
   msno.matrix(dataset)&lt;br /&gt;
&lt;br /&gt;
Les lignes blanches dans le résultat correspond aux valeurs manquantes, ci-dessous nous voyons que nous avons aucune données manquantes dans la base que nous avons importer : [[Fichier:Miseenpratique.png]]&lt;br /&gt;
&lt;br /&gt;
Dans le cas, où nous avons des valeurs manquante, il y a plusieurs méthodes pour traiter les valeurs manquantes mais nous retenons 2 méthodes :&lt;br /&gt;
* Une méthode qui consiste à supprimer les lignes où des valeurs manquantes sont présentes : &amp;lt;code&amp;gt; data.dropna(inplace=True) &amp;lt;/code&amp;gt;&lt;br /&gt;
L’avantage de cette méthode est de créer un modèle robuste. L’inconvénient majeur est le fait qu’on peut perdre énormément de données, pour des données où les valeurs manquantes sont excessives, mieux vaut appliquer une autre méthode.&lt;br /&gt;
&lt;br /&gt;
* Une méthode qui consiste à remplacer les valeurs manquantes par la moyenne des données de la colonne : &amp;lt;code&amp;gt; data[0]=drop[0].replace(np.NaN,data[0].mean()) &amp;lt;/code&amp;gt; L’avantage de cette méthode permet d’éviter la suppression de lignes, ce qui permet de garder les autres données comparé à l’autre méthode. Cependant cette méthode n’est que applicable sur les données numériques&lt;br /&gt;
&lt;br /&gt;
Nous passons alors sur l'équilibrage des données. Avant d’appliquer la méthode SMOTE, nous devons mettre dans 2 variables, la target (y) et les features (X) :&lt;br /&gt;
&lt;br /&gt;
   X = dataset.drop(['Machine failure','UDI','Product ID','Type','TWF','HDF','PWF','OSF','RNF'],axis=1).values&lt;br /&gt;
   y = dataset['Machine failure']&lt;br /&gt;
&lt;br /&gt;
Notre target sera seulement ‘Machine failure’ et nos features seront : la température de l’air, la température du processus, le couple, et l’usure des outils.&lt;br /&gt;
&lt;br /&gt;
Durant notre projet , nous avons implémenté la technique SMOTE pour traiter les ensembles de données déséquilibrées.&lt;br /&gt;
Le principe de SMOTE est de générer de nouveaux échantillons en combinant les données de la classe minoritaire avec celles de leurs voisins proches. Techniquement, on peut décomposer SMOTE en 5 étapes :&lt;br /&gt;
* 1 - Choix d’un vecteur caractéristique de notre classe minoritaire que nous appellerons vc &lt;br /&gt;
* 2 - Sélection des k-voisins les plus proches (k=5 par défaut) et choix de l’un d’eux au hasard que l’on appellera pv &lt;br /&gt;
* 3 - Calcul de la différence pour chaque valeur caractéristique (feature value) i, vc[i]-pv[i] et multiplication de celle-ci par un nombre aléatoire entre [0,1]&lt;br /&gt;
* 4 - Ajout du résultat précédent à la valeur de la caractéristique i du vecteur vc afin d’obtenir un nouveau point (une nouvelle donnée) dans l’espace des caractéristiques &lt;br /&gt;
* 5 - Répétition de ces opérations pour chaque point de données de la classe minoritaire &lt;br /&gt;
Nous remarquons que cette technique marche après smote (50% données saines, 50% données non-saines)&lt;br /&gt;
&lt;br /&gt;
Code : &lt;br /&gt;
&lt;br /&gt;
   oversample = SMOTE()&lt;br /&gt;
   Xsmote, ysmote = oversample.fit_resample(X,y)&lt;br /&gt;
   Xsmote = pd.DataFrame(Xsmote)&lt;br /&gt;
   ysmote = pd.DataFrame(ysmote)&lt;br /&gt;
   X=Xsmote&lt;br /&gt;
   y=ysmote&lt;br /&gt;
&lt;br /&gt;
On remarque que la technique smote a ajouté 9322 lignes sur notre base, Maintenant que nous avons un équilibre entre les données ‘sains’ et ‘malsains’, nous pouvons voir la répartitions des points sur 2 axes :&lt;br /&gt;
&lt;br /&gt;
(image)&lt;br /&gt;
&lt;br /&gt;
Nous pouvons alors procéder à la séparation de nos données en données d'entraînement et de test&lt;br /&gt;
&lt;br /&gt;
Nous devons séparer en deux nos données pour pouvoir appliquer les algorithmes de machine learning, ainsi : &lt;br /&gt;
Les données d'entraînement serviront de repères pour l’algorithme&lt;br /&gt;
Les données de test seront entraînées par celle d’entrainement pour créer une prédiction&lt;br /&gt;
&lt;br /&gt;
Nous allons utiliser la fonction train_test_split de la librairie sklearn pour séparer nos données : &lt;br /&gt;
&lt;br /&gt;
   X_train, X_test, y_train, y_test = train_test_split(X,y, test_size = 0.2, random_state = 100)&lt;br /&gt;
&lt;br /&gt;
Ici dans les paramètres :&lt;br /&gt;
X  correspond aux features&lt;br /&gt;
y correspond à la target&lt;br /&gt;
test_size correspond au pourcentage de séparation (soit 0.2 = 20% test et 80% d'entraînement)&lt;br /&gt;
random_state permet d’initialiser le choix aléatoire pour avoir la même répartition à chaque exécution&lt;br /&gt;
&lt;br /&gt;
Maintenant nous pouvons appliquer les algorithme à notre modèle&lt;br /&gt;
&lt;br /&gt;
==Application des algorithmes==&lt;br /&gt;
&lt;br /&gt;
En général, nous allons appliquer les algorithme en suivant cet ordre : &lt;br /&gt;
* Importation de la méthode sur la librairie sklearn&lt;br /&gt;
* Entraînement des données&lt;br /&gt;
* Prédiction&lt;br /&gt;
* Méthodes d’évaluations&lt;br /&gt;
&lt;br /&gt;
===Régression linéaire===&lt;br /&gt;
&lt;br /&gt;
Nous allons commencer par le plus simple : la régression linéaire, nous commençons par importer l’algorithme à partir de la librairie sklearn : &amp;lt;code&amp;gt; from sklearn.linear_model import LinearRegression &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis nous appelons l’algorithme avec les paramètres de base, puis nous entraînons notre dataset : &lt;br /&gt;
   #Méthode de régréssion linéaire&lt;br /&gt;
   lr = LinearRegression()&lt;br /&gt;
   #Training&lt;br /&gt;
   lr.fit(X_train,y_train)&lt;br /&gt;
&lt;br /&gt;
Ensuite la prédiction : &lt;br /&gt;
   #Prediction&lt;br /&gt;
   y_pred = lr.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
Et enfin l'évaluation, nous avons vu 2 méthodes pour évaluer notre modèle : &lt;br /&gt;
* Afficher le score de prédiction&lt;br /&gt;
* Afficher la matrice de confusion, une matrice de taille 2x2 qui donne ces informations : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatrixConfusion.png]]&lt;br /&gt;
&lt;br /&gt;
Le score de prédiction (accuracy) est également calculé à partir de cette matrice&lt;br /&gt;
Pour la régression linéaire, nous allons qu’afficher le score de prédiction, car cet algorithme nous donne en retour des valeurs non-binaire, la construction d’une matrice de confusion et impossible.&lt;br /&gt;
&lt;br /&gt;
   #Evaluation&lt;br /&gt;
   print(lr.score(X_test,y_test))&lt;br /&gt;
&lt;br /&gt;
Nous obtenons ainsi un score de 0.48, un score qui est plus élevé sans la méthode SMOTE (0.14), sauf que cette méthode n’est pas la plus optimisée pour cette base de données, car nous avons en target des valeurs binaires. Il vaut mieux appliquer la méthode de régression logistique ou la méthode de Naives-Bayes.&lt;br /&gt;
&lt;br /&gt;
===Régression logistique===&lt;br /&gt;
&lt;br /&gt;
Dans le même modèle que la régression linéaire, nous procédons à l’import de la méthode, l’appel de la méthode, l'entraînement des données et de la prédiction :&lt;br /&gt;
&lt;br /&gt;
   from sklearn import linear_model&lt;br /&gt;
&lt;br /&gt;
   #Modèle régression logistique&lt;br /&gt;
   modele_regLog = linear_model.LogisticRegression() &lt;br /&gt;
   #random_state = 100, solver = 'liblinear', multi_class = 'auto'&lt;br /&gt;
&lt;br /&gt;
   #training&lt;br /&gt;
   modele_regLog.fit(X_train,y_train)&lt;br /&gt;
&lt;br /&gt;
   #prediction&lt;br /&gt;
   y_pred = modele_regLog.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
   #précision du modèle&lt;br /&gt;
   precision = modele_regLog.score(X_test,y_test)&lt;br /&gt;
   print(precision)&lt;br /&gt;
&lt;br /&gt;
Pour la régression logistique, nous allons afficher la matrice de confusion et le score :&lt;br /&gt;
&lt;br /&gt;
   from sklearn.metrics import plot_confusion_matrix&lt;br /&gt;
   plot_confusion_matrix(modele_regLog, X_test, y_test)  &lt;br /&gt;
   plt.show() &lt;br /&gt;
&lt;br /&gt;
(images)&lt;br /&gt;
&lt;br /&gt;
Nous obtenons un score de 0.82, contre 0.97 sans la méthode de SMOTE, ce qui est cohérent car le score obtenu sans SMOTE n’est pas précis car il y avait peu de données où la machine a planté. Avec SMOTE, nous obtenons certes un score moins élevé mais plus précis.&lt;br /&gt;
Grâce à la matrice de confusion nous pouvons voir que : &lt;br /&gt;
* Il y a 2396 fois où l’algorithme a prédit Machine failure = 0 et a eu raison&lt;br /&gt;
* Il y a 2377 fois où l’algorithme a prédit Machine failure = 1 et a eu raison&lt;br /&gt;
* Il y a 546 fois où l’algorithme a prédit Machine failure = 1 et a eu faux&lt;br /&gt;
* Il y a 478 fois où l’algorithme a prédit Machine failure = 0 et a eu faux&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 0px; padding: 20px; font-weight: bold; text-align: center; font-size: 80%; background: #61798F; vertical-align: top; width: 100%;&amp;quot;&amp;gt; '''PARTIE II (S8)''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Développement du projet''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Durant les deux premiers semestres de ce projet, nous avons découvert et étudié le Machine Learning, que ce soit la théorie de différents algorithmes connus ou l'application pratique à des datasets que nous pouvons récupérer sur Internet ou bien créer nous même.&lt;br /&gt;
&lt;br /&gt;
La création de notre dataset ayant été fastidieuse et peu concluante (voir résultats du semestre précédent), nous avons comme objectif pour ce semestre d'implémenter nos algorithmes (et principalement le réseau de neurones) à des machines dont nous avons accès à l'école.&lt;br /&gt;
&lt;br /&gt;
Après discussion avec notre tuteur de projet Monsieur Lakhal, nous avons décidé d'utiliser des Robotino plutôt que d'utiliser la chaîne de production présente à l'école car il existe des logiciels simples permettant d'effectuer des simulations de réseaux logistiques de Robotinos (Robotino View et Robotino Simulation) dont nous allons récupérer les données en temps réel, les traiter puis commander les différents Robotino à l'aide d’un algorithme de réseaux de neurones.&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce semestre est ainsi de réaliser le scénario d'un réseau logistique autonome (à l'image d'Amazon par exemple) composé de plusieurs Robotino effectuant chacun une tâche et d'y introduire des erreurs puis de les traiter grâce au Machine Learning afin de ne pas perturber la logistique et d’obtenir un maximum d’efficacité.&lt;br /&gt;
&lt;br /&gt;
Nous avons organisé ce projet en plusieurs étapes où chacun des membres a pu plus ou moins participé en fonction de ses capacités :&lt;br /&gt;
&lt;br /&gt;
* Conception du Grafcet pour la commande des Robotino&lt;br /&gt;
&lt;br /&gt;
* Récupération et traitement des données en temps réel&lt;br /&gt;
&lt;br /&gt;
* Utilisation du Machine Learning afin de commander les Robotino&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous avons constitué 2 équipes : une équipe spécialisée dans la commande du Robotino constituée de Loïc et Aymen et l’autre dans le traitement des données avec le Machine Learning avec Antoine, Tom et Florian.&lt;br /&gt;
Nous avons ensuite organisé notre projet à l’aide du diagramme de Gantt ci-dessous.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:GanttMLP5.png]]&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Grafcet pour la commande des Robotino''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Communication avec les Robotinos''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
=Recherche bibliographique=&lt;br /&gt;
&lt;br /&gt;
* https://www.wikipedia.com&lt;br /&gt;
&lt;br /&gt;
* https://www.jybaudot.fr&lt;br /&gt;
&lt;br /&gt;
* https://datascientest.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.ipgirl.com&lt;br /&gt;
&lt;br /&gt;
* Cours de probabilités et statistiques de l’Université Jules Vernes&lt;br /&gt;
&lt;br /&gt;
* Chaine youtube Machine Learning : https://www.youtube.com/channel/UCmpptkXu8iIFe6kfDK5o7VQ&lt;br /&gt;
&lt;br /&gt;
* Machine Learning with scikit-learn Quick Start Guide écrit par Kevin Jolly&lt;br /&gt;
&lt;br /&gt;
* https://lucidar.me/&lt;br /&gt;
&lt;br /&gt;
* https://archive.ics.uci.edu/ml/datasets.php&lt;br /&gt;
&lt;br /&gt;
* https://www.kaggle.com/datasets&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com/&lt;br /&gt;
&lt;br /&gt;
* Machine Learning algorithms - Second Edition écrit par Giuseppe Bonaccorso&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com&lt;br /&gt;
&lt;br /&gt;
* https://towardsdatascience.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.learndatasci.com/&lt;br /&gt;
&lt;br /&gt;
==Rapports et présentation==&lt;br /&gt;
&lt;br /&gt;
===Librairies===&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1CQZ1s6fNY_6MsmbBa5TP1OzSedqFeaWI?usp=sharing/ Rapport Numpy]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1tdu_B2wRsUiqdnSeskQENdn_wX3pJMeT?usp=sharing/ Rapport Pandas]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1DPS4ZT91SIEhscwST8kfER7u21tKoM3a?usp=sharing/ Rapport Seaborn]&lt;br /&gt;
&lt;br /&gt;
===Rapports===&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/document/d/1yR0vLePV3hI1_HVtTZWwGIwy0Cb-oLOsOTK3Um5KAYE/edit?usp=sharing/ Rapport]&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/presentation/d/1Je_yF0dgc-s9gB7LLsfOg0b05xcwIFJbaqpVytxWv5A/edit?usp=sharing/ Présentation]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1y_NMo9XKJ0WzwE2zmcRblUyuIebwfoN8?usp=sharing/ Régression linéaire]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1bRyrnL1JM870cEcEvfGaS8ItrG16rchy?usp=sharing/ Google Colab]&lt;/div&gt;</summary>
		<author><name>Abrossas</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88069</id>
		<title>IMA3/IMA4 2020/2022 P5</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88069"/>
				<updated>2022-05-04T13:39:03Z</updated>
		
		<summary type="html">&lt;p&gt;Abrossas : /*  Élaboration du scénario  */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 0px; padding: 20px; font-weight: bold; text-align: center; font-size: 80%; background: #61798F; vertical-align: top; width: 100%;&amp;quot;&amp;gt; '''PARTIE I (S6-S7)''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Introduction et cahier des charges''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce projet est la mise en place d’algorithmes de machine Learning afin de diagnostiquer l’état de machines industrielles. Nous travaillerons sur ce projet durant 2 semestres. &lt;br /&gt;
Durant le premier semestre, nous avions comme objectifs d’acquérir la maîtrise des différentes librairies primordiales pour traiter les données en machine Learning, ainsi que d’étudier et d’utiliser certains algorithmes basiques (régression linéaire, logistique, Bayes) sur des datasets que nous traiterons nous même. &lt;br /&gt;
Pour ce qui est du second semestre, notre objectif était de concrétiser les connaissances acquises durant le premier semestre. Nous avons donc essayé de créer notre propre dataset à l’aide des matériels mis à notre disposition, de la prétraiter et d’y appliquer différents algorithmes de Machine Learning en critiquant les résultats.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning pour la détection de défaut s'inscrit parfaitement dans le contexte scientifique actuel, notamment grâce à l’industrie 4.0.&lt;br /&gt;
En effet, cette nouvelle industrie fait apparaître des systèmes communicants (l’IOT : Internet Of Things) interconnectés les uns entre les autres. Ces différents systèmes peuvent êtres nécessaires les uns, les autres afin de réaliser une tâche complexe telle que l'usinage de pièces. Le système devient dès lors potentiellement extrêmement fragile aux pannes.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning a pour but de pouvoir détecter, et localiser les pannes, voir les futures pannes potentielles afin de pouvoir dans un premier temps prévenir un opérateur. Mais il peut aussi potentiellement permettre au système de continuer de tourner, en attendant un technicien. Le machine Learning peut donc aussi permettre à une chaîne de production de continuer de tourner par l’envoie d’un autre robot par exemple, le temps que la panne soit réparée.&lt;br /&gt;
&lt;br /&gt;
Dans le schéma ci-dessous nous avons un exemple de système de système.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Intro1.png|500px|thumb|center|Schéma d'un système de systèmes]]&lt;br /&gt;
&lt;br /&gt;
Il y a deux cas de figure:&lt;br /&gt;
* Un autre système peut être envoyé pour remplacer le système 4.&lt;br /&gt;
* Les systèmes 1 et 2 peuvent permettre à la chaîne de production de continuer de tourner&lt;br /&gt;
* La chaîne de production est hors service jusqu'à réparation.&lt;br /&gt;
&lt;br /&gt;
==Cahier de charges==&lt;br /&gt;
&lt;br /&gt;
'''Ressources disponibles :'''&lt;br /&gt;
&lt;br /&gt;
* Livres sur le machine learning &lt;br /&gt;
* Bases de données (afin d'appliquer divers algorithmes de machine learning) que nous prendrons sur ces sites : [https://www.kaggle.com/datasets] et [https://archive.ics.uci.edu/ml/datasets.php]&lt;br /&gt;
* Librairies Python (Scikit-learn, Pandas, Numpy, Seaborn, Matplotlib)&lt;br /&gt;
* Google Colab&lt;br /&gt;
* Matlab (version étudiante)&lt;br /&gt;
&lt;br /&gt;
'''Objectifs poursuivis :'''&lt;br /&gt;
&lt;br /&gt;
* Détecter les dysfonctionnements de systèmes mécatroniques (par exemple les robots Khepera, Robotino…), grâce au machine learning.&lt;br /&gt;
* Apprendre à implémenter différentes méthodes machine learning .&lt;br /&gt;
&lt;br /&gt;
'''Profil du public cible :'''&lt;br /&gt;
* Secteur mécatronique&lt;br /&gt;
* Entreprises disposant d'ingénieurs pour maintenir le système informatique opérationnel&lt;br /&gt;
* Entreprises utilisant des machines dans le secteur public.&lt;br /&gt;
&lt;br /&gt;
'''Analyse des besoins :'''&lt;br /&gt;
* L’industrie a de plus en plus besoin du machine learning pour détecter les erreurs des systèmes. En effet, cette technologie devient indispensable pour les industriels, notamment afin d'accroître la productivité et l’efficacité des systèmes industriels.&lt;br /&gt;
* Le programme peut ne pas être aussi rapide et optimisé en espace mémoire que d'autres programmes, nous visons l’efficacité de notre algorithme plutôt que la rapidité.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Librairies''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
En Machine Learning, il est très important, voire primordial, de savoir manipuler les différentes librairies mises à notre disposition afin de visualiser, traiter nos différentes dataset ou même appliquer les différents algorithmes de machine Learning.&lt;br /&gt;
Durant les premières semaines de notre projet, nous avons donc appris à utiliser ces différentes librairies nécessaires pour le machine Learning, telles que Numpy, Seaborn, Panda, Matplotlib, Scikit-learn... Nous allons dans un premier temps nous intéresser à l'importation des différentes bibliothèques puis résumer les commandes importantes de ces différentes librairies.&lt;br /&gt;
&lt;br /&gt;
Ces différentes librairies ne sont pas incluses de base dans Python, il est donc nécessaire de les ajouter à Python puis à notre programme.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc choisi d'utiliser google colab car ces librairies y sont déjà installées (et aussi pratique pour travailler à plusieurs sur un même code).&lt;br /&gt;
Puis nous devons importer ces bibliothèques au début de notre programme.&lt;br /&gt;
&lt;br /&gt;
Attention : Plusieurs bibliothèques peuvent avoir la même commande mais avec des significations différentes, comme par exemple la commande randint du module numpy et celle du module random et cela peut conduire à des erreurs. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de pallier à ces problèmes nous apporterons nos librairie au début de nos programmes comme suit :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:librairies1.png]]&lt;br /&gt;
&lt;br /&gt;
Ici le np permet de dire que lorsque nous utilisons np.array alors nous utilisons la commande array () contenu dans la bibliothèque Numpy.&lt;br /&gt;
&lt;br /&gt;
Ceci nous permettra d’utiliser en simultané différentes librairies, toutes les bibliothèques seront importées selon ce schéma.&lt;br /&gt;
Nous allons par la suite, nous intéresser à différentes commandes incluses dans ces librairies.&lt;br /&gt;
&lt;br /&gt;
==Numpy==&lt;br /&gt;
&lt;br /&gt;
Numpy est une bibliothèque dédiée aux calculs mathématiques et à la gestion des listes (telles que des matrices).&lt;br /&gt;
Matplotlib, quant à lui, est dédié aux affichages graphiques de données.&lt;br /&gt;
Nous allons dans cette partie nous intéresser aux commandes principales de ces deux bibliothèques de python.&lt;br /&gt;
&lt;br /&gt;
Sous numpy, les tableaux sont des types array, ils définissent l'équivalent des tableaux statiques en langage C. La taille d’un tableau numpy ne peut donc pas être changée après leur création. &lt;br /&gt;
&lt;br /&gt;
Néanmoins grâce a Numpy nous pouvons simplement effectuer des tâches sur les tableaux comme en extraire un sous tableaux, et d’effectuer simplement les produits entre matrice, vecteur.&lt;br /&gt;
&lt;br /&gt;
Dans notre projet, nous utiliserons plus courament les fonctions : &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.shape&amp;lt;/FONT&amp;gt; permet d’obtenir la taille de la matrice sous forme d’un tuple, suffit de choisir le bon numéro&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.zeros&amp;lt;/FONT&amp;gt; permet de créer une ligne de x zéro(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.ones&amp;lt;/FONT&amp;gt; permet de créer une ligne de x un(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.vstack&amp;lt;/FONT&amp;gt; permet de rajouter des lignes dans une matrice déjà créer en paramètre&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.transpose&amp;lt;/FONT&amp;gt; permet de transposer une matrice en paramètre&lt;br /&gt;
&lt;br /&gt;
==Seaborn==&lt;br /&gt;
&lt;br /&gt;
Seaborn est une bibliothèque de visualisation de données Python basée sur matplotlib. Il fournit une interface de haut niveau pour dessiner des graphiques statistiques attrayants et informatifs.&lt;br /&gt;
&lt;br /&gt;
'''Différences entre Matplotlib et Seaborn'''&lt;br /&gt;
&lt;br /&gt;
Les défauts de Matplotlib qui ne parlent généralement pas aux utilisateurs sont les couleurs, les marques de tiques sur les axes supérieur et droit, le style,...&lt;br /&gt;
Les exemples ci-dessus rendent également une autre frustration des utilisateurs plus apparente: le fait que travailler avec DataFrames ne va pas aussi bien avec Matplotlib, ce qui peut être ennuyeux si vous faites une analyse exploratoire avec Pandas. Et c’est exactement ce que Seaborn adresse : les fonctions de traçage fonctionnent sur dataframes et tableaux qui contiennent tout un ensemble de données.&lt;br /&gt;
[[Fichier:seaborn1.png|300px|thumb|right|Résultat du code python ci gauche]]&lt;br /&gt;
&lt;br /&gt;
   # Import necessary libraries&lt;br /&gt;
   import seaborn as sns&lt;br /&gt;
   import matplotlib.pyplot as plt&lt;br /&gt;
   &lt;br /&gt;
   # Load iris data&lt;br /&gt;
   iris = sns.load_dataset(&amp;quot;iris&amp;quot;) #DATASET ALREADY EXISTING&lt;br /&gt;
   &lt;br /&gt;
   # Construct iris plot&lt;br /&gt;
   sns.swarmplot(x=&amp;quot;species&amp;quot;, y=&amp;quot;petal_length&amp;quot;, data=iris)&lt;br /&gt;
   &lt;br /&gt;
   # Show plot&lt;br /&gt;
   plt.show()&lt;br /&gt;
&lt;br /&gt;
==Pandas==&lt;br /&gt;
&lt;br /&gt;
Pandas est une API d'analyse de données orientée colonnes. C'est un excellent outil pour manipuler et analyser des données d'entrée. Beaucoup de frameworks d'apprentissage automatique acceptent les structures de données Pandas en entrée.&lt;br /&gt;
&lt;br /&gt;
Comme évoqué précédemment, Pandas travaille avec des matrices colonnes communément appelées ‘Series’ mais aussi et surtout avec des tableaux de données appelés ‘DataFrames’.&lt;br /&gt;
Une Series est tout simplement une colonne et une DataFrame est un tableau à plusieurs dimensions constitué de Series.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Panda.JPG]]&lt;br /&gt;
&lt;br /&gt;
A l'aide de Pandas, on peut ainsi créer, importer, lire et manipuler des bases de données facilement.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Théories des algorithmes étudiés''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Il y a différents types d’algorithmes en machine learning, pour notre sujet qui consiste à classer des machines en défectueuse ou fonctionnelles (1 ou 0), nous aurons surtout besoin d’algorithmes de classification binaire. De manière générale, la conception de la plupart des algorithmes fonctionnent de cette manière : &lt;br /&gt;
&lt;br /&gt;
* Élaborer un modèle &lt;br /&gt;
* Établir une fonction coût pour celui-ci correspondant à l’erreur entre le modèle et les données réelles&lt;br /&gt;
* Trouver un algorithme de minimisation de cette fonction coût&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression linéaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression1.png|200px|thumb|right|Exemple de régression linéaire]]&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est un algorithme de prédiction et non un algorithme de classification, nous aurons surtout besoin de ce deuxième type d’algorithme pour notre projet mais nous tenons à présenter cet algorithme qui est le plus basique en machine learning et un bon début pour une formation pédagogique.&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est une méthode de modélisation qui cherche à établir une relation linéaire entre une ou des &amp;quot;features&amp;quot; (variables explicatives) et une &amp;quot;target&amp;quot; (variable expliquée qu'on cherche à prévoir à partir des variables explicatives). En machine learning, la régression linéaire est un modèle d'apprentissage supervisé, c'est-à-dire qu'on apprend à l'algorithme de prédiction à partir d'exemples dont on dispose dans une dataset. Nous nous intéresserons à la régression affine qui est la plus simple pour débuter.&lt;br /&gt;
&lt;br /&gt;
===Modèle et estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
La régression affine consiste donc à trouver un modèle de type&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt;y=ax+b&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
avec x une &amp;quot;feature&amp;quot;, y la target et avec a et b des paramètres qu'il nous faudra déterminer. Le but est donc de trouver les paramètres a et b tels que la distance entre chaque point du nuage et la droite du modèle soit la plus petite possible.&lt;br /&gt;
Mathématiquement, il suffit de résoudre cette formule:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression2.png|200px|thumb|right|Méthode des moindres carrés illustrée]]&lt;br /&gt;
[[Fichier:regression3.png]]&lt;br /&gt;
&lt;br /&gt;
On utilise donc la méthode des moindres carrés pour mesurer l'erreur entre le modèle de prédiction et les données et ainsi fabriquer notre fonction coût :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression4.png]]&lt;br /&gt;
&lt;br /&gt;
avec m le nombre de points du nuage.&lt;br /&gt;
&lt;br /&gt;
L'objectif de l'algorithme est donc de trouver les paramètres optimaux qui minimisent cette fonction J.&lt;br /&gt;
En machine learning, une des méthodes les plus populaires pour faire ceci est la descente de gradient, car c'est une méthode adaptée quand on fait du traitement de grosses dataset (&amp;quot;faible&amp;quot; temps de calcul). En effet, la fonction coût J est une parabole admettant un unique minimum dépendant des paramètres a et b. La descente de gradient consiste à chercher le point de celle-ci où la dérivée est nulle (donc le minimum)&lt;br /&gt;
&lt;br /&gt;
===Méthode de la descente du gradient===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression6.png|200px|thumb|right|Méthode gradient]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression7.png|200px|thumb|right|Généralisation gradient fct parabolique]]&lt;br /&gt;
&lt;br /&gt;
Soit une fonction parabolique ne dépendant que de x. On cherche à trouver le minimum de cette fonction en utilisant la méthode de la descente du gradient&lt;br /&gt;
Pour cela on choisit un point aléatoirement &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;et on va descendre à partir de celui-ci jusqu'à atteindre un minimum en utilisant&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression5.png]]&lt;br /&gt;
&lt;br /&gt;
avec un paramètre  qui influencera la taille du pas de la descente.&lt;br /&gt;
&lt;br /&gt;
Il faut faire attention à ne pas prendre un pas trop grand, ni trop petit, pour éviter de &amp;quot;tourner&amp;quot; autour du minimum ou de prendre trop de temps pour l'atteindre.&lt;br /&gt;
Note : On peut généraliser cela pour une fonction parabolique à n paramètres qui aurait donc une forme de bol.&lt;br /&gt;
&lt;br /&gt;
===Application sur notre fonction coût===&lt;br /&gt;
&lt;br /&gt;
Notre fonction coût dépend des 2 paramètres a et b :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression8.png]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression9.png]]&lt;br /&gt;
&lt;br /&gt;
On choisit &amp;lt;math&amp;gt;a_0&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; aléatoirement et on applique ceci pour un pas :&lt;br /&gt;
&lt;br /&gt;
Avec &lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression10.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d'un certain nombre d'itérations on trouve le couple &amp;lt;math&amp;gt;(a,b)&amp;lt;/math&amp;gt; qui minimise notre fonction coût.&lt;br /&gt;
&lt;br /&gt;
Note : Nous avons démontré la théorie de la régression linéaire affine mais on pourrait généraliser celle-ci pour un modèle polynomiale d’ordre n, la courbe de prédiction serait donc parabolique et il faudrait trouver le tuple &amp;lt;math&amp;gt;(a_1,a_2,...,a_n)&amp;lt;/math&amp;gt; qui minimise la fonction coût.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression logistique binaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo1.png|200px|thumb|right|Modèle régression logistique]]&lt;br /&gt;
&lt;br /&gt;
La régression logistique binaire est un algorithme de classification, contrairement à la régression linéaire qui est un algorithme de prédiction. De la même façon que la régression linéaire,  il s'agit de modéliser au mieux un modèle mathématique simple à des observations réelles nombreuses. Cette méthode se base sur de l’analyse mathématiques et statistique. Il faut donc associer à des “features” &amp;lt;math&amp;gt;(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; une variable Y valant 1 ou 0 (d’où le terme classification binaire).&lt;br /&gt;
&lt;br /&gt;
L’objectif de l’algorithme est donc de trouver la fonction F dépendant d’une loi de probabilité telle que :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo2.png]]&lt;br /&gt;
&lt;br /&gt;
avec S un certain seuil (fixé la plupart du temps à 0,5).&lt;br /&gt;
&lt;br /&gt;
===Modèle===&lt;br /&gt;
&lt;br /&gt;
Comme cette méthode repose principalement sur des statistiques, il est important d’adopter une notation explicite lors de l’explication théorique :&lt;br /&gt;
&lt;br /&gt;
* On notera Y la variable à prédire (qui vaudra 0 ou 1) et &amp;lt;math&amp;gt;X=(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; les variables permettant de prédire Y&lt;br /&gt;
* On travaillera dans un univers  de N échantillons (taille de la dataset)&lt;br /&gt;
* On notera &amp;lt;math&amp;gt;P(Y=1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;P(Y=0)&amp;lt;/math&amp;gt; les probabilités que Y valent respectivement 1 ou 0 &amp;lt;math&amp;gt;p(1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0)&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;p(X|1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(X|0)&amp;lt;/math&amp;gt; sont les distributions conditionnelles des caractéristiques X sachant la valeur prise par Y&lt;br /&gt;
* &amp;lt;math&amp;gt;p(1|X)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0|X)&amp;lt;/math&amp;gt; sont donc les probabilités d’obtenir la valeur de Y (1 ou 0) sachant les valeurs de X&lt;br /&gt;
&lt;br /&gt;
La régression logistique utilise l’hypothèse fondamentale (mesure de l’évidence) :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo3.png]]&lt;br /&gt;
&lt;br /&gt;
On en déduit donc (comme &amp;lt;math&amp;gt;p(0|X)=1-p(1|X))&amp;lt;/math&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo4.png]]&lt;br /&gt;
&lt;br /&gt;
Avec &amp;lt;math&amp;gt;(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; des variables à déterminer.&lt;br /&gt;
&lt;br /&gt;
''Note :'' ce modèle est appelé modèle LOGIT.&lt;br /&gt;
&lt;br /&gt;
===Estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
Contrairement à la régression linéaire affine, on ne peut pas utiliser la méthode des moindres carrés, on utilise alors la méthode de maximisation de la vraisemblance.&lt;br /&gt;
“La vraisemblance mesure une adéquation entre la distribution observée sur un échantillon aléatoire et une loi de probabilité supposée décrire une réalité sur la population dont l'échantillon est issu.” (source : [www.jybaudot.fr])&lt;br /&gt;
&lt;br /&gt;
Le calcul de la vraisemblance L dans un univers  de N échantillons est le suivant :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo5.png]]&lt;br /&gt;
&lt;br /&gt;
Plus la vraisemblance est élevée, alors plus la loi de probabilité est proche de la réalité. Le but est donc de maximiser cette valeur et de trouver les valeurs optimales de &amp;lt;math&amp;gt;A =(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; qui influent directement sur la loi de probabilité établie dans la partie modèle.&lt;br /&gt;
&lt;br /&gt;
===Algorithme d'optimisation===&lt;br /&gt;
&lt;br /&gt;
Afin de trouver la valeur optimale du vecteur A, nous utiliserons encore une fois la méthode de descente du gradient adaptée à notre cas.&lt;br /&gt;
&lt;br /&gt;
Celle-ci utilise la relation suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo6.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d’un certain nombre d’itérations, on trouvera la valeur optimale de A afin de maximiser la vraisemblance.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Mise en pratique''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Pour la mise en pratique, nous avons décidé d’appliquer les méthodes sur un dataset de prédiction de maintenance pour l’industrie, nous importons grâce à la librairie panda : &amp;lt;code&amp;gt; dataset = pd.read_csv('ai4i2020.csv') &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette dataset contient 14 colonnes de données, nous pouvons visualiser la proportion de données saines et non-saines par ce code seaborn : &amp;lt;code&amp;gt; sns.factorplot('Machine failure',data=dataset,kind='count') &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on traitera cette dataset pour la préparer sur l’intervention des modèles de machine learning, puis on appliquera ces méthodes.&lt;br /&gt;
&lt;br /&gt;
==Pré-traitement de la dataset==&lt;br /&gt;
&lt;br /&gt;
Avant d’appliquer les algorithme sur notre dataset, il faut la traiter, le traitement sera le même pour tous les algorithmes et suivra cet ordre :&lt;br /&gt;
* Traitement des valeurs manquantes&lt;br /&gt;
* Équilibrage des données&lt;br /&gt;
* Séparations des données en entrainement et test&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous devons regarder si notre base de données contient des valeurs manquante, pour cela nous implantons ce code : &lt;br /&gt;
&lt;br /&gt;
   import missingno as msno&lt;br /&gt;
   msno.matrix(dataset)&lt;br /&gt;
&lt;br /&gt;
Les lignes blanches dans le résultat correspond aux valeurs manquantes, ci-dessous nous voyons que nous avons aucune données manquantes dans la base que nous avons importer : [[Fichier:Miseenpratique.png]]&lt;br /&gt;
&lt;br /&gt;
Dans le cas, où nous avons des valeurs manquante, il y a plusieurs méthodes pour traiter les valeurs manquantes mais nous retenons 2 méthodes :&lt;br /&gt;
* Une méthode qui consiste à supprimer les lignes où des valeurs manquantes sont présentes : &amp;lt;code&amp;gt; data.dropna(inplace=True) &amp;lt;/code&amp;gt;&lt;br /&gt;
L’avantage de cette méthode est de créer un modèle robuste. L’inconvénient majeur est le fait qu’on peut perdre énormément de données, pour des données où les valeurs manquantes sont excessives, mieux vaut appliquer une autre méthode.&lt;br /&gt;
&lt;br /&gt;
* Une méthode qui consiste à remplacer les valeurs manquantes par la moyenne des données de la colonne : &amp;lt;code&amp;gt; data[0]=drop[0].replace(np.NaN,data[0].mean()) &amp;lt;/code&amp;gt; L’avantage de cette méthode permet d’éviter la suppression de lignes, ce qui permet de garder les autres données comparé à l’autre méthode. Cependant cette méthode n’est que applicable sur les données numériques&lt;br /&gt;
&lt;br /&gt;
Nous passons alors sur l'équilibrage des données. Avant d’appliquer la méthode SMOTE, nous devons mettre dans 2 variables, la target (y) et les features (X) :&lt;br /&gt;
&lt;br /&gt;
   X = dataset.drop(['Machine failure','UDI','Product ID','Type','TWF','HDF','PWF','OSF','RNF'],axis=1).values&lt;br /&gt;
   y = dataset['Machine failure']&lt;br /&gt;
&lt;br /&gt;
Notre target sera seulement ‘Machine failure’ et nos features seront : la température de l’air, la température du processus, le couple, et l’usure des outils.&lt;br /&gt;
&lt;br /&gt;
Durant notre projet , nous avons implémenté la technique SMOTE pour traiter les ensembles de données déséquilibrées.&lt;br /&gt;
Le principe de SMOTE est de générer de nouveaux échantillons en combinant les données de la classe minoritaire avec celles de leurs voisins proches. Techniquement, on peut décomposer SMOTE en 5 étapes :&lt;br /&gt;
* 1 - Choix d’un vecteur caractéristique de notre classe minoritaire que nous appellerons vc &lt;br /&gt;
* 2 - Sélection des k-voisins les plus proches (k=5 par défaut) et choix de l’un d’eux au hasard que l’on appellera pv &lt;br /&gt;
* 3 - Calcul de la différence pour chaque valeur caractéristique (feature value) i, vc[i]-pv[i] et multiplication de celle-ci par un nombre aléatoire entre [0,1]&lt;br /&gt;
* 4 - Ajout du résultat précédent à la valeur de la caractéristique i du vecteur vc afin d’obtenir un nouveau point (une nouvelle donnée) dans l’espace des caractéristiques &lt;br /&gt;
* 5 - Répétition de ces opérations pour chaque point de données de la classe minoritaire &lt;br /&gt;
Nous remarquons que cette technique marche après smote (50% données saines, 50% données non-saines)&lt;br /&gt;
&lt;br /&gt;
Code : &lt;br /&gt;
&lt;br /&gt;
   oversample = SMOTE()&lt;br /&gt;
   Xsmote, ysmote = oversample.fit_resample(X,y)&lt;br /&gt;
   Xsmote = pd.DataFrame(Xsmote)&lt;br /&gt;
   ysmote = pd.DataFrame(ysmote)&lt;br /&gt;
   X=Xsmote&lt;br /&gt;
   y=ysmote&lt;br /&gt;
&lt;br /&gt;
On remarque que la technique smote a ajouté 9322 lignes sur notre base, Maintenant que nous avons un équilibre entre les données ‘sains’ et ‘malsains’, nous pouvons voir la répartitions des points sur 2 axes :&lt;br /&gt;
&lt;br /&gt;
(image)&lt;br /&gt;
&lt;br /&gt;
Nous pouvons alors procéder à la séparation de nos données en données d'entraînement et de test&lt;br /&gt;
&lt;br /&gt;
Nous devons séparer en deux nos données pour pouvoir appliquer les algorithmes de machine learning, ainsi : &lt;br /&gt;
Les données d'entraînement serviront de repères pour l’algorithme&lt;br /&gt;
Les données de test seront entraînées par celle d’entrainement pour créer une prédiction&lt;br /&gt;
&lt;br /&gt;
Nous allons utiliser la fonction train_test_split de la librairie sklearn pour séparer nos données : &lt;br /&gt;
&lt;br /&gt;
   X_train, X_test, y_train, y_test = train_test_split(X,y, test_size = 0.2, random_state = 100)&lt;br /&gt;
&lt;br /&gt;
Ici dans les paramètres :&lt;br /&gt;
X  correspond aux features&lt;br /&gt;
y correspond à la target&lt;br /&gt;
test_size correspond au pourcentage de séparation (soit 0.2 = 20% test et 80% d'entraînement)&lt;br /&gt;
random_state permet d’initialiser le choix aléatoire pour avoir la même répartition à chaque exécution&lt;br /&gt;
&lt;br /&gt;
Maintenant nous pouvons appliquer les algorithme à notre modèle&lt;br /&gt;
&lt;br /&gt;
==Application des algorithmes==&lt;br /&gt;
&lt;br /&gt;
En général, nous allons appliquer les algorithme en suivant cet ordre : &lt;br /&gt;
* Importation de la méthode sur la librairie sklearn&lt;br /&gt;
* Entraînement des données&lt;br /&gt;
* Prédiction&lt;br /&gt;
* Méthodes d’évaluations&lt;br /&gt;
&lt;br /&gt;
===Régression linéaire===&lt;br /&gt;
&lt;br /&gt;
Nous allons commencer par le plus simple : la régression linéaire, nous commençons par importer l’algorithme à partir de la librairie sklearn : &amp;lt;code&amp;gt; from sklearn.linear_model import LinearRegression &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis nous appelons l’algorithme avec les paramètres de base, puis nous entraînons notre dataset : &lt;br /&gt;
   #Méthode de régréssion linéaire&lt;br /&gt;
   lr = LinearRegression()&lt;br /&gt;
   #Training&lt;br /&gt;
   lr.fit(X_train,y_train)&lt;br /&gt;
&lt;br /&gt;
Ensuite la prédiction : &lt;br /&gt;
   #Prediction&lt;br /&gt;
   y_pred = lr.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
Et enfin l'évaluation, nous avons vu 2 méthodes pour évaluer notre modèle : &lt;br /&gt;
* Afficher le score de prédiction&lt;br /&gt;
* Afficher la matrice de confusion, une matrice de taille 2x2 qui donne ces informations : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatrixConfusion.png]]&lt;br /&gt;
&lt;br /&gt;
Le score de prédiction (accuracy) est également calculé à partir de cette matrice&lt;br /&gt;
Pour la régression linéaire, nous allons qu’afficher le score de prédiction, car cet algorithme nous donne en retour des valeurs non-binaire, la construction d’une matrice de confusion et impossible.&lt;br /&gt;
&lt;br /&gt;
   #Evaluation&lt;br /&gt;
   print(lr.score(X_test,y_test))&lt;br /&gt;
&lt;br /&gt;
Nous obtenons ainsi un score de 0.48, un score qui est plus élevé sans la méthode SMOTE (0.14), sauf que cette méthode n’est pas la plus optimisée pour cette base de données, car nous avons en target des valeurs binaires. Il vaut mieux appliquer la méthode de régression logistique ou la méthode de Naives-Bayes.&lt;br /&gt;
&lt;br /&gt;
===Régression logistique===&lt;br /&gt;
&lt;br /&gt;
Dans le même modèle que la régression linéaire, nous procédons à l’import de la méthode, l’appel de la méthode, l'entraînement des données et de la prédiction :&lt;br /&gt;
&lt;br /&gt;
   from sklearn import linear_model&lt;br /&gt;
&lt;br /&gt;
   #Modèle régression logistique&lt;br /&gt;
   modele_regLog = linear_model.LogisticRegression() &lt;br /&gt;
   #random_state = 100, solver = 'liblinear', multi_class = 'auto'&lt;br /&gt;
&lt;br /&gt;
   #training&lt;br /&gt;
   modele_regLog.fit(X_train,y_train)&lt;br /&gt;
&lt;br /&gt;
   #prediction&lt;br /&gt;
   y_pred = modele_regLog.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
   #précision du modèle&lt;br /&gt;
   precision = modele_regLog.score(X_test,y_test)&lt;br /&gt;
   print(precision)&lt;br /&gt;
&lt;br /&gt;
Pour la régression logistique, nous allons afficher la matrice de confusion et le score :&lt;br /&gt;
&lt;br /&gt;
   from sklearn.metrics import plot_confusion_matrix&lt;br /&gt;
   plot_confusion_matrix(modele_regLog, X_test, y_test)  &lt;br /&gt;
   plt.show() &lt;br /&gt;
&lt;br /&gt;
(images)&lt;br /&gt;
&lt;br /&gt;
Nous obtenons un score de 0.82, contre 0.97 sans la méthode de SMOTE, ce qui est cohérent car le score obtenu sans SMOTE n’est pas précis car il y avait peu de données où la machine a planté. Avec SMOTE, nous obtenons certes un score moins élevé mais plus précis.&lt;br /&gt;
Grâce à la matrice de confusion nous pouvons voir que : &lt;br /&gt;
* Il y a 2396 fois où l’algorithme a prédit Machine failure = 0 et a eu raison&lt;br /&gt;
* Il y a 2377 fois où l’algorithme a prédit Machine failure = 1 et a eu raison&lt;br /&gt;
* Il y a 546 fois où l’algorithme a prédit Machine failure = 1 et a eu faux&lt;br /&gt;
* Il y a 478 fois où l’algorithme a prédit Machine failure = 0 et a eu faux&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 0px; padding: 20px; font-weight: bold; text-align: center; font-size: 80%; background: #61798F; vertical-align: top; width: 100%;&amp;quot;&amp;gt; '''PARTIE II (S8)''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Développement du projet''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Durant les deux premiers semestres de ce projet, nous avons découvert et étudié le Machine Learning, que ce soit la théorie de différents algorithmes connus ou l'application pratique à des datasets que nous pouvons récupérer sur Internet ou bien créer nous même.&lt;br /&gt;
&lt;br /&gt;
La création de notre dataset ayant été fastidieuse et peu concluante (voir résultats du semestre précédent), nous avons comme objectif pour ce semestre d'implémenter nos algorithmes (et principalement le réseau de neurones) à des machines dont nous avons accès à l'école.&lt;br /&gt;
&lt;br /&gt;
Après discussion avec notre tuteur de projet Monsieur Lakhal, nous avons décidé d'utiliser des Robotino plutôt que d'utiliser la chaîne de production présente à l'école car il existe des logiciels simples permettant d'effectuer des simulations de réseaux logistiques de Robotinos (Robotino View et Robotino Simulation) dont nous allons récupérer les données en temps réel, les traiter puis commander les différents Robotino à l'aide d’un algorithme de réseaux de neurones.&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce semestre est ainsi de réaliser le scénario d'un réseau logistique autonome (à l'image d'Amazon par exemple) composé de plusieurs Robotino effectuant chacun une tâche et d'y introduire des erreurs puis de les traiter grâce au Machine Learning afin de ne pas perturber la logistique et d’obtenir un maximum d’efficacité.&lt;br /&gt;
&lt;br /&gt;
Nous avons organisé ce projet en plusieurs étapes où chacun des membres a pu plus ou moins participé en fonction de ses capacités :&lt;br /&gt;
&lt;br /&gt;
* Conception du Grafcet pour la commande des Robotino&lt;br /&gt;
&lt;br /&gt;
* Récupération et traitement des données en temps réel&lt;br /&gt;
&lt;br /&gt;
* Utilisation du Machine Learning afin de commander les Robotino&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous avons constitué 2 équipes : une équipe spécialisée dans la commande du Robotino constituée de Loïc et Aymen et l’autre dans le traitement des données avec le Machine Learning avec Antoine, Tom et Florian.&lt;br /&gt;
Nous avons ensuite organisé notre projet à l’aide du diagramme de Gantt ci-dessous.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:GanttMLP5.png]]&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Grafcet pour la commande des Robotino''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Traitement des erreurs''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
=Recherche bibliographique=&lt;br /&gt;
&lt;br /&gt;
* https://www.wikipedia.com&lt;br /&gt;
&lt;br /&gt;
* https://www.jybaudot.fr&lt;br /&gt;
&lt;br /&gt;
* https://datascientest.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.ipgirl.com&lt;br /&gt;
&lt;br /&gt;
* Cours de probabilités et statistiques de l’Université Jules Vernes&lt;br /&gt;
&lt;br /&gt;
* Chaine youtube Machine Learning : https://www.youtube.com/channel/UCmpptkXu8iIFe6kfDK5o7VQ&lt;br /&gt;
&lt;br /&gt;
* Machine Learning with scikit-learn Quick Start Guide écrit par Kevin Jolly&lt;br /&gt;
&lt;br /&gt;
* https://lucidar.me/&lt;br /&gt;
&lt;br /&gt;
* https://archive.ics.uci.edu/ml/datasets.php&lt;br /&gt;
&lt;br /&gt;
* https://www.kaggle.com/datasets&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com/&lt;br /&gt;
&lt;br /&gt;
* Machine Learning algorithms - Second Edition écrit par Giuseppe Bonaccorso&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com&lt;br /&gt;
&lt;br /&gt;
* https://towardsdatascience.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.learndatasci.com/&lt;br /&gt;
&lt;br /&gt;
==Rapports et présentation==&lt;br /&gt;
&lt;br /&gt;
===Librairies===&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1CQZ1s6fNY_6MsmbBa5TP1OzSedqFeaWI?usp=sharing/ Rapport Numpy]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1tdu_B2wRsUiqdnSeskQENdn_wX3pJMeT?usp=sharing/ Rapport Pandas]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1DPS4ZT91SIEhscwST8kfER7u21tKoM3a?usp=sharing/ Rapport Seaborn]&lt;br /&gt;
&lt;br /&gt;
===Rapports===&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/document/d/1yR0vLePV3hI1_HVtTZWwGIwy0Cb-oLOsOTK3Um5KAYE/edit?usp=sharing/ Rapport]&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/presentation/d/1Je_yF0dgc-s9gB7LLsfOg0b05xcwIFJbaqpVytxWv5A/edit?usp=sharing/ Présentation]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1y_NMo9XKJ0WzwE2zmcRblUyuIebwfoN8?usp=sharing/ Régression linéaire]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1bRyrnL1JM870cEcEvfGaS8ItrG16rchy?usp=sharing/ Google Colab]&lt;/div&gt;</summary>
		<author><name>Abrossas</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Fichier:GanttMLP5.png&amp;diff=88068</id>
		<title>Fichier:GanttMLP5.png</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Fichier:GanttMLP5.png&amp;diff=88068"/>
				<updated>2022-05-03T23:52:19Z</updated>
		
		<summary type="html">&lt;p&gt;Abrossas : Abrossas a téléversé une nouvelle version de Fichier:GanttMLP5.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Abrossas</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88067</id>
		<title>IMA3/IMA4 2020/2022 P5</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88067"/>
				<updated>2022-05-03T15:25:00Z</updated>
		
		<summary type="html">&lt;p&gt;Abrossas : /*  Développement du projet  */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 0px; padding: 20px; font-weight: bold; text-align: center; font-size: 80%; background: #61798F; vertical-align: top; width: 100%;&amp;quot;&amp;gt; '''PARTIE I (S6-S7)''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Introduction et cahier des charges''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce projet est la mise en place d’algorithmes de machine Learning afin de diagnostiquer l’état de machines industrielles. Nous travaillerons sur ce projet durant 2 semestres. &lt;br /&gt;
Durant le premier semestre, nous avions comme objectifs d’acquérir la maîtrise des différentes librairies primordiales pour traiter les données en machine Learning, ainsi que d’étudier et d’utiliser certains algorithmes basiques (régression linéaire, logistique, Bayes) sur des datasets que nous traiterons nous même. &lt;br /&gt;
Pour ce qui est du second semestre, notre objectif était de concrétiser les connaissances acquises durant le premier semestre. Nous avons donc essayé de créer notre propre dataset à l’aide des matériels mis à notre disposition, de la prétraiter et d’y appliquer différents algorithmes de Machine Learning en critiquant les résultats.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning pour la détection de défaut s'inscrit parfaitement dans le contexte scientifique actuel, notamment grâce à l’industrie 4.0.&lt;br /&gt;
En effet, cette nouvelle industrie fait apparaître des systèmes communicants (l’IOT : Internet Of Things) interconnectés les uns entre les autres. Ces différents systèmes peuvent êtres nécessaires les uns, les autres afin de réaliser une tâche complexe telle que l'usinage de pièces. Le système devient dès lors potentiellement extrêmement fragile aux pannes.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning a pour but de pouvoir détecter, et localiser les pannes, voir les futures pannes potentielles afin de pouvoir dans un premier temps prévenir un opérateur. Mais il peut aussi potentiellement permettre au système de continuer de tourner, en attendant un technicien. Le machine Learning peut donc aussi permettre à une chaîne de production de continuer de tourner par l’envoie d’un autre robot par exemple, le temps que la panne soit réparée.&lt;br /&gt;
&lt;br /&gt;
Dans le schéma ci-dessous nous avons un exemple de système de système.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Intro1.png|500px|thumb|center|Schéma d'un système de systèmes]]&lt;br /&gt;
&lt;br /&gt;
Il y a deux cas de figure:&lt;br /&gt;
* Un autre système peut être envoyé pour remplacer le système 4.&lt;br /&gt;
* Les systèmes 1 et 2 peuvent permettre à la chaîne de production de continuer de tourner&lt;br /&gt;
* La chaîne de production est hors service jusqu'à réparation.&lt;br /&gt;
&lt;br /&gt;
==Cahier de charges==&lt;br /&gt;
&lt;br /&gt;
'''Ressources disponibles :'''&lt;br /&gt;
&lt;br /&gt;
* Livres sur le machine learning &lt;br /&gt;
* Bases de données (afin d'appliquer divers algorithmes de machine learning) que nous prendrons sur ces sites : [https://www.kaggle.com/datasets] et [https://archive.ics.uci.edu/ml/datasets.php]&lt;br /&gt;
* Librairies Python (Scikit-learn, Pandas, Numpy, Seaborn, Matplotlib)&lt;br /&gt;
* Google Colab&lt;br /&gt;
* Matlab (version étudiante)&lt;br /&gt;
&lt;br /&gt;
'''Objectifs poursuivis :'''&lt;br /&gt;
&lt;br /&gt;
* Détecter les dysfonctionnements de systèmes mécatroniques (par exemple les robots Khepera, Robotino…), grâce au machine learning.&lt;br /&gt;
* Apprendre à implémenter différentes méthodes machine learning .&lt;br /&gt;
&lt;br /&gt;
'''Profil du public cible :'''&lt;br /&gt;
* Secteur mécatronique&lt;br /&gt;
* Entreprises disposant d'ingénieurs pour maintenir le système informatique opérationnel&lt;br /&gt;
* Entreprises utilisant des machines dans le secteur public.&lt;br /&gt;
&lt;br /&gt;
'''Analyse des besoins :'''&lt;br /&gt;
* L’industrie a de plus en plus besoin du machine learning pour détecter les erreurs des systèmes. En effet, cette technologie devient indispensable pour les industriels, notamment afin d'accroître la productivité et l’efficacité des systèmes industriels.&lt;br /&gt;
* Le programme peut ne pas être aussi rapide et optimisé en espace mémoire que d'autres programmes, nous visons l’efficacité de notre algorithme plutôt que la rapidité.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Librairies''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
En Machine Learning, il est très important, voire primordial, de savoir manipuler les différentes librairies mises à notre disposition afin de visualiser, traiter nos différentes dataset ou même appliquer les différents algorithmes de machine Learning.&lt;br /&gt;
Durant les premières semaines de notre projet, nous avons donc appris à utiliser ces différentes librairies nécessaires pour le machine Learning, telles que Numpy, Seaborn, Panda, Matplotlib, Scikit-learn... Nous allons dans un premier temps nous intéresser à l'importation des différentes bibliothèques puis résumer les commandes importantes de ces différentes librairies.&lt;br /&gt;
&lt;br /&gt;
Ces différentes librairies ne sont pas incluses de base dans Python, il est donc nécessaire de les ajouter à Python puis à notre programme.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc choisi d'utiliser google colab car ces librairies y sont déjà installées (et aussi pratique pour travailler à plusieurs sur un même code).&lt;br /&gt;
Puis nous devons importer ces bibliothèques au début de notre programme.&lt;br /&gt;
&lt;br /&gt;
Attention : Plusieurs bibliothèques peuvent avoir la même commande mais avec des significations différentes, comme par exemple la commande randint du module numpy et celle du module random et cela peut conduire à des erreurs. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de pallier à ces problèmes nous apporterons nos librairie au début de nos programmes comme suit :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:librairies1.png]]&lt;br /&gt;
&lt;br /&gt;
Ici le np permet de dire que lorsque nous utilisons np.array alors nous utilisons la commande array () contenu dans la bibliothèque Numpy.&lt;br /&gt;
&lt;br /&gt;
Ceci nous permettra d’utiliser en simultané différentes librairies, toutes les bibliothèques seront importées selon ce schéma.&lt;br /&gt;
Nous allons par la suite, nous intéresser à différentes commandes incluses dans ces librairies.&lt;br /&gt;
&lt;br /&gt;
==Numpy==&lt;br /&gt;
&lt;br /&gt;
Numpy est une bibliothèque dédiée aux calculs mathématiques et à la gestion des listes (telles que des matrices).&lt;br /&gt;
Matplotlib, quant à lui, est dédié aux affichages graphiques de données.&lt;br /&gt;
Nous allons dans cette partie nous intéresser aux commandes principales de ces deux bibliothèques de python.&lt;br /&gt;
&lt;br /&gt;
Sous numpy, les tableaux sont des types array, ils définissent l'équivalent des tableaux statiques en langage C. La taille d’un tableau numpy ne peut donc pas être changée après leur création. &lt;br /&gt;
&lt;br /&gt;
Néanmoins grâce a Numpy nous pouvons simplement effectuer des tâches sur les tableaux comme en extraire un sous tableaux, et d’effectuer simplement les produits entre matrice, vecteur.&lt;br /&gt;
&lt;br /&gt;
Dans notre projet, nous utiliserons plus courament les fonctions : &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.shape&amp;lt;/FONT&amp;gt; permet d’obtenir la taille de la matrice sous forme d’un tuple, suffit de choisir le bon numéro&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.zeros&amp;lt;/FONT&amp;gt; permet de créer une ligne de x zéro(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.ones&amp;lt;/FONT&amp;gt; permet de créer une ligne de x un(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.vstack&amp;lt;/FONT&amp;gt; permet de rajouter des lignes dans une matrice déjà créer en paramètre&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.transpose&amp;lt;/FONT&amp;gt; permet de transposer une matrice en paramètre&lt;br /&gt;
&lt;br /&gt;
==Seaborn==&lt;br /&gt;
&lt;br /&gt;
Seaborn est une bibliothèque de visualisation de données Python basée sur matplotlib. Il fournit une interface de haut niveau pour dessiner des graphiques statistiques attrayants et informatifs.&lt;br /&gt;
&lt;br /&gt;
'''Différences entre Matplotlib et Seaborn'''&lt;br /&gt;
&lt;br /&gt;
Les défauts de Matplotlib qui ne parlent généralement pas aux utilisateurs sont les couleurs, les marques de tiques sur les axes supérieur et droit, le style,...&lt;br /&gt;
Les exemples ci-dessus rendent également une autre frustration des utilisateurs plus apparente: le fait que travailler avec DataFrames ne va pas aussi bien avec Matplotlib, ce qui peut être ennuyeux si vous faites une analyse exploratoire avec Pandas. Et c’est exactement ce que Seaborn adresse : les fonctions de traçage fonctionnent sur dataframes et tableaux qui contiennent tout un ensemble de données.&lt;br /&gt;
[[Fichier:seaborn1.png|300px|thumb|right|Résultat du code python ci gauche]]&lt;br /&gt;
&lt;br /&gt;
   # Import necessary libraries&lt;br /&gt;
   import seaborn as sns&lt;br /&gt;
   import matplotlib.pyplot as plt&lt;br /&gt;
   &lt;br /&gt;
   # Load iris data&lt;br /&gt;
   iris = sns.load_dataset(&amp;quot;iris&amp;quot;) #DATASET ALREADY EXISTING&lt;br /&gt;
   &lt;br /&gt;
   # Construct iris plot&lt;br /&gt;
   sns.swarmplot(x=&amp;quot;species&amp;quot;, y=&amp;quot;petal_length&amp;quot;, data=iris)&lt;br /&gt;
   &lt;br /&gt;
   # Show plot&lt;br /&gt;
   plt.show()&lt;br /&gt;
&lt;br /&gt;
==Pandas==&lt;br /&gt;
&lt;br /&gt;
Pandas est une API d'analyse de données orientée colonnes. C'est un excellent outil pour manipuler et analyser des données d'entrée. Beaucoup de frameworks d'apprentissage automatique acceptent les structures de données Pandas en entrée.&lt;br /&gt;
&lt;br /&gt;
Comme évoqué précédemment, Pandas travaille avec des matrices colonnes communément appelées ‘Series’ mais aussi et surtout avec des tableaux de données appelés ‘DataFrames’.&lt;br /&gt;
Une Series est tout simplement une colonne et une DataFrame est un tableau à plusieurs dimensions constitué de Series.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Panda.JPG]]&lt;br /&gt;
&lt;br /&gt;
A l'aide de Pandas, on peut ainsi créer, importer, lire et manipuler des bases de données facilement.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Théories des algorithmes étudiés''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Il y a différents types d’algorithmes en machine learning, pour notre sujet qui consiste à classer des machines en défectueuse ou fonctionnelles (1 ou 0), nous aurons surtout besoin d’algorithmes de classification binaire. De manière générale, la conception de la plupart des algorithmes fonctionnent de cette manière : &lt;br /&gt;
&lt;br /&gt;
* Élaborer un modèle &lt;br /&gt;
* Établir une fonction coût pour celui-ci correspondant à l’erreur entre le modèle et les données réelles&lt;br /&gt;
* Trouver un algorithme de minimisation de cette fonction coût&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression linéaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression1.png|200px|thumb|right|Exemple de régression linéaire]]&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est un algorithme de prédiction et non un algorithme de classification, nous aurons surtout besoin de ce deuxième type d’algorithme pour notre projet mais nous tenons à présenter cet algorithme qui est le plus basique en machine learning et un bon début pour une formation pédagogique.&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est une méthode de modélisation qui cherche à établir une relation linéaire entre une ou des &amp;quot;features&amp;quot; (variables explicatives) et une &amp;quot;target&amp;quot; (variable expliquée qu'on cherche à prévoir à partir des variables explicatives). En machine learning, la régression linéaire est un modèle d'apprentissage supervisé, c'est-à-dire qu'on apprend à l'algorithme de prédiction à partir d'exemples dont on dispose dans une dataset. Nous nous intéresserons à la régression affine qui est la plus simple pour débuter.&lt;br /&gt;
&lt;br /&gt;
===Modèle et estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
La régression affine consiste donc à trouver un modèle de type&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt;y=ax+b&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
avec x une &amp;quot;feature&amp;quot;, y la target et avec a et b des paramètres qu'il nous faudra déterminer. Le but est donc de trouver les paramètres a et b tels que la distance entre chaque point du nuage et la droite du modèle soit la plus petite possible.&lt;br /&gt;
Mathématiquement, il suffit de résoudre cette formule:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression2.png|200px|thumb|right|Méthode des moindres carrés illustrée]]&lt;br /&gt;
[[Fichier:regression3.png]]&lt;br /&gt;
&lt;br /&gt;
On utilise donc la méthode des moindres carrés pour mesurer l'erreur entre le modèle de prédiction et les données et ainsi fabriquer notre fonction coût :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression4.png]]&lt;br /&gt;
&lt;br /&gt;
avec m le nombre de points du nuage.&lt;br /&gt;
&lt;br /&gt;
L'objectif de l'algorithme est donc de trouver les paramètres optimaux qui minimisent cette fonction J.&lt;br /&gt;
En machine learning, une des méthodes les plus populaires pour faire ceci est la descente de gradient, car c'est une méthode adaptée quand on fait du traitement de grosses dataset (&amp;quot;faible&amp;quot; temps de calcul). En effet, la fonction coût J est une parabole admettant un unique minimum dépendant des paramètres a et b. La descente de gradient consiste à chercher le point de celle-ci où la dérivée est nulle (donc le minimum)&lt;br /&gt;
&lt;br /&gt;
===Méthode de la descente du gradient===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression6.png|200px|thumb|right|Méthode gradient]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression7.png|200px|thumb|right|Généralisation gradient fct parabolique]]&lt;br /&gt;
&lt;br /&gt;
Soit une fonction parabolique ne dépendant que de x. On cherche à trouver le minimum de cette fonction en utilisant la méthode de la descente du gradient&lt;br /&gt;
Pour cela on choisit un point aléatoirement &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;et on va descendre à partir de celui-ci jusqu'à atteindre un minimum en utilisant&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression5.png]]&lt;br /&gt;
&lt;br /&gt;
avec un paramètre  qui influencera la taille du pas de la descente.&lt;br /&gt;
&lt;br /&gt;
Il faut faire attention à ne pas prendre un pas trop grand, ni trop petit, pour éviter de &amp;quot;tourner&amp;quot; autour du minimum ou de prendre trop de temps pour l'atteindre.&lt;br /&gt;
Note : On peut généraliser cela pour une fonction parabolique à n paramètres qui aurait donc une forme de bol.&lt;br /&gt;
&lt;br /&gt;
===Application sur notre fonction coût===&lt;br /&gt;
&lt;br /&gt;
Notre fonction coût dépend des 2 paramètres a et b :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression8.png]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression9.png]]&lt;br /&gt;
&lt;br /&gt;
On choisit &amp;lt;math&amp;gt;a_0&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; aléatoirement et on applique ceci pour un pas :&lt;br /&gt;
&lt;br /&gt;
Avec &lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression10.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d'un certain nombre d'itérations on trouve le couple &amp;lt;math&amp;gt;(a,b)&amp;lt;/math&amp;gt; qui minimise notre fonction coût.&lt;br /&gt;
&lt;br /&gt;
Note : Nous avons démontré la théorie de la régression linéaire affine mais on pourrait généraliser celle-ci pour un modèle polynomiale d’ordre n, la courbe de prédiction serait donc parabolique et il faudrait trouver le tuple &amp;lt;math&amp;gt;(a_1,a_2,...,a_n)&amp;lt;/math&amp;gt; qui minimise la fonction coût.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression logistique binaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo1.png|200px|thumb|right|Modèle régression logistique]]&lt;br /&gt;
&lt;br /&gt;
La régression logistique binaire est un algorithme de classification, contrairement à la régression linéaire qui est un algorithme de prédiction. De la même façon que la régression linéaire,  il s'agit de modéliser au mieux un modèle mathématique simple à des observations réelles nombreuses. Cette méthode se base sur de l’analyse mathématiques et statistique. Il faut donc associer à des “features” &amp;lt;math&amp;gt;(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; une variable Y valant 1 ou 0 (d’où le terme classification binaire).&lt;br /&gt;
&lt;br /&gt;
L’objectif de l’algorithme est donc de trouver la fonction F dépendant d’une loi de probabilité telle que :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo2.png]]&lt;br /&gt;
&lt;br /&gt;
avec S un certain seuil (fixé la plupart du temps à 0,5).&lt;br /&gt;
&lt;br /&gt;
===Modèle===&lt;br /&gt;
&lt;br /&gt;
Comme cette méthode repose principalement sur des statistiques, il est important d’adopter une notation explicite lors de l’explication théorique :&lt;br /&gt;
&lt;br /&gt;
* On notera Y la variable à prédire (qui vaudra 0 ou 1) et &amp;lt;math&amp;gt;X=(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; les variables permettant de prédire Y&lt;br /&gt;
* On travaillera dans un univers  de N échantillons (taille de la dataset)&lt;br /&gt;
* On notera &amp;lt;math&amp;gt;P(Y=1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;P(Y=0)&amp;lt;/math&amp;gt; les probabilités que Y valent respectivement 1 ou 0 &amp;lt;math&amp;gt;p(1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0)&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;p(X|1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(X|0)&amp;lt;/math&amp;gt; sont les distributions conditionnelles des caractéristiques X sachant la valeur prise par Y&lt;br /&gt;
* &amp;lt;math&amp;gt;p(1|X)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0|X)&amp;lt;/math&amp;gt; sont donc les probabilités d’obtenir la valeur de Y (1 ou 0) sachant les valeurs de X&lt;br /&gt;
&lt;br /&gt;
La régression logistique utilise l’hypothèse fondamentale (mesure de l’évidence) :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo3.png]]&lt;br /&gt;
&lt;br /&gt;
On en déduit donc (comme &amp;lt;math&amp;gt;p(0|X)=1-p(1|X))&amp;lt;/math&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo4.png]]&lt;br /&gt;
&lt;br /&gt;
Avec &amp;lt;math&amp;gt;(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; des variables à déterminer.&lt;br /&gt;
&lt;br /&gt;
''Note :'' ce modèle est appelé modèle LOGIT.&lt;br /&gt;
&lt;br /&gt;
===Estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
Contrairement à la régression linéaire affine, on ne peut pas utiliser la méthode des moindres carrés, on utilise alors la méthode de maximisation de la vraisemblance.&lt;br /&gt;
“La vraisemblance mesure une adéquation entre la distribution observée sur un échantillon aléatoire et une loi de probabilité supposée décrire une réalité sur la population dont l'échantillon est issu.” (source : [www.jybaudot.fr])&lt;br /&gt;
&lt;br /&gt;
Le calcul de la vraisemblance L dans un univers  de N échantillons est le suivant :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo5.png]]&lt;br /&gt;
&lt;br /&gt;
Plus la vraisemblance est élevée, alors plus la loi de probabilité est proche de la réalité. Le but est donc de maximiser cette valeur et de trouver les valeurs optimales de &amp;lt;math&amp;gt;A =(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; qui influent directement sur la loi de probabilité établie dans la partie modèle.&lt;br /&gt;
&lt;br /&gt;
===Algorithme d'optimisation===&lt;br /&gt;
&lt;br /&gt;
Afin de trouver la valeur optimale du vecteur A, nous utiliserons encore une fois la méthode de descente du gradient adaptée à notre cas.&lt;br /&gt;
&lt;br /&gt;
Celle-ci utilise la relation suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo6.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d’un certain nombre d’itérations, on trouvera la valeur optimale de A afin de maximiser la vraisemblance.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Mise en pratique''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Pour la mise en pratique, nous avons décidé d’appliquer les méthodes sur un dataset de prédiction de maintenance pour l’industrie, nous importons grâce à la librairie panda : &amp;lt;code&amp;gt; dataset = pd.read_csv('ai4i2020.csv') &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette dataset contient 14 colonnes de données, nous pouvons visualiser la proportion de données saines et non-saines par ce code seaborn : &amp;lt;code&amp;gt; sns.factorplot('Machine failure',data=dataset,kind='count') &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on traitera cette dataset pour la préparer sur l’intervention des modèles de machine learning, puis on appliquera ces méthodes.&lt;br /&gt;
&lt;br /&gt;
==Pré-traitement de la dataset==&lt;br /&gt;
&lt;br /&gt;
Avant d’appliquer les algorithme sur notre dataset, il faut la traiter, le traitement sera le même pour tous les algorithmes et suivra cet ordre :&lt;br /&gt;
* Traitement des valeurs manquantes&lt;br /&gt;
* Équilibrage des données&lt;br /&gt;
* Séparations des données en entrainement et test&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous devons regarder si notre base de données contient des valeurs manquante, pour cela nous implantons ce code : &lt;br /&gt;
&lt;br /&gt;
   import missingno as msno&lt;br /&gt;
   msno.matrix(dataset)&lt;br /&gt;
&lt;br /&gt;
Les lignes blanches dans le résultat correspond aux valeurs manquantes, ci-dessous nous voyons que nous avons aucune données manquantes dans la base que nous avons importer : [[Fichier:Miseenpratique.png]]&lt;br /&gt;
&lt;br /&gt;
Dans le cas, où nous avons des valeurs manquante, il y a plusieurs méthodes pour traiter les valeurs manquantes mais nous retenons 2 méthodes :&lt;br /&gt;
* Une méthode qui consiste à supprimer les lignes où des valeurs manquantes sont présentes : &amp;lt;code&amp;gt; data.dropna(inplace=True) &amp;lt;/code&amp;gt;&lt;br /&gt;
L’avantage de cette méthode est de créer un modèle robuste. L’inconvénient majeur est le fait qu’on peut perdre énormément de données, pour des données où les valeurs manquantes sont excessives, mieux vaut appliquer une autre méthode.&lt;br /&gt;
&lt;br /&gt;
* Une méthode qui consiste à remplacer les valeurs manquantes par la moyenne des données de la colonne : &amp;lt;code&amp;gt; data[0]=drop[0].replace(np.NaN,data[0].mean()) &amp;lt;/code&amp;gt; L’avantage de cette méthode permet d’éviter la suppression de lignes, ce qui permet de garder les autres données comparé à l’autre méthode. Cependant cette méthode n’est que applicable sur les données numériques&lt;br /&gt;
&lt;br /&gt;
Nous passons alors sur l'équilibrage des données. Avant d’appliquer la méthode SMOTE, nous devons mettre dans 2 variables, la target (y) et les features (X) :&lt;br /&gt;
&lt;br /&gt;
   X = dataset.drop(['Machine failure','UDI','Product ID','Type','TWF','HDF','PWF','OSF','RNF'],axis=1).values&lt;br /&gt;
   y = dataset['Machine failure']&lt;br /&gt;
&lt;br /&gt;
Notre target sera seulement ‘Machine failure’ et nos features seront : la température de l’air, la température du processus, le couple, et l’usure des outils.&lt;br /&gt;
&lt;br /&gt;
Durant notre projet , nous avons implémenté la technique SMOTE pour traiter les ensembles de données déséquilibrées.&lt;br /&gt;
Le principe de SMOTE est de générer de nouveaux échantillons en combinant les données de la classe minoritaire avec celles de leurs voisins proches. Techniquement, on peut décomposer SMOTE en 5 étapes :&lt;br /&gt;
* 1 - Choix d’un vecteur caractéristique de notre classe minoritaire que nous appellerons vc &lt;br /&gt;
* 2 - Sélection des k-voisins les plus proches (k=5 par défaut) et choix de l’un d’eux au hasard que l’on appellera pv &lt;br /&gt;
* 3 - Calcul de la différence pour chaque valeur caractéristique (feature value) i, vc[i]-pv[i] et multiplication de celle-ci par un nombre aléatoire entre [0,1]&lt;br /&gt;
* 4 - Ajout du résultat précédent à la valeur de la caractéristique i du vecteur vc afin d’obtenir un nouveau point (une nouvelle donnée) dans l’espace des caractéristiques &lt;br /&gt;
* 5 - Répétition de ces opérations pour chaque point de données de la classe minoritaire &lt;br /&gt;
Nous remarquons que cette technique marche après smote (50% données saines, 50% données non-saines)&lt;br /&gt;
&lt;br /&gt;
Code : &lt;br /&gt;
&lt;br /&gt;
   oversample = SMOTE()&lt;br /&gt;
   Xsmote, ysmote = oversample.fit_resample(X,y)&lt;br /&gt;
   Xsmote = pd.DataFrame(Xsmote)&lt;br /&gt;
   ysmote = pd.DataFrame(ysmote)&lt;br /&gt;
   X=Xsmote&lt;br /&gt;
   y=ysmote&lt;br /&gt;
&lt;br /&gt;
On remarque que la technique smote a ajouté 9322 lignes sur notre base, Maintenant que nous avons un équilibre entre les données ‘sains’ et ‘malsains’, nous pouvons voir la répartitions des points sur 2 axes :&lt;br /&gt;
&lt;br /&gt;
(image)&lt;br /&gt;
&lt;br /&gt;
Nous pouvons alors procéder à la séparation de nos données en données d'entraînement et de test&lt;br /&gt;
&lt;br /&gt;
Nous devons séparer en deux nos données pour pouvoir appliquer les algorithmes de machine learning, ainsi : &lt;br /&gt;
Les données d'entraînement serviront de repères pour l’algorithme&lt;br /&gt;
Les données de test seront entraînées par celle d’entrainement pour créer une prédiction&lt;br /&gt;
&lt;br /&gt;
Nous allons utiliser la fonction train_test_split de la librairie sklearn pour séparer nos données : &lt;br /&gt;
&lt;br /&gt;
   X_train, X_test, y_train, y_test = train_test_split(X,y, test_size = 0.2, random_state = 100)&lt;br /&gt;
&lt;br /&gt;
Ici dans les paramètres :&lt;br /&gt;
X  correspond aux features&lt;br /&gt;
y correspond à la target&lt;br /&gt;
test_size correspond au pourcentage de séparation (soit 0.2 = 20% test et 80% d'entraînement)&lt;br /&gt;
random_state permet d’initialiser le choix aléatoire pour avoir la même répartition à chaque exécution&lt;br /&gt;
&lt;br /&gt;
Maintenant nous pouvons appliquer les algorithme à notre modèle&lt;br /&gt;
&lt;br /&gt;
==Application des algorithmes==&lt;br /&gt;
&lt;br /&gt;
En général, nous allons appliquer les algorithme en suivant cet ordre : &lt;br /&gt;
* Importation de la méthode sur la librairie sklearn&lt;br /&gt;
* Entraînement des données&lt;br /&gt;
* Prédiction&lt;br /&gt;
* Méthodes d’évaluations&lt;br /&gt;
&lt;br /&gt;
===Régression linéaire===&lt;br /&gt;
&lt;br /&gt;
Nous allons commencer par le plus simple : la régression linéaire, nous commençons par importer l’algorithme à partir de la librairie sklearn : &amp;lt;code&amp;gt; from sklearn.linear_model import LinearRegression &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis nous appelons l’algorithme avec les paramètres de base, puis nous entraînons notre dataset : &lt;br /&gt;
   #Méthode de régréssion linéaire&lt;br /&gt;
   lr = LinearRegression()&lt;br /&gt;
   #Training&lt;br /&gt;
   lr.fit(X_train,y_train)&lt;br /&gt;
&lt;br /&gt;
Ensuite la prédiction : &lt;br /&gt;
   #Prediction&lt;br /&gt;
   y_pred = lr.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
Et enfin l'évaluation, nous avons vu 2 méthodes pour évaluer notre modèle : &lt;br /&gt;
* Afficher le score de prédiction&lt;br /&gt;
* Afficher la matrice de confusion, une matrice de taille 2x2 qui donne ces informations : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatrixConfusion.png]]&lt;br /&gt;
&lt;br /&gt;
Le score de prédiction (accuracy) est également calculé à partir de cette matrice&lt;br /&gt;
Pour la régression linéaire, nous allons qu’afficher le score de prédiction, car cet algorithme nous donne en retour des valeurs non-binaire, la construction d’une matrice de confusion et impossible.&lt;br /&gt;
&lt;br /&gt;
   #Evaluation&lt;br /&gt;
   print(lr.score(X_test,y_test))&lt;br /&gt;
&lt;br /&gt;
Nous obtenons ainsi un score de 0.48, un score qui est plus élevé sans la méthode SMOTE (0.14), sauf que cette méthode n’est pas la plus optimisée pour cette base de données, car nous avons en target des valeurs binaires. Il vaut mieux appliquer la méthode de régression logistique ou la méthode de Naives-Bayes.&lt;br /&gt;
&lt;br /&gt;
===Régression logistique===&lt;br /&gt;
&lt;br /&gt;
Dans le même modèle que la régression linéaire, nous procédons à l’import de la méthode, l’appel de la méthode, l'entraînement des données et de la prédiction :&lt;br /&gt;
&lt;br /&gt;
   from sklearn import linear_model&lt;br /&gt;
&lt;br /&gt;
   #Modèle régression logistique&lt;br /&gt;
   modele_regLog = linear_model.LogisticRegression() &lt;br /&gt;
   #random_state = 100, solver = 'liblinear', multi_class = 'auto'&lt;br /&gt;
&lt;br /&gt;
   #training&lt;br /&gt;
   modele_regLog.fit(X_train,y_train)&lt;br /&gt;
&lt;br /&gt;
   #prediction&lt;br /&gt;
   y_pred = modele_regLog.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
   #précision du modèle&lt;br /&gt;
   precision = modele_regLog.score(X_test,y_test)&lt;br /&gt;
   print(precision)&lt;br /&gt;
&lt;br /&gt;
Pour la régression logistique, nous allons afficher la matrice de confusion et le score :&lt;br /&gt;
&lt;br /&gt;
   from sklearn.metrics import plot_confusion_matrix&lt;br /&gt;
   plot_confusion_matrix(modele_regLog, X_test, y_test)  &lt;br /&gt;
   plt.show() &lt;br /&gt;
&lt;br /&gt;
(images)&lt;br /&gt;
&lt;br /&gt;
Nous obtenons un score de 0.82, contre 0.97 sans la méthode de SMOTE, ce qui est cohérent car le score obtenu sans SMOTE n’est pas précis car il y avait peu de données où la machine a planté. Avec SMOTE, nous obtenons certes un score moins élevé mais plus précis.&lt;br /&gt;
Grâce à la matrice de confusion nous pouvons voir que : &lt;br /&gt;
* Il y a 2396 fois où l’algorithme a prédit Machine failure = 0 et a eu raison&lt;br /&gt;
* Il y a 2377 fois où l’algorithme a prédit Machine failure = 1 et a eu raison&lt;br /&gt;
* Il y a 546 fois où l’algorithme a prédit Machine failure = 1 et a eu faux&lt;br /&gt;
* Il y a 478 fois où l’algorithme a prédit Machine failure = 0 et a eu faux&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 0px; padding: 20px; font-weight: bold; text-align: center; font-size: 80%; background: #61798F; vertical-align: top; width: 100%;&amp;quot;&amp;gt; '''PARTIE II (S8)''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Développement du projet''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Durant les deux premiers semestres de ce projet, nous avons découvert et étudié le Machine Learning, que ce soit la théorie de différents algorithmes connus ou l'application pratique à des datasets que nous pouvons récupérer sur Internet ou bien créer nous même.&lt;br /&gt;
&lt;br /&gt;
La création de notre dataset ayant été fastidieuse et peu concluante (voir résultats du semestre précédent), nous avons comme objectif pour ce semestre d'implémenter nos algorithmes (et principalement le réseau de neurones) à des machines dont nous avons accès à l'école.&lt;br /&gt;
&lt;br /&gt;
Après discussion avec notre tuteur de projet Monsieur Lakhal, nous avons décidé d'utiliser des Robotino plutôt que d'utiliser la chaîne de production présente à l'école car il existe des logiciels simples permettant d'effectuer des simulations de réseaux logistiques de Robotinos (Robotino View et Robotino Simulation) dont nous allons récupérer les données en temps réel, les traiter puis commander les différents Robotino à l'aide d’un algorithme de réseaux de neurones.&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce semestre est ainsi de réaliser le scénario d'un réseau logistique autonome (à l'image d'Amazon par exemple) composé de plusieurs Robotino effectuant chacun une tâche et d'y introduire des erreurs puis de les traiter grâce au Machine Learning afin de ne pas perturber la logistique et d’obtenir un maximum d’efficacité.&lt;br /&gt;
&lt;br /&gt;
Nous avons organisé ce projet en plusieurs étapes où chacun des membres a pu plus ou moins participé en fonction de ses capacités :&lt;br /&gt;
&lt;br /&gt;
* Conception du Grafcet pour la commande des Robotino&lt;br /&gt;
&lt;br /&gt;
* Récupération et traitement des données en temps réel&lt;br /&gt;
&lt;br /&gt;
* Utilisation du Machine Learning afin de commander les Robotino&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous avons constitué 2 équipes : une équipe spécialisée dans la commande du Robotino constituée de Loïc et Aymen et l’autre dans le traitement des données avec le Machine Learning avec Antoine, Tom et Florian.&lt;br /&gt;
Nous avons ensuite organisé notre projet à l’aide du diagramme de Gantt ci-dessous.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:GanttMLP5.png]]&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Élaboration du scénario''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Traitement des erreurs''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
=Recherche bibliographique=&lt;br /&gt;
&lt;br /&gt;
* https://www.wikipedia.com&lt;br /&gt;
&lt;br /&gt;
* https://www.jybaudot.fr&lt;br /&gt;
&lt;br /&gt;
* https://datascientest.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.ipgirl.com&lt;br /&gt;
&lt;br /&gt;
* Cours de probabilités et statistiques de l’Université Jules Vernes&lt;br /&gt;
&lt;br /&gt;
* Chaine youtube Machine Learning : https://www.youtube.com/channel/UCmpptkXu8iIFe6kfDK5o7VQ&lt;br /&gt;
&lt;br /&gt;
* Machine Learning with scikit-learn Quick Start Guide écrit par Kevin Jolly&lt;br /&gt;
&lt;br /&gt;
* https://lucidar.me/&lt;br /&gt;
&lt;br /&gt;
* https://archive.ics.uci.edu/ml/datasets.php&lt;br /&gt;
&lt;br /&gt;
* https://www.kaggle.com/datasets&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com/&lt;br /&gt;
&lt;br /&gt;
* Machine Learning algorithms - Second Edition écrit par Giuseppe Bonaccorso&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com&lt;br /&gt;
&lt;br /&gt;
* https://towardsdatascience.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.learndatasci.com/&lt;br /&gt;
&lt;br /&gt;
==Rapports et présentation==&lt;br /&gt;
&lt;br /&gt;
===Librairies===&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1CQZ1s6fNY_6MsmbBa5TP1OzSedqFeaWI?usp=sharing/ Rapport Numpy]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1tdu_B2wRsUiqdnSeskQENdn_wX3pJMeT?usp=sharing/ Rapport Pandas]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1DPS4ZT91SIEhscwST8kfER7u21tKoM3a?usp=sharing/ Rapport Seaborn]&lt;br /&gt;
&lt;br /&gt;
===Rapports===&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/document/d/1yR0vLePV3hI1_HVtTZWwGIwy0Cb-oLOsOTK3Um5KAYE/edit?usp=sharing/ Rapport]&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/presentation/d/1Je_yF0dgc-s9gB7LLsfOg0b05xcwIFJbaqpVytxWv5A/edit?usp=sharing/ Présentation]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1y_NMo9XKJ0WzwE2zmcRblUyuIebwfoN8?usp=sharing/ Régression linéaire]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1bRyrnL1JM870cEcEvfGaS8ItrG16rchy?usp=sharing/ Google Colab]&lt;/div&gt;</summary>
		<author><name>Abrossas</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Fichier:GanttMLP5.png&amp;diff=88066</id>
		<title>Fichier:GanttMLP5.png</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Fichier:GanttMLP5.png&amp;diff=88066"/>
				<updated>2022-05-03T15:24:20Z</updated>
		
		<summary type="html">&lt;p&gt;Abrossas : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Abrossas</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88065</id>
		<title>IMA3/IMA4 2020/2022 P5</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88065"/>
				<updated>2022-05-03T15:24:09Z</updated>
		
		<summary type="html">&lt;p&gt;Abrossas : /*  Développement du projet  */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 0px; padding: 20px; font-weight: bold; text-align: center; font-size: 80%; background: #61798F; vertical-align: top; width: 100%;&amp;quot;&amp;gt; '''PARTIE I (S6-S7)''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Introduction et cahier des charges''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce projet est la mise en place d’algorithmes de machine Learning afin de diagnostiquer l’état de machines industrielles. Nous travaillerons sur ce projet durant 2 semestres. &lt;br /&gt;
Durant le premier semestre, nous avions comme objectifs d’acquérir la maîtrise des différentes librairies primordiales pour traiter les données en machine Learning, ainsi que d’étudier et d’utiliser certains algorithmes basiques (régression linéaire, logistique, Bayes) sur des datasets que nous traiterons nous même. &lt;br /&gt;
Pour ce qui est du second semestre, notre objectif était de concrétiser les connaissances acquises durant le premier semestre. Nous avons donc essayé de créer notre propre dataset à l’aide des matériels mis à notre disposition, de la prétraiter et d’y appliquer différents algorithmes de Machine Learning en critiquant les résultats.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning pour la détection de défaut s'inscrit parfaitement dans le contexte scientifique actuel, notamment grâce à l’industrie 4.0.&lt;br /&gt;
En effet, cette nouvelle industrie fait apparaître des systèmes communicants (l’IOT : Internet Of Things) interconnectés les uns entre les autres. Ces différents systèmes peuvent êtres nécessaires les uns, les autres afin de réaliser une tâche complexe telle que l'usinage de pièces. Le système devient dès lors potentiellement extrêmement fragile aux pannes.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning a pour but de pouvoir détecter, et localiser les pannes, voir les futures pannes potentielles afin de pouvoir dans un premier temps prévenir un opérateur. Mais il peut aussi potentiellement permettre au système de continuer de tourner, en attendant un technicien. Le machine Learning peut donc aussi permettre à une chaîne de production de continuer de tourner par l’envoie d’un autre robot par exemple, le temps que la panne soit réparée.&lt;br /&gt;
&lt;br /&gt;
Dans le schéma ci-dessous nous avons un exemple de système de système.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Intro1.png|500px|thumb|center|Schéma d'un système de systèmes]]&lt;br /&gt;
&lt;br /&gt;
Il y a deux cas de figure:&lt;br /&gt;
* Un autre système peut être envoyé pour remplacer le système 4.&lt;br /&gt;
* Les systèmes 1 et 2 peuvent permettre à la chaîne de production de continuer de tourner&lt;br /&gt;
* La chaîne de production est hors service jusqu'à réparation.&lt;br /&gt;
&lt;br /&gt;
==Cahier de charges==&lt;br /&gt;
&lt;br /&gt;
'''Ressources disponibles :'''&lt;br /&gt;
&lt;br /&gt;
* Livres sur le machine learning &lt;br /&gt;
* Bases de données (afin d'appliquer divers algorithmes de machine learning) que nous prendrons sur ces sites : [https://www.kaggle.com/datasets] et [https://archive.ics.uci.edu/ml/datasets.php]&lt;br /&gt;
* Librairies Python (Scikit-learn, Pandas, Numpy, Seaborn, Matplotlib)&lt;br /&gt;
* Google Colab&lt;br /&gt;
* Matlab (version étudiante)&lt;br /&gt;
&lt;br /&gt;
'''Objectifs poursuivis :'''&lt;br /&gt;
&lt;br /&gt;
* Détecter les dysfonctionnements de systèmes mécatroniques (par exemple les robots Khepera, Robotino…), grâce au machine learning.&lt;br /&gt;
* Apprendre à implémenter différentes méthodes machine learning .&lt;br /&gt;
&lt;br /&gt;
'''Profil du public cible :'''&lt;br /&gt;
* Secteur mécatronique&lt;br /&gt;
* Entreprises disposant d'ingénieurs pour maintenir le système informatique opérationnel&lt;br /&gt;
* Entreprises utilisant des machines dans le secteur public.&lt;br /&gt;
&lt;br /&gt;
'''Analyse des besoins :'''&lt;br /&gt;
* L’industrie a de plus en plus besoin du machine learning pour détecter les erreurs des systèmes. En effet, cette technologie devient indispensable pour les industriels, notamment afin d'accroître la productivité et l’efficacité des systèmes industriels.&lt;br /&gt;
* Le programme peut ne pas être aussi rapide et optimisé en espace mémoire que d'autres programmes, nous visons l’efficacité de notre algorithme plutôt que la rapidité.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Librairies''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
En Machine Learning, il est très important, voire primordial, de savoir manipuler les différentes librairies mises à notre disposition afin de visualiser, traiter nos différentes dataset ou même appliquer les différents algorithmes de machine Learning.&lt;br /&gt;
Durant les premières semaines de notre projet, nous avons donc appris à utiliser ces différentes librairies nécessaires pour le machine Learning, telles que Numpy, Seaborn, Panda, Matplotlib, Scikit-learn... Nous allons dans un premier temps nous intéresser à l'importation des différentes bibliothèques puis résumer les commandes importantes de ces différentes librairies.&lt;br /&gt;
&lt;br /&gt;
Ces différentes librairies ne sont pas incluses de base dans Python, il est donc nécessaire de les ajouter à Python puis à notre programme.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc choisi d'utiliser google colab car ces librairies y sont déjà installées (et aussi pratique pour travailler à plusieurs sur un même code).&lt;br /&gt;
Puis nous devons importer ces bibliothèques au début de notre programme.&lt;br /&gt;
&lt;br /&gt;
Attention : Plusieurs bibliothèques peuvent avoir la même commande mais avec des significations différentes, comme par exemple la commande randint du module numpy et celle du module random et cela peut conduire à des erreurs. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de pallier à ces problèmes nous apporterons nos librairie au début de nos programmes comme suit :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:librairies1.png]]&lt;br /&gt;
&lt;br /&gt;
Ici le np permet de dire que lorsque nous utilisons np.array alors nous utilisons la commande array () contenu dans la bibliothèque Numpy.&lt;br /&gt;
&lt;br /&gt;
Ceci nous permettra d’utiliser en simultané différentes librairies, toutes les bibliothèques seront importées selon ce schéma.&lt;br /&gt;
Nous allons par la suite, nous intéresser à différentes commandes incluses dans ces librairies.&lt;br /&gt;
&lt;br /&gt;
==Numpy==&lt;br /&gt;
&lt;br /&gt;
Numpy est une bibliothèque dédiée aux calculs mathématiques et à la gestion des listes (telles que des matrices).&lt;br /&gt;
Matplotlib, quant à lui, est dédié aux affichages graphiques de données.&lt;br /&gt;
Nous allons dans cette partie nous intéresser aux commandes principales de ces deux bibliothèques de python.&lt;br /&gt;
&lt;br /&gt;
Sous numpy, les tableaux sont des types array, ils définissent l'équivalent des tableaux statiques en langage C. La taille d’un tableau numpy ne peut donc pas être changée après leur création. &lt;br /&gt;
&lt;br /&gt;
Néanmoins grâce a Numpy nous pouvons simplement effectuer des tâches sur les tableaux comme en extraire un sous tableaux, et d’effectuer simplement les produits entre matrice, vecteur.&lt;br /&gt;
&lt;br /&gt;
Dans notre projet, nous utiliserons plus courament les fonctions : &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.shape&amp;lt;/FONT&amp;gt; permet d’obtenir la taille de la matrice sous forme d’un tuple, suffit de choisir le bon numéro&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.zeros&amp;lt;/FONT&amp;gt; permet de créer une ligne de x zéro(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.ones&amp;lt;/FONT&amp;gt; permet de créer une ligne de x un(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.vstack&amp;lt;/FONT&amp;gt; permet de rajouter des lignes dans une matrice déjà créer en paramètre&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.transpose&amp;lt;/FONT&amp;gt; permet de transposer une matrice en paramètre&lt;br /&gt;
&lt;br /&gt;
==Seaborn==&lt;br /&gt;
&lt;br /&gt;
Seaborn est une bibliothèque de visualisation de données Python basée sur matplotlib. Il fournit une interface de haut niveau pour dessiner des graphiques statistiques attrayants et informatifs.&lt;br /&gt;
&lt;br /&gt;
'''Différences entre Matplotlib et Seaborn'''&lt;br /&gt;
&lt;br /&gt;
Les défauts de Matplotlib qui ne parlent généralement pas aux utilisateurs sont les couleurs, les marques de tiques sur les axes supérieur et droit, le style,...&lt;br /&gt;
Les exemples ci-dessus rendent également une autre frustration des utilisateurs plus apparente: le fait que travailler avec DataFrames ne va pas aussi bien avec Matplotlib, ce qui peut être ennuyeux si vous faites une analyse exploratoire avec Pandas. Et c’est exactement ce que Seaborn adresse : les fonctions de traçage fonctionnent sur dataframes et tableaux qui contiennent tout un ensemble de données.&lt;br /&gt;
[[Fichier:seaborn1.png|300px|thumb|right|Résultat du code python ci gauche]]&lt;br /&gt;
&lt;br /&gt;
   # Import necessary libraries&lt;br /&gt;
   import seaborn as sns&lt;br /&gt;
   import matplotlib.pyplot as plt&lt;br /&gt;
   &lt;br /&gt;
   # Load iris data&lt;br /&gt;
   iris = sns.load_dataset(&amp;quot;iris&amp;quot;) #DATASET ALREADY EXISTING&lt;br /&gt;
   &lt;br /&gt;
   # Construct iris plot&lt;br /&gt;
   sns.swarmplot(x=&amp;quot;species&amp;quot;, y=&amp;quot;petal_length&amp;quot;, data=iris)&lt;br /&gt;
   &lt;br /&gt;
   # Show plot&lt;br /&gt;
   plt.show()&lt;br /&gt;
&lt;br /&gt;
==Pandas==&lt;br /&gt;
&lt;br /&gt;
Pandas est une API d'analyse de données orientée colonnes. C'est un excellent outil pour manipuler et analyser des données d'entrée. Beaucoup de frameworks d'apprentissage automatique acceptent les structures de données Pandas en entrée.&lt;br /&gt;
&lt;br /&gt;
Comme évoqué précédemment, Pandas travaille avec des matrices colonnes communément appelées ‘Series’ mais aussi et surtout avec des tableaux de données appelés ‘DataFrames’.&lt;br /&gt;
Une Series est tout simplement une colonne et une DataFrame est un tableau à plusieurs dimensions constitué de Series.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Panda.JPG]]&lt;br /&gt;
&lt;br /&gt;
A l'aide de Pandas, on peut ainsi créer, importer, lire et manipuler des bases de données facilement.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Théories des algorithmes étudiés''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Il y a différents types d’algorithmes en machine learning, pour notre sujet qui consiste à classer des machines en défectueuse ou fonctionnelles (1 ou 0), nous aurons surtout besoin d’algorithmes de classification binaire. De manière générale, la conception de la plupart des algorithmes fonctionnent de cette manière : &lt;br /&gt;
&lt;br /&gt;
* Élaborer un modèle &lt;br /&gt;
* Établir une fonction coût pour celui-ci correspondant à l’erreur entre le modèle et les données réelles&lt;br /&gt;
* Trouver un algorithme de minimisation de cette fonction coût&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression linéaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression1.png|200px|thumb|right|Exemple de régression linéaire]]&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est un algorithme de prédiction et non un algorithme de classification, nous aurons surtout besoin de ce deuxième type d’algorithme pour notre projet mais nous tenons à présenter cet algorithme qui est le plus basique en machine learning et un bon début pour une formation pédagogique.&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est une méthode de modélisation qui cherche à établir une relation linéaire entre une ou des &amp;quot;features&amp;quot; (variables explicatives) et une &amp;quot;target&amp;quot; (variable expliquée qu'on cherche à prévoir à partir des variables explicatives). En machine learning, la régression linéaire est un modèle d'apprentissage supervisé, c'est-à-dire qu'on apprend à l'algorithme de prédiction à partir d'exemples dont on dispose dans une dataset. Nous nous intéresserons à la régression affine qui est la plus simple pour débuter.&lt;br /&gt;
&lt;br /&gt;
===Modèle et estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
La régression affine consiste donc à trouver un modèle de type&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt;y=ax+b&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
avec x une &amp;quot;feature&amp;quot;, y la target et avec a et b des paramètres qu'il nous faudra déterminer. Le but est donc de trouver les paramètres a et b tels que la distance entre chaque point du nuage et la droite du modèle soit la plus petite possible.&lt;br /&gt;
Mathématiquement, il suffit de résoudre cette formule:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression2.png|200px|thumb|right|Méthode des moindres carrés illustrée]]&lt;br /&gt;
[[Fichier:regression3.png]]&lt;br /&gt;
&lt;br /&gt;
On utilise donc la méthode des moindres carrés pour mesurer l'erreur entre le modèle de prédiction et les données et ainsi fabriquer notre fonction coût :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression4.png]]&lt;br /&gt;
&lt;br /&gt;
avec m le nombre de points du nuage.&lt;br /&gt;
&lt;br /&gt;
L'objectif de l'algorithme est donc de trouver les paramètres optimaux qui minimisent cette fonction J.&lt;br /&gt;
En machine learning, une des méthodes les plus populaires pour faire ceci est la descente de gradient, car c'est une méthode adaptée quand on fait du traitement de grosses dataset (&amp;quot;faible&amp;quot; temps de calcul). En effet, la fonction coût J est une parabole admettant un unique minimum dépendant des paramètres a et b. La descente de gradient consiste à chercher le point de celle-ci où la dérivée est nulle (donc le minimum)&lt;br /&gt;
&lt;br /&gt;
===Méthode de la descente du gradient===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression6.png|200px|thumb|right|Méthode gradient]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression7.png|200px|thumb|right|Généralisation gradient fct parabolique]]&lt;br /&gt;
&lt;br /&gt;
Soit une fonction parabolique ne dépendant que de x. On cherche à trouver le minimum de cette fonction en utilisant la méthode de la descente du gradient&lt;br /&gt;
Pour cela on choisit un point aléatoirement &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;et on va descendre à partir de celui-ci jusqu'à atteindre un minimum en utilisant&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression5.png]]&lt;br /&gt;
&lt;br /&gt;
avec un paramètre  qui influencera la taille du pas de la descente.&lt;br /&gt;
&lt;br /&gt;
Il faut faire attention à ne pas prendre un pas trop grand, ni trop petit, pour éviter de &amp;quot;tourner&amp;quot; autour du minimum ou de prendre trop de temps pour l'atteindre.&lt;br /&gt;
Note : On peut généraliser cela pour une fonction parabolique à n paramètres qui aurait donc une forme de bol.&lt;br /&gt;
&lt;br /&gt;
===Application sur notre fonction coût===&lt;br /&gt;
&lt;br /&gt;
Notre fonction coût dépend des 2 paramètres a et b :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression8.png]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression9.png]]&lt;br /&gt;
&lt;br /&gt;
On choisit &amp;lt;math&amp;gt;a_0&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; aléatoirement et on applique ceci pour un pas :&lt;br /&gt;
&lt;br /&gt;
Avec &lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression10.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d'un certain nombre d'itérations on trouve le couple &amp;lt;math&amp;gt;(a,b)&amp;lt;/math&amp;gt; qui minimise notre fonction coût.&lt;br /&gt;
&lt;br /&gt;
Note : Nous avons démontré la théorie de la régression linéaire affine mais on pourrait généraliser celle-ci pour un modèle polynomiale d’ordre n, la courbe de prédiction serait donc parabolique et il faudrait trouver le tuple &amp;lt;math&amp;gt;(a_1,a_2,...,a_n)&amp;lt;/math&amp;gt; qui minimise la fonction coût.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression logistique binaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo1.png|200px|thumb|right|Modèle régression logistique]]&lt;br /&gt;
&lt;br /&gt;
La régression logistique binaire est un algorithme de classification, contrairement à la régression linéaire qui est un algorithme de prédiction. De la même façon que la régression linéaire,  il s'agit de modéliser au mieux un modèle mathématique simple à des observations réelles nombreuses. Cette méthode se base sur de l’analyse mathématiques et statistique. Il faut donc associer à des “features” &amp;lt;math&amp;gt;(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; une variable Y valant 1 ou 0 (d’où le terme classification binaire).&lt;br /&gt;
&lt;br /&gt;
L’objectif de l’algorithme est donc de trouver la fonction F dépendant d’une loi de probabilité telle que :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo2.png]]&lt;br /&gt;
&lt;br /&gt;
avec S un certain seuil (fixé la plupart du temps à 0,5).&lt;br /&gt;
&lt;br /&gt;
===Modèle===&lt;br /&gt;
&lt;br /&gt;
Comme cette méthode repose principalement sur des statistiques, il est important d’adopter une notation explicite lors de l’explication théorique :&lt;br /&gt;
&lt;br /&gt;
* On notera Y la variable à prédire (qui vaudra 0 ou 1) et &amp;lt;math&amp;gt;X=(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; les variables permettant de prédire Y&lt;br /&gt;
* On travaillera dans un univers  de N échantillons (taille de la dataset)&lt;br /&gt;
* On notera &amp;lt;math&amp;gt;P(Y=1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;P(Y=0)&amp;lt;/math&amp;gt; les probabilités que Y valent respectivement 1 ou 0 &amp;lt;math&amp;gt;p(1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0)&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;p(X|1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(X|0)&amp;lt;/math&amp;gt; sont les distributions conditionnelles des caractéristiques X sachant la valeur prise par Y&lt;br /&gt;
* &amp;lt;math&amp;gt;p(1|X)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0|X)&amp;lt;/math&amp;gt; sont donc les probabilités d’obtenir la valeur de Y (1 ou 0) sachant les valeurs de X&lt;br /&gt;
&lt;br /&gt;
La régression logistique utilise l’hypothèse fondamentale (mesure de l’évidence) :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo3.png]]&lt;br /&gt;
&lt;br /&gt;
On en déduit donc (comme &amp;lt;math&amp;gt;p(0|X)=1-p(1|X))&amp;lt;/math&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo4.png]]&lt;br /&gt;
&lt;br /&gt;
Avec &amp;lt;math&amp;gt;(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; des variables à déterminer.&lt;br /&gt;
&lt;br /&gt;
''Note :'' ce modèle est appelé modèle LOGIT.&lt;br /&gt;
&lt;br /&gt;
===Estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
Contrairement à la régression linéaire affine, on ne peut pas utiliser la méthode des moindres carrés, on utilise alors la méthode de maximisation de la vraisemblance.&lt;br /&gt;
“La vraisemblance mesure une adéquation entre la distribution observée sur un échantillon aléatoire et une loi de probabilité supposée décrire une réalité sur la population dont l'échantillon est issu.” (source : [www.jybaudot.fr])&lt;br /&gt;
&lt;br /&gt;
Le calcul de la vraisemblance L dans un univers  de N échantillons est le suivant :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo5.png]]&lt;br /&gt;
&lt;br /&gt;
Plus la vraisemblance est élevée, alors plus la loi de probabilité est proche de la réalité. Le but est donc de maximiser cette valeur et de trouver les valeurs optimales de &amp;lt;math&amp;gt;A =(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; qui influent directement sur la loi de probabilité établie dans la partie modèle.&lt;br /&gt;
&lt;br /&gt;
===Algorithme d'optimisation===&lt;br /&gt;
&lt;br /&gt;
Afin de trouver la valeur optimale du vecteur A, nous utiliserons encore une fois la méthode de descente du gradient adaptée à notre cas.&lt;br /&gt;
&lt;br /&gt;
Celle-ci utilise la relation suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo6.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d’un certain nombre d’itérations, on trouvera la valeur optimale de A afin de maximiser la vraisemblance.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Mise en pratique''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Pour la mise en pratique, nous avons décidé d’appliquer les méthodes sur un dataset de prédiction de maintenance pour l’industrie, nous importons grâce à la librairie panda : &amp;lt;code&amp;gt; dataset = pd.read_csv('ai4i2020.csv') &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette dataset contient 14 colonnes de données, nous pouvons visualiser la proportion de données saines et non-saines par ce code seaborn : &amp;lt;code&amp;gt; sns.factorplot('Machine failure',data=dataset,kind='count') &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on traitera cette dataset pour la préparer sur l’intervention des modèles de machine learning, puis on appliquera ces méthodes.&lt;br /&gt;
&lt;br /&gt;
==Pré-traitement de la dataset==&lt;br /&gt;
&lt;br /&gt;
Avant d’appliquer les algorithme sur notre dataset, il faut la traiter, le traitement sera le même pour tous les algorithmes et suivra cet ordre :&lt;br /&gt;
* Traitement des valeurs manquantes&lt;br /&gt;
* Équilibrage des données&lt;br /&gt;
* Séparations des données en entrainement et test&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous devons regarder si notre base de données contient des valeurs manquante, pour cela nous implantons ce code : &lt;br /&gt;
&lt;br /&gt;
   import missingno as msno&lt;br /&gt;
   msno.matrix(dataset)&lt;br /&gt;
&lt;br /&gt;
Les lignes blanches dans le résultat correspond aux valeurs manquantes, ci-dessous nous voyons que nous avons aucune données manquantes dans la base que nous avons importer : [[Fichier:Miseenpratique.png]]&lt;br /&gt;
&lt;br /&gt;
Dans le cas, où nous avons des valeurs manquante, il y a plusieurs méthodes pour traiter les valeurs manquantes mais nous retenons 2 méthodes :&lt;br /&gt;
* Une méthode qui consiste à supprimer les lignes où des valeurs manquantes sont présentes : &amp;lt;code&amp;gt; data.dropna(inplace=True) &amp;lt;/code&amp;gt;&lt;br /&gt;
L’avantage de cette méthode est de créer un modèle robuste. L’inconvénient majeur est le fait qu’on peut perdre énormément de données, pour des données où les valeurs manquantes sont excessives, mieux vaut appliquer une autre méthode.&lt;br /&gt;
&lt;br /&gt;
* Une méthode qui consiste à remplacer les valeurs manquantes par la moyenne des données de la colonne : &amp;lt;code&amp;gt; data[0]=drop[0].replace(np.NaN,data[0].mean()) &amp;lt;/code&amp;gt; L’avantage de cette méthode permet d’éviter la suppression de lignes, ce qui permet de garder les autres données comparé à l’autre méthode. Cependant cette méthode n’est que applicable sur les données numériques&lt;br /&gt;
&lt;br /&gt;
Nous passons alors sur l'équilibrage des données. Avant d’appliquer la méthode SMOTE, nous devons mettre dans 2 variables, la target (y) et les features (X) :&lt;br /&gt;
&lt;br /&gt;
   X = dataset.drop(['Machine failure','UDI','Product ID','Type','TWF','HDF','PWF','OSF','RNF'],axis=1).values&lt;br /&gt;
   y = dataset['Machine failure']&lt;br /&gt;
&lt;br /&gt;
Notre target sera seulement ‘Machine failure’ et nos features seront : la température de l’air, la température du processus, le couple, et l’usure des outils.&lt;br /&gt;
&lt;br /&gt;
Durant notre projet , nous avons implémenté la technique SMOTE pour traiter les ensembles de données déséquilibrées.&lt;br /&gt;
Le principe de SMOTE est de générer de nouveaux échantillons en combinant les données de la classe minoritaire avec celles de leurs voisins proches. Techniquement, on peut décomposer SMOTE en 5 étapes :&lt;br /&gt;
* 1 - Choix d’un vecteur caractéristique de notre classe minoritaire que nous appellerons vc &lt;br /&gt;
* 2 - Sélection des k-voisins les plus proches (k=5 par défaut) et choix de l’un d’eux au hasard que l’on appellera pv &lt;br /&gt;
* 3 - Calcul de la différence pour chaque valeur caractéristique (feature value) i, vc[i]-pv[i] et multiplication de celle-ci par un nombre aléatoire entre [0,1]&lt;br /&gt;
* 4 - Ajout du résultat précédent à la valeur de la caractéristique i du vecteur vc afin d’obtenir un nouveau point (une nouvelle donnée) dans l’espace des caractéristiques &lt;br /&gt;
* 5 - Répétition de ces opérations pour chaque point de données de la classe minoritaire &lt;br /&gt;
Nous remarquons que cette technique marche après smote (50% données saines, 50% données non-saines)&lt;br /&gt;
&lt;br /&gt;
Code : &lt;br /&gt;
&lt;br /&gt;
   oversample = SMOTE()&lt;br /&gt;
   Xsmote, ysmote = oversample.fit_resample(X,y)&lt;br /&gt;
   Xsmote = pd.DataFrame(Xsmote)&lt;br /&gt;
   ysmote = pd.DataFrame(ysmote)&lt;br /&gt;
   X=Xsmote&lt;br /&gt;
   y=ysmote&lt;br /&gt;
&lt;br /&gt;
On remarque que la technique smote a ajouté 9322 lignes sur notre base, Maintenant que nous avons un équilibre entre les données ‘sains’ et ‘malsains’, nous pouvons voir la répartitions des points sur 2 axes :&lt;br /&gt;
&lt;br /&gt;
(image)&lt;br /&gt;
&lt;br /&gt;
Nous pouvons alors procéder à la séparation de nos données en données d'entraînement et de test&lt;br /&gt;
&lt;br /&gt;
Nous devons séparer en deux nos données pour pouvoir appliquer les algorithmes de machine learning, ainsi : &lt;br /&gt;
Les données d'entraînement serviront de repères pour l’algorithme&lt;br /&gt;
Les données de test seront entraînées par celle d’entrainement pour créer une prédiction&lt;br /&gt;
&lt;br /&gt;
Nous allons utiliser la fonction train_test_split de la librairie sklearn pour séparer nos données : &lt;br /&gt;
&lt;br /&gt;
   X_train, X_test, y_train, y_test = train_test_split(X,y, test_size = 0.2, random_state = 100)&lt;br /&gt;
&lt;br /&gt;
Ici dans les paramètres :&lt;br /&gt;
X  correspond aux features&lt;br /&gt;
y correspond à la target&lt;br /&gt;
test_size correspond au pourcentage de séparation (soit 0.2 = 20% test et 80% d'entraînement)&lt;br /&gt;
random_state permet d’initialiser le choix aléatoire pour avoir la même répartition à chaque exécution&lt;br /&gt;
&lt;br /&gt;
Maintenant nous pouvons appliquer les algorithme à notre modèle&lt;br /&gt;
&lt;br /&gt;
==Application des algorithmes==&lt;br /&gt;
&lt;br /&gt;
En général, nous allons appliquer les algorithme en suivant cet ordre : &lt;br /&gt;
* Importation de la méthode sur la librairie sklearn&lt;br /&gt;
* Entraînement des données&lt;br /&gt;
* Prédiction&lt;br /&gt;
* Méthodes d’évaluations&lt;br /&gt;
&lt;br /&gt;
===Régression linéaire===&lt;br /&gt;
&lt;br /&gt;
Nous allons commencer par le plus simple : la régression linéaire, nous commençons par importer l’algorithme à partir de la librairie sklearn : &amp;lt;code&amp;gt; from sklearn.linear_model import LinearRegression &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis nous appelons l’algorithme avec les paramètres de base, puis nous entraînons notre dataset : &lt;br /&gt;
   #Méthode de régréssion linéaire&lt;br /&gt;
   lr = LinearRegression()&lt;br /&gt;
   #Training&lt;br /&gt;
   lr.fit(X_train,y_train)&lt;br /&gt;
&lt;br /&gt;
Ensuite la prédiction : &lt;br /&gt;
   #Prediction&lt;br /&gt;
   y_pred = lr.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
Et enfin l'évaluation, nous avons vu 2 méthodes pour évaluer notre modèle : &lt;br /&gt;
* Afficher le score de prédiction&lt;br /&gt;
* Afficher la matrice de confusion, une matrice de taille 2x2 qui donne ces informations : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatrixConfusion.png]]&lt;br /&gt;
&lt;br /&gt;
Le score de prédiction (accuracy) est également calculé à partir de cette matrice&lt;br /&gt;
Pour la régression linéaire, nous allons qu’afficher le score de prédiction, car cet algorithme nous donne en retour des valeurs non-binaire, la construction d’une matrice de confusion et impossible.&lt;br /&gt;
&lt;br /&gt;
   #Evaluation&lt;br /&gt;
   print(lr.score(X_test,y_test))&lt;br /&gt;
&lt;br /&gt;
Nous obtenons ainsi un score de 0.48, un score qui est plus élevé sans la méthode SMOTE (0.14), sauf que cette méthode n’est pas la plus optimisée pour cette base de données, car nous avons en target des valeurs binaires. Il vaut mieux appliquer la méthode de régression logistique ou la méthode de Naives-Bayes.&lt;br /&gt;
&lt;br /&gt;
===Régression logistique===&lt;br /&gt;
&lt;br /&gt;
Dans le même modèle que la régression linéaire, nous procédons à l’import de la méthode, l’appel de la méthode, l'entraînement des données et de la prédiction :&lt;br /&gt;
&lt;br /&gt;
   from sklearn import linear_model&lt;br /&gt;
&lt;br /&gt;
   #Modèle régression logistique&lt;br /&gt;
   modele_regLog = linear_model.LogisticRegression() &lt;br /&gt;
   #random_state = 100, solver = 'liblinear', multi_class = 'auto'&lt;br /&gt;
&lt;br /&gt;
   #training&lt;br /&gt;
   modele_regLog.fit(X_train,y_train)&lt;br /&gt;
&lt;br /&gt;
   #prediction&lt;br /&gt;
   y_pred = modele_regLog.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
   #précision du modèle&lt;br /&gt;
   precision = modele_regLog.score(X_test,y_test)&lt;br /&gt;
   print(precision)&lt;br /&gt;
&lt;br /&gt;
Pour la régression logistique, nous allons afficher la matrice de confusion et le score :&lt;br /&gt;
&lt;br /&gt;
   from sklearn.metrics import plot_confusion_matrix&lt;br /&gt;
   plot_confusion_matrix(modele_regLog, X_test, y_test)  &lt;br /&gt;
   plt.show() &lt;br /&gt;
&lt;br /&gt;
(images)&lt;br /&gt;
&lt;br /&gt;
Nous obtenons un score de 0.82, contre 0.97 sans la méthode de SMOTE, ce qui est cohérent car le score obtenu sans SMOTE n’est pas précis car il y avait peu de données où la machine a planté. Avec SMOTE, nous obtenons certes un score moins élevé mais plus précis.&lt;br /&gt;
Grâce à la matrice de confusion nous pouvons voir que : &lt;br /&gt;
* Il y a 2396 fois où l’algorithme a prédit Machine failure = 0 et a eu raison&lt;br /&gt;
* Il y a 2377 fois où l’algorithme a prédit Machine failure = 1 et a eu raison&lt;br /&gt;
* Il y a 546 fois où l’algorithme a prédit Machine failure = 1 et a eu faux&lt;br /&gt;
* Il y a 478 fois où l’algorithme a prédit Machine failure = 0 et a eu faux&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 0px; padding: 20px; font-weight: bold; text-align: center; font-size: 80%; background: #61798F; vertical-align: top; width: 100%;&amp;quot;&amp;gt; '''PARTIE II (S8)''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Développement du projet''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Durant les deux premiers semestres de ce projet, nous avons découvert et étudié le Machine Learning, que ce soit la théorie de différents algorithmes connus ou l'application pratique à des datasets que nous pouvons récupérer sur Internet ou bien créer nous même.&lt;br /&gt;
&lt;br /&gt;
La création de notre dataset ayant été fastidieuse et peu concluante (voir résultats du semestre précédent), nous avons comme objectif pour ce semestre d'implémenter nos algorithmes (et principalement le réseau de neurones) à des machines dont nous avons accès à l'école.&lt;br /&gt;
&lt;br /&gt;
Après discussion avec notre tuteur de projet Monsieur Lakhal, nous avons décidé d'utiliser des Robotino plutôt que d'utiliser la chaîne de production présente à l'école car il existe des logiciels simples permettant d'effectuer des simulations de réseaux logistiques de Robotinos (Robotino View et Robotino Simulation) dont nous allons récupérer les données en temps réel, les traiter puis commander les différents Robotino à l'aide d’un algorithme de réseaux de neurones.&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce semestre est ainsi de réaliser le scénario d'un réseau logistique autonome (à l'image d'Amazon par exemple) composé de plusieurs Robotino effectuant chacun une tâche et d'y introduire des erreurs puis de les traiter grâce au Machine Learning afin de ne pas perturber la logistique et d’obtenir un maximum d’efficacité.&lt;br /&gt;
&lt;br /&gt;
Nous avons organisé ce projet en plusieurs étapes où chacun des membres a pu plus ou moins participé en fonction de ses capacités :&lt;br /&gt;
&lt;br /&gt;
Conception du Grafcet pour la commande des Robotino&lt;br /&gt;
&lt;br /&gt;
Récupération et traitement des données en temps réel&lt;br /&gt;
&lt;br /&gt;
Utilisation du Machine Learning afin de commander les Robotino&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous avons constitué 2 équipes : une équipe spécialisée dans la commande du Robotino constituée de Loïc et Aymen et l’autre dans le traitement des données avec le Machine Learning avec Antoine, Tom et Florian.&lt;br /&gt;
Nous avons ensuite organisé notre projet à l’aide du diagramme de Gantt ci-dessous.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:GanttMLP5.png]]&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Élaboration du scénario''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Traitement des erreurs''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
=Recherche bibliographique=&lt;br /&gt;
&lt;br /&gt;
* https://www.wikipedia.com&lt;br /&gt;
&lt;br /&gt;
* https://www.jybaudot.fr&lt;br /&gt;
&lt;br /&gt;
* https://datascientest.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.ipgirl.com&lt;br /&gt;
&lt;br /&gt;
* Cours de probabilités et statistiques de l’Université Jules Vernes&lt;br /&gt;
&lt;br /&gt;
* Chaine youtube Machine Learning : https://www.youtube.com/channel/UCmpptkXu8iIFe6kfDK5o7VQ&lt;br /&gt;
&lt;br /&gt;
* Machine Learning with scikit-learn Quick Start Guide écrit par Kevin Jolly&lt;br /&gt;
&lt;br /&gt;
* https://lucidar.me/&lt;br /&gt;
&lt;br /&gt;
* https://archive.ics.uci.edu/ml/datasets.php&lt;br /&gt;
&lt;br /&gt;
* https://www.kaggle.com/datasets&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com/&lt;br /&gt;
&lt;br /&gt;
* Machine Learning algorithms - Second Edition écrit par Giuseppe Bonaccorso&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com&lt;br /&gt;
&lt;br /&gt;
* https://towardsdatascience.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.learndatasci.com/&lt;br /&gt;
&lt;br /&gt;
==Rapports et présentation==&lt;br /&gt;
&lt;br /&gt;
===Librairies===&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1CQZ1s6fNY_6MsmbBa5TP1OzSedqFeaWI?usp=sharing/ Rapport Numpy]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1tdu_B2wRsUiqdnSeskQENdn_wX3pJMeT?usp=sharing/ Rapport Pandas]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1DPS4ZT91SIEhscwST8kfER7u21tKoM3a?usp=sharing/ Rapport Seaborn]&lt;br /&gt;
&lt;br /&gt;
===Rapports===&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/document/d/1yR0vLePV3hI1_HVtTZWwGIwy0Cb-oLOsOTK3Um5KAYE/edit?usp=sharing/ Rapport]&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/presentation/d/1Je_yF0dgc-s9gB7LLsfOg0b05xcwIFJbaqpVytxWv5A/edit?usp=sharing/ Présentation]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1y_NMo9XKJ0WzwE2zmcRblUyuIebwfoN8?usp=sharing/ Régression linéaire]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1bRyrnL1JM870cEcEvfGaS8ItrG16rchy?usp=sharing/ Google Colab]&lt;/div&gt;</summary>
		<author><name>Abrossas</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88064</id>
		<title>IMA3/IMA4 2020/2022 P5</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88064"/>
				<updated>2022-05-03T15:23:37Z</updated>
		
		<summary type="html">&lt;p&gt;Abrossas : /*  Développement du projet  */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 0px; padding: 20px; font-weight: bold; text-align: center; font-size: 80%; background: #61798F; vertical-align: top; width: 100%;&amp;quot;&amp;gt; '''PARTIE I (S6-S7)''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Introduction et cahier des charges''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce projet est la mise en place d’algorithmes de machine Learning afin de diagnostiquer l’état de machines industrielles. Nous travaillerons sur ce projet durant 2 semestres. &lt;br /&gt;
Durant le premier semestre, nous avions comme objectifs d’acquérir la maîtrise des différentes librairies primordiales pour traiter les données en machine Learning, ainsi que d’étudier et d’utiliser certains algorithmes basiques (régression linéaire, logistique, Bayes) sur des datasets que nous traiterons nous même. &lt;br /&gt;
Pour ce qui est du second semestre, notre objectif était de concrétiser les connaissances acquises durant le premier semestre. Nous avons donc essayé de créer notre propre dataset à l’aide des matériels mis à notre disposition, de la prétraiter et d’y appliquer différents algorithmes de Machine Learning en critiquant les résultats.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning pour la détection de défaut s'inscrit parfaitement dans le contexte scientifique actuel, notamment grâce à l’industrie 4.0.&lt;br /&gt;
En effet, cette nouvelle industrie fait apparaître des systèmes communicants (l’IOT : Internet Of Things) interconnectés les uns entre les autres. Ces différents systèmes peuvent êtres nécessaires les uns, les autres afin de réaliser une tâche complexe telle que l'usinage de pièces. Le système devient dès lors potentiellement extrêmement fragile aux pannes.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning a pour but de pouvoir détecter, et localiser les pannes, voir les futures pannes potentielles afin de pouvoir dans un premier temps prévenir un opérateur. Mais il peut aussi potentiellement permettre au système de continuer de tourner, en attendant un technicien. Le machine Learning peut donc aussi permettre à une chaîne de production de continuer de tourner par l’envoie d’un autre robot par exemple, le temps que la panne soit réparée.&lt;br /&gt;
&lt;br /&gt;
Dans le schéma ci-dessous nous avons un exemple de système de système.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Intro1.png|500px|thumb|center|Schéma d'un système de systèmes]]&lt;br /&gt;
&lt;br /&gt;
Il y a deux cas de figure:&lt;br /&gt;
* Un autre système peut être envoyé pour remplacer le système 4.&lt;br /&gt;
* Les systèmes 1 et 2 peuvent permettre à la chaîne de production de continuer de tourner&lt;br /&gt;
* La chaîne de production est hors service jusqu'à réparation.&lt;br /&gt;
&lt;br /&gt;
==Cahier de charges==&lt;br /&gt;
&lt;br /&gt;
'''Ressources disponibles :'''&lt;br /&gt;
&lt;br /&gt;
* Livres sur le machine learning &lt;br /&gt;
* Bases de données (afin d'appliquer divers algorithmes de machine learning) que nous prendrons sur ces sites : [https://www.kaggle.com/datasets] et [https://archive.ics.uci.edu/ml/datasets.php]&lt;br /&gt;
* Librairies Python (Scikit-learn, Pandas, Numpy, Seaborn, Matplotlib)&lt;br /&gt;
* Google Colab&lt;br /&gt;
* Matlab (version étudiante)&lt;br /&gt;
&lt;br /&gt;
'''Objectifs poursuivis :'''&lt;br /&gt;
&lt;br /&gt;
* Détecter les dysfonctionnements de systèmes mécatroniques (par exemple les robots Khepera, Robotino…), grâce au machine learning.&lt;br /&gt;
* Apprendre à implémenter différentes méthodes machine learning .&lt;br /&gt;
&lt;br /&gt;
'''Profil du public cible :'''&lt;br /&gt;
* Secteur mécatronique&lt;br /&gt;
* Entreprises disposant d'ingénieurs pour maintenir le système informatique opérationnel&lt;br /&gt;
* Entreprises utilisant des machines dans le secteur public.&lt;br /&gt;
&lt;br /&gt;
'''Analyse des besoins :'''&lt;br /&gt;
* L’industrie a de plus en plus besoin du machine learning pour détecter les erreurs des systèmes. En effet, cette technologie devient indispensable pour les industriels, notamment afin d'accroître la productivité et l’efficacité des systèmes industriels.&lt;br /&gt;
* Le programme peut ne pas être aussi rapide et optimisé en espace mémoire que d'autres programmes, nous visons l’efficacité de notre algorithme plutôt que la rapidité.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Librairies''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
En Machine Learning, il est très important, voire primordial, de savoir manipuler les différentes librairies mises à notre disposition afin de visualiser, traiter nos différentes dataset ou même appliquer les différents algorithmes de machine Learning.&lt;br /&gt;
Durant les premières semaines de notre projet, nous avons donc appris à utiliser ces différentes librairies nécessaires pour le machine Learning, telles que Numpy, Seaborn, Panda, Matplotlib, Scikit-learn... Nous allons dans un premier temps nous intéresser à l'importation des différentes bibliothèques puis résumer les commandes importantes de ces différentes librairies.&lt;br /&gt;
&lt;br /&gt;
Ces différentes librairies ne sont pas incluses de base dans Python, il est donc nécessaire de les ajouter à Python puis à notre programme.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc choisi d'utiliser google colab car ces librairies y sont déjà installées (et aussi pratique pour travailler à plusieurs sur un même code).&lt;br /&gt;
Puis nous devons importer ces bibliothèques au début de notre programme.&lt;br /&gt;
&lt;br /&gt;
Attention : Plusieurs bibliothèques peuvent avoir la même commande mais avec des significations différentes, comme par exemple la commande randint du module numpy et celle du module random et cela peut conduire à des erreurs. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de pallier à ces problèmes nous apporterons nos librairie au début de nos programmes comme suit :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:librairies1.png]]&lt;br /&gt;
&lt;br /&gt;
Ici le np permet de dire que lorsque nous utilisons np.array alors nous utilisons la commande array () contenu dans la bibliothèque Numpy.&lt;br /&gt;
&lt;br /&gt;
Ceci nous permettra d’utiliser en simultané différentes librairies, toutes les bibliothèques seront importées selon ce schéma.&lt;br /&gt;
Nous allons par la suite, nous intéresser à différentes commandes incluses dans ces librairies.&lt;br /&gt;
&lt;br /&gt;
==Numpy==&lt;br /&gt;
&lt;br /&gt;
Numpy est une bibliothèque dédiée aux calculs mathématiques et à la gestion des listes (telles que des matrices).&lt;br /&gt;
Matplotlib, quant à lui, est dédié aux affichages graphiques de données.&lt;br /&gt;
Nous allons dans cette partie nous intéresser aux commandes principales de ces deux bibliothèques de python.&lt;br /&gt;
&lt;br /&gt;
Sous numpy, les tableaux sont des types array, ils définissent l'équivalent des tableaux statiques en langage C. La taille d’un tableau numpy ne peut donc pas être changée après leur création. &lt;br /&gt;
&lt;br /&gt;
Néanmoins grâce a Numpy nous pouvons simplement effectuer des tâches sur les tableaux comme en extraire un sous tableaux, et d’effectuer simplement les produits entre matrice, vecteur.&lt;br /&gt;
&lt;br /&gt;
Dans notre projet, nous utiliserons plus courament les fonctions : &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.shape&amp;lt;/FONT&amp;gt; permet d’obtenir la taille de la matrice sous forme d’un tuple, suffit de choisir le bon numéro&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.zeros&amp;lt;/FONT&amp;gt; permet de créer une ligne de x zéro(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.ones&amp;lt;/FONT&amp;gt; permet de créer une ligne de x un(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.vstack&amp;lt;/FONT&amp;gt; permet de rajouter des lignes dans une matrice déjà créer en paramètre&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.transpose&amp;lt;/FONT&amp;gt; permet de transposer une matrice en paramètre&lt;br /&gt;
&lt;br /&gt;
==Seaborn==&lt;br /&gt;
&lt;br /&gt;
Seaborn est une bibliothèque de visualisation de données Python basée sur matplotlib. Il fournit une interface de haut niveau pour dessiner des graphiques statistiques attrayants et informatifs.&lt;br /&gt;
&lt;br /&gt;
'''Différences entre Matplotlib et Seaborn'''&lt;br /&gt;
&lt;br /&gt;
Les défauts de Matplotlib qui ne parlent généralement pas aux utilisateurs sont les couleurs, les marques de tiques sur les axes supérieur et droit, le style,...&lt;br /&gt;
Les exemples ci-dessus rendent également une autre frustration des utilisateurs plus apparente: le fait que travailler avec DataFrames ne va pas aussi bien avec Matplotlib, ce qui peut être ennuyeux si vous faites une analyse exploratoire avec Pandas. Et c’est exactement ce que Seaborn adresse : les fonctions de traçage fonctionnent sur dataframes et tableaux qui contiennent tout un ensemble de données.&lt;br /&gt;
[[Fichier:seaborn1.png|300px|thumb|right|Résultat du code python ci gauche]]&lt;br /&gt;
&lt;br /&gt;
   # Import necessary libraries&lt;br /&gt;
   import seaborn as sns&lt;br /&gt;
   import matplotlib.pyplot as plt&lt;br /&gt;
   &lt;br /&gt;
   # Load iris data&lt;br /&gt;
   iris = sns.load_dataset(&amp;quot;iris&amp;quot;) #DATASET ALREADY EXISTING&lt;br /&gt;
   &lt;br /&gt;
   # Construct iris plot&lt;br /&gt;
   sns.swarmplot(x=&amp;quot;species&amp;quot;, y=&amp;quot;petal_length&amp;quot;, data=iris)&lt;br /&gt;
   &lt;br /&gt;
   # Show plot&lt;br /&gt;
   plt.show()&lt;br /&gt;
&lt;br /&gt;
==Pandas==&lt;br /&gt;
&lt;br /&gt;
Pandas est une API d'analyse de données orientée colonnes. C'est un excellent outil pour manipuler et analyser des données d'entrée. Beaucoup de frameworks d'apprentissage automatique acceptent les structures de données Pandas en entrée.&lt;br /&gt;
&lt;br /&gt;
Comme évoqué précédemment, Pandas travaille avec des matrices colonnes communément appelées ‘Series’ mais aussi et surtout avec des tableaux de données appelés ‘DataFrames’.&lt;br /&gt;
Une Series est tout simplement une colonne et une DataFrame est un tableau à plusieurs dimensions constitué de Series.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Panda.JPG]]&lt;br /&gt;
&lt;br /&gt;
A l'aide de Pandas, on peut ainsi créer, importer, lire et manipuler des bases de données facilement.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Théories des algorithmes étudiés''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Il y a différents types d’algorithmes en machine learning, pour notre sujet qui consiste à classer des machines en défectueuse ou fonctionnelles (1 ou 0), nous aurons surtout besoin d’algorithmes de classification binaire. De manière générale, la conception de la plupart des algorithmes fonctionnent de cette manière : &lt;br /&gt;
&lt;br /&gt;
* Élaborer un modèle &lt;br /&gt;
* Établir une fonction coût pour celui-ci correspondant à l’erreur entre le modèle et les données réelles&lt;br /&gt;
* Trouver un algorithme de minimisation de cette fonction coût&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression linéaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression1.png|200px|thumb|right|Exemple de régression linéaire]]&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est un algorithme de prédiction et non un algorithme de classification, nous aurons surtout besoin de ce deuxième type d’algorithme pour notre projet mais nous tenons à présenter cet algorithme qui est le plus basique en machine learning et un bon début pour une formation pédagogique.&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est une méthode de modélisation qui cherche à établir une relation linéaire entre une ou des &amp;quot;features&amp;quot; (variables explicatives) et une &amp;quot;target&amp;quot; (variable expliquée qu'on cherche à prévoir à partir des variables explicatives). En machine learning, la régression linéaire est un modèle d'apprentissage supervisé, c'est-à-dire qu'on apprend à l'algorithme de prédiction à partir d'exemples dont on dispose dans une dataset. Nous nous intéresserons à la régression affine qui est la plus simple pour débuter.&lt;br /&gt;
&lt;br /&gt;
===Modèle et estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
La régression affine consiste donc à trouver un modèle de type&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt;y=ax+b&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
avec x une &amp;quot;feature&amp;quot;, y la target et avec a et b des paramètres qu'il nous faudra déterminer. Le but est donc de trouver les paramètres a et b tels que la distance entre chaque point du nuage et la droite du modèle soit la plus petite possible.&lt;br /&gt;
Mathématiquement, il suffit de résoudre cette formule:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression2.png|200px|thumb|right|Méthode des moindres carrés illustrée]]&lt;br /&gt;
[[Fichier:regression3.png]]&lt;br /&gt;
&lt;br /&gt;
On utilise donc la méthode des moindres carrés pour mesurer l'erreur entre le modèle de prédiction et les données et ainsi fabriquer notre fonction coût :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression4.png]]&lt;br /&gt;
&lt;br /&gt;
avec m le nombre de points du nuage.&lt;br /&gt;
&lt;br /&gt;
L'objectif de l'algorithme est donc de trouver les paramètres optimaux qui minimisent cette fonction J.&lt;br /&gt;
En machine learning, une des méthodes les plus populaires pour faire ceci est la descente de gradient, car c'est une méthode adaptée quand on fait du traitement de grosses dataset (&amp;quot;faible&amp;quot; temps de calcul). En effet, la fonction coût J est une parabole admettant un unique minimum dépendant des paramètres a et b. La descente de gradient consiste à chercher le point de celle-ci où la dérivée est nulle (donc le minimum)&lt;br /&gt;
&lt;br /&gt;
===Méthode de la descente du gradient===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression6.png|200px|thumb|right|Méthode gradient]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression7.png|200px|thumb|right|Généralisation gradient fct parabolique]]&lt;br /&gt;
&lt;br /&gt;
Soit une fonction parabolique ne dépendant que de x. On cherche à trouver le minimum de cette fonction en utilisant la méthode de la descente du gradient&lt;br /&gt;
Pour cela on choisit un point aléatoirement &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;et on va descendre à partir de celui-ci jusqu'à atteindre un minimum en utilisant&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression5.png]]&lt;br /&gt;
&lt;br /&gt;
avec un paramètre  qui influencera la taille du pas de la descente.&lt;br /&gt;
&lt;br /&gt;
Il faut faire attention à ne pas prendre un pas trop grand, ni trop petit, pour éviter de &amp;quot;tourner&amp;quot; autour du minimum ou de prendre trop de temps pour l'atteindre.&lt;br /&gt;
Note : On peut généraliser cela pour une fonction parabolique à n paramètres qui aurait donc une forme de bol.&lt;br /&gt;
&lt;br /&gt;
===Application sur notre fonction coût===&lt;br /&gt;
&lt;br /&gt;
Notre fonction coût dépend des 2 paramètres a et b :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression8.png]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression9.png]]&lt;br /&gt;
&lt;br /&gt;
On choisit &amp;lt;math&amp;gt;a_0&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; aléatoirement et on applique ceci pour un pas :&lt;br /&gt;
&lt;br /&gt;
Avec &lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression10.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d'un certain nombre d'itérations on trouve le couple &amp;lt;math&amp;gt;(a,b)&amp;lt;/math&amp;gt; qui minimise notre fonction coût.&lt;br /&gt;
&lt;br /&gt;
Note : Nous avons démontré la théorie de la régression linéaire affine mais on pourrait généraliser celle-ci pour un modèle polynomiale d’ordre n, la courbe de prédiction serait donc parabolique et il faudrait trouver le tuple &amp;lt;math&amp;gt;(a_1,a_2,...,a_n)&amp;lt;/math&amp;gt; qui minimise la fonction coût.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression logistique binaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo1.png|200px|thumb|right|Modèle régression logistique]]&lt;br /&gt;
&lt;br /&gt;
La régression logistique binaire est un algorithme de classification, contrairement à la régression linéaire qui est un algorithme de prédiction. De la même façon que la régression linéaire,  il s'agit de modéliser au mieux un modèle mathématique simple à des observations réelles nombreuses. Cette méthode se base sur de l’analyse mathématiques et statistique. Il faut donc associer à des “features” &amp;lt;math&amp;gt;(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; une variable Y valant 1 ou 0 (d’où le terme classification binaire).&lt;br /&gt;
&lt;br /&gt;
L’objectif de l’algorithme est donc de trouver la fonction F dépendant d’une loi de probabilité telle que :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo2.png]]&lt;br /&gt;
&lt;br /&gt;
avec S un certain seuil (fixé la plupart du temps à 0,5).&lt;br /&gt;
&lt;br /&gt;
===Modèle===&lt;br /&gt;
&lt;br /&gt;
Comme cette méthode repose principalement sur des statistiques, il est important d’adopter une notation explicite lors de l’explication théorique :&lt;br /&gt;
&lt;br /&gt;
* On notera Y la variable à prédire (qui vaudra 0 ou 1) et &amp;lt;math&amp;gt;X=(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; les variables permettant de prédire Y&lt;br /&gt;
* On travaillera dans un univers  de N échantillons (taille de la dataset)&lt;br /&gt;
* On notera &amp;lt;math&amp;gt;P(Y=1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;P(Y=0)&amp;lt;/math&amp;gt; les probabilités que Y valent respectivement 1 ou 0 &amp;lt;math&amp;gt;p(1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0)&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;p(X|1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(X|0)&amp;lt;/math&amp;gt; sont les distributions conditionnelles des caractéristiques X sachant la valeur prise par Y&lt;br /&gt;
* &amp;lt;math&amp;gt;p(1|X)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0|X)&amp;lt;/math&amp;gt; sont donc les probabilités d’obtenir la valeur de Y (1 ou 0) sachant les valeurs de X&lt;br /&gt;
&lt;br /&gt;
La régression logistique utilise l’hypothèse fondamentale (mesure de l’évidence) :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo3.png]]&lt;br /&gt;
&lt;br /&gt;
On en déduit donc (comme &amp;lt;math&amp;gt;p(0|X)=1-p(1|X))&amp;lt;/math&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo4.png]]&lt;br /&gt;
&lt;br /&gt;
Avec &amp;lt;math&amp;gt;(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; des variables à déterminer.&lt;br /&gt;
&lt;br /&gt;
''Note :'' ce modèle est appelé modèle LOGIT.&lt;br /&gt;
&lt;br /&gt;
===Estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
Contrairement à la régression linéaire affine, on ne peut pas utiliser la méthode des moindres carrés, on utilise alors la méthode de maximisation de la vraisemblance.&lt;br /&gt;
“La vraisemblance mesure une adéquation entre la distribution observée sur un échantillon aléatoire et une loi de probabilité supposée décrire une réalité sur la population dont l'échantillon est issu.” (source : [www.jybaudot.fr])&lt;br /&gt;
&lt;br /&gt;
Le calcul de la vraisemblance L dans un univers  de N échantillons est le suivant :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo5.png]]&lt;br /&gt;
&lt;br /&gt;
Plus la vraisemblance est élevée, alors plus la loi de probabilité est proche de la réalité. Le but est donc de maximiser cette valeur et de trouver les valeurs optimales de &amp;lt;math&amp;gt;A =(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; qui influent directement sur la loi de probabilité établie dans la partie modèle.&lt;br /&gt;
&lt;br /&gt;
===Algorithme d'optimisation===&lt;br /&gt;
&lt;br /&gt;
Afin de trouver la valeur optimale du vecteur A, nous utiliserons encore une fois la méthode de descente du gradient adaptée à notre cas.&lt;br /&gt;
&lt;br /&gt;
Celle-ci utilise la relation suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo6.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d’un certain nombre d’itérations, on trouvera la valeur optimale de A afin de maximiser la vraisemblance.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Mise en pratique''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Pour la mise en pratique, nous avons décidé d’appliquer les méthodes sur un dataset de prédiction de maintenance pour l’industrie, nous importons grâce à la librairie panda : &amp;lt;code&amp;gt; dataset = pd.read_csv('ai4i2020.csv') &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette dataset contient 14 colonnes de données, nous pouvons visualiser la proportion de données saines et non-saines par ce code seaborn : &amp;lt;code&amp;gt; sns.factorplot('Machine failure',data=dataset,kind='count') &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on traitera cette dataset pour la préparer sur l’intervention des modèles de machine learning, puis on appliquera ces méthodes.&lt;br /&gt;
&lt;br /&gt;
==Pré-traitement de la dataset==&lt;br /&gt;
&lt;br /&gt;
Avant d’appliquer les algorithme sur notre dataset, il faut la traiter, le traitement sera le même pour tous les algorithmes et suivra cet ordre :&lt;br /&gt;
* Traitement des valeurs manquantes&lt;br /&gt;
* Équilibrage des données&lt;br /&gt;
* Séparations des données en entrainement et test&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous devons regarder si notre base de données contient des valeurs manquante, pour cela nous implantons ce code : &lt;br /&gt;
&lt;br /&gt;
   import missingno as msno&lt;br /&gt;
   msno.matrix(dataset)&lt;br /&gt;
&lt;br /&gt;
Les lignes blanches dans le résultat correspond aux valeurs manquantes, ci-dessous nous voyons que nous avons aucune données manquantes dans la base que nous avons importer : [[Fichier:Miseenpratique.png]]&lt;br /&gt;
&lt;br /&gt;
Dans le cas, où nous avons des valeurs manquante, il y a plusieurs méthodes pour traiter les valeurs manquantes mais nous retenons 2 méthodes :&lt;br /&gt;
* Une méthode qui consiste à supprimer les lignes où des valeurs manquantes sont présentes : &amp;lt;code&amp;gt; data.dropna(inplace=True) &amp;lt;/code&amp;gt;&lt;br /&gt;
L’avantage de cette méthode est de créer un modèle robuste. L’inconvénient majeur est le fait qu’on peut perdre énormément de données, pour des données où les valeurs manquantes sont excessives, mieux vaut appliquer une autre méthode.&lt;br /&gt;
&lt;br /&gt;
* Une méthode qui consiste à remplacer les valeurs manquantes par la moyenne des données de la colonne : &amp;lt;code&amp;gt; data[0]=drop[0].replace(np.NaN,data[0].mean()) &amp;lt;/code&amp;gt; L’avantage de cette méthode permet d’éviter la suppression de lignes, ce qui permet de garder les autres données comparé à l’autre méthode. Cependant cette méthode n’est que applicable sur les données numériques&lt;br /&gt;
&lt;br /&gt;
Nous passons alors sur l'équilibrage des données. Avant d’appliquer la méthode SMOTE, nous devons mettre dans 2 variables, la target (y) et les features (X) :&lt;br /&gt;
&lt;br /&gt;
   X = dataset.drop(['Machine failure','UDI','Product ID','Type','TWF','HDF','PWF','OSF','RNF'],axis=1).values&lt;br /&gt;
   y = dataset['Machine failure']&lt;br /&gt;
&lt;br /&gt;
Notre target sera seulement ‘Machine failure’ et nos features seront : la température de l’air, la température du processus, le couple, et l’usure des outils.&lt;br /&gt;
&lt;br /&gt;
Durant notre projet , nous avons implémenté la technique SMOTE pour traiter les ensembles de données déséquilibrées.&lt;br /&gt;
Le principe de SMOTE est de générer de nouveaux échantillons en combinant les données de la classe minoritaire avec celles de leurs voisins proches. Techniquement, on peut décomposer SMOTE en 5 étapes :&lt;br /&gt;
* 1 - Choix d’un vecteur caractéristique de notre classe minoritaire que nous appellerons vc &lt;br /&gt;
* 2 - Sélection des k-voisins les plus proches (k=5 par défaut) et choix de l’un d’eux au hasard que l’on appellera pv &lt;br /&gt;
* 3 - Calcul de la différence pour chaque valeur caractéristique (feature value) i, vc[i]-pv[i] et multiplication de celle-ci par un nombre aléatoire entre [0,1]&lt;br /&gt;
* 4 - Ajout du résultat précédent à la valeur de la caractéristique i du vecteur vc afin d’obtenir un nouveau point (une nouvelle donnée) dans l’espace des caractéristiques &lt;br /&gt;
* 5 - Répétition de ces opérations pour chaque point de données de la classe minoritaire &lt;br /&gt;
Nous remarquons que cette technique marche après smote (50% données saines, 50% données non-saines)&lt;br /&gt;
&lt;br /&gt;
Code : &lt;br /&gt;
&lt;br /&gt;
   oversample = SMOTE()&lt;br /&gt;
   Xsmote, ysmote = oversample.fit_resample(X,y)&lt;br /&gt;
   Xsmote = pd.DataFrame(Xsmote)&lt;br /&gt;
   ysmote = pd.DataFrame(ysmote)&lt;br /&gt;
   X=Xsmote&lt;br /&gt;
   y=ysmote&lt;br /&gt;
&lt;br /&gt;
On remarque que la technique smote a ajouté 9322 lignes sur notre base, Maintenant que nous avons un équilibre entre les données ‘sains’ et ‘malsains’, nous pouvons voir la répartitions des points sur 2 axes :&lt;br /&gt;
&lt;br /&gt;
(image)&lt;br /&gt;
&lt;br /&gt;
Nous pouvons alors procéder à la séparation de nos données en données d'entraînement et de test&lt;br /&gt;
&lt;br /&gt;
Nous devons séparer en deux nos données pour pouvoir appliquer les algorithmes de machine learning, ainsi : &lt;br /&gt;
Les données d'entraînement serviront de repères pour l’algorithme&lt;br /&gt;
Les données de test seront entraînées par celle d’entrainement pour créer une prédiction&lt;br /&gt;
&lt;br /&gt;
Nous allons utiliser la fonction train_test_split de la librairie sklearn pour séparer nos données : &lt;br /&gt;
&lt;br /&gt;
   X_train, X_test, y_train, y_test = train_test_split(X,y, test_size = 0.2, random_state = 100)&lt;br /&gt;
&lt;br /&gt;
Ici dans les paramètres :&lt;br /&gt;
X  correspond aux features&lt;br /&gt;
y correspond à la target&lt;br /&gt;
test_size correspond au pourcentage de séparation (soit 0.2 = 20% test et 80% d'entraînement)&lt;br /&gt;
random_state permet d’initialiser le choix aléatoire pour avoir la même répartition à chaque exécution&lt;br /&gt;
&lt;br /&gt;
Maintenant nous pouvons appliquer les algorithme à notre modèle&lt;br /&gt;
&lt;br /&gt;
==Application des algorithmes==&lt;br /&gt;
&lt;br /&gt;
En général, nous allons appliquer les algorithme en suivant cet ordre : &lt;br /&gt;
* Importation de la méthode sur la librairie sklearn&lt;br /&gt;
* Entraînement des données&lt;br /&gt;
* Prédiction&lt;br /&gt;
* Méthodes d’évaluations&lt;br /&gt;
&lt;br /&gt;
===Régression linéaire===&lt;br /&gt;
&lt;br /&gt;
Nous allons commencer par le plus simple : la régression linéaire, nous commençons par importer l’algorithme à partir de la librairie sklearn : &amp;lt;code&amp;gt; from sklearn.linear_model import LinearRegression &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis nous appelons l’algorithme avec les paramètres de base, puis nous entraînons notre dataset : &lt;br /&gt;
   #Méthode de régréssion linéaire&lt;br /&gt;
   lr = LinearRegression()&lt;br /&gt;
   #Training&lt;br /&gt;
   lr.fit(X_train,y_train)&lt;br /&gt;
&lt;br /&gt;
Ensuite la prédiction : &lt;br /&gt;
   #Prediction&lt;br /&gt;
   y_pred = lr.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
Et enfin l'évaluation, nous avons vu 2 méthodes pour évaluer notre modèle : &lt;br /&gt;
* Afficher le score de prédiction&lt;br /&gt;
* Afficher la matrice de confusion, une matrice de taille 2x2 qui donne ces informations : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatrixConfusion.png]]&lt;br /&gt;
&lt;br /&gt;
Le score de prédiction (accuracy) est également calculé à partir de cette matrice&lt;br /&gt;
Pour la régression linéaire, nous allons qu’afficher le score de prédiction, car cet algorithme nous donne en retour des valeurs non-binaire, la construction d’une matrice de confusion et impossible.&lt;br /&gt;
&lt;br /&gt;
   #Evaluation&lt;br /&gt;
   print(lr.score(X_test,y_test))&lt;br /&gt;
&lt;br /&gt;
Nous obtenons ainsi un score de 0.48, un score qui est plus élevé sans la méthode SMOTE (0.14), sauf que cette méthode n’est pas la plus optimisée pour cette base de données, car nous avons en target des valeurs binaires. Il vaut mieux appliquer la méthode de régression logistique ou la méthode de Naives-Bayes.&lt;br /&gt;
&lt;br /&gt;
===Régression logistique===&lt;br /&gt;
&lt;br /&gt;
Dans le même modèle que la régression linéaire, nous procédons à l’import de la méthode, l’appel de la méthode, l'entraînement des données et de la prédiction :&lt;br /&gt;
&lt;br /&gt;
   from sklearn import linear_model&lt;br /&gt;
&lt;br /&gt;
   #Modèle régression logistique&lt;br /&gt;
   modele_regLog = linear_model.LogisticRegression() &lt;br /&gt;
   #random_state = 100, solver = 'liblinear', multi_class = 'auto'&lt;br /&gt;
&lt;br /&gt;
   #training&lt;br /&gt;
   modele_regLog.fit(X_train,y_train)&lt;br /&gt;
&lt;br /&gt;
   #prediction&lt;br /&gt;
   y_pred = modele_regLog.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
   #précision du modèle&lt;br /&gt;
   precision = modele_regLog.score(X_test,y_test)&lt;br /&gt;
   print(precision)&lt;br /&gt;
&lt;br /&gt;
Pour la régression logistique, nous allons afficher la matrice de confusion et le score :&lt;br /&gt;
&lt;br /&gt;
   from sklearn.metrics import plot_confusion_matrix&lt;br /&gt;
   plot_confusion_matrix(modele_regLog, X_test, y_test)  &lt;br /&gt;
   plt.show() &lt;br /&gt;
&lt;br /&gt;
(images)&lt;br /&gt;
&lt;br /&gt;
Nous obtenons un score de 0.82, contre 0.97 sans la méthode de SMOTE, ce qui est cohérent car le score obtenu sans SMOTE n’est pas précis car il y avait peu de données où la machine a planté. Avec SMOTE, nous obtenons certes un score moins élevé mais plus précis.&lt;br /&gt;
Grâce à la matrice de confusion nous pouvons voir que : &lt;br /&gt;
* Il y a 2396 fois où l’algorithme a prédit Machine failure = 0 et a eu raison&lt;br /&gt;
* Il y a 2377 fois où l’algorithme a prédit Machine failure = 1 et a eu raison&lt;br /&gt;
* Il y a 546 fois où l’algorithme a prédit Machine failure = 1 et a eu faux&lt;br /&gt;
* Il y a 478 fois où l’algorithme a prédit Machine failure = 0 et a eu faux&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 0px; padding: 20px; font-weight: bold; text-align: center; font-size: 80%; background: #61798F; vertical-align: top; width: 100%;&amp;quot;&amp;gt; '''PARTIE II (S8)''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Développement du projet''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Durant les deux premiers semestres de ce projet, nous avons découvert et étudié le Machine Learning, que ce soit la théorie de différents algorithmes connus ou l'application pratique à des datasets que nous pouvons récupérer sur Internet ou bien créer nous même.&lt;br /&gt;
&lt;br /&gt;
La création de notre dataset ayant été fastidieuse et peu concluante (voir résultats du semestre précédent), nous avons comme objectif pour ce semestre d'implémenter nos algorithmes (et principalement le réseau de neurones) à des machines dont nous avons accès à l'école.&lt;br /&gt;
&lt;br /&gt;
Après discussion avec notre tuteur de projet Monsieur Lakhal, nous avons décidé d'utiliser des Robotino plutôt que d'utiliser la chaîne de production présente à l'école car il existe des logiciels simples permettant d'effectuer des simulations de réseaux logistiques de Robotinos (Robotino View et Robotino Simulation) dont nous allons récupérer les données en temps réel, les traiter puis commander les différents Robotino à l'aide d’un algorithme de réseaux de neurones.&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce semestre est ainsi de réaliser le scénario d'un réseau logistique autonome (à l'image d'Amazon par exemple) composé de plusieurs Robotino effectuant chacun une tâche et d'y introduire des erreurs puis de les traiter grâce au Machine Learning afin de ne pas perturber la logistique et d’obtenir un maximum d’efficacité.&lt;br /&gt;
&lt;br /&gt;
Nous avons organisé ce projet en plusieurs étapes où chacun des membres a pu plus ou moins participé en fonction de ses capacités :&lt;br /&gt;
&lt;br /&gt;
Conception du Grafcet pour la commande des Robotino&lt;br /&gt;
&lt;br /&gt;
Récupération et traitement des données en temps réel&lt;br /&gt;
&lt;br /&gt;
Utilisation du Machine Learning afin de commander les Robotino&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous avons constitué 2 équipes : une équipe spécialisée dans la commande du Robotino constituée de Loïc et Aymen et l’autre dans le traitement des données avec le Machine Learning avec Antoine, Tom et Florian.&lt;br /&gt;
Nous avons ensuite organisé notre projet à l’aide du diagramme de Gantt ci-dessous.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Gantt.png]]&lt;br /&gt;
== [[Fichier:Diagramme de Gantt]] ==&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Élaboration du scénario''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Traitement des erreurs''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
=Recherche bibliographique=&lt;br /&gt;
&lt;br /&gt;
* https://www.wikipedia.com&lt;br /&gt;
&lt;br /&gt;
* https://www.jybaudot.fr&lt;br /&gt;
&lt;br /&gt;
* https://datascientest.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.ipgirl.com&lt;br /&gt;
&lt;br /&gt;
* Cours de probabilités et statistiques de l’Université Jules Vernes&lt;br /&gt;
&lt;br /&gt;
* Chaine youtube Machine Learning : https://www.youtube.com/channel/UCmpptkXu8iIFe6kfDK5o7VQ&lt;br /&gt;
&lt;br /&gt;
* Machine Learning with scikit-learn Quick Start Guide écrit par Kevin Jolly&lt;br /&gt;
&lt;br /&gt;
* https://lucidar.me/&lt;br /&gt;
&lt;br /&gt;
* https://archive.ics.uci.edu/ml/datasets.php&lt;br /&gt;
&lt;br /&gt;
* https://www.kaggle.com/datasets&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com/&lt;br /&gt;
&lt;br /&gt;
* Machine Learning algorithms - Second Edition écrit par Giuseppe Bonaccorso&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com&lt;br /&gt;
&lt;br /&gt;
* https://towardsdatascience.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.learndatasci.com/&lt;br /&gt;
&lt;br /&gt;
==Rapports et présentation==&lt;br /&gt;
&lt;br /&gt;
===Librairies===&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1CQZ1s6fNY_6MsmbBa5TP1OzSedqFeaWI?usp=sharing/ Rapport Numpy]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1tdu_B2wRsUiqdnSeskQENdn_wX3pJMeT?usp=sharing/ Rapport Pandas]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1DPS4ZT91SIEhscwST8kfER7u21tKoM3a?usp=sharing/ Rapport Seaborn]&lt;br /&gt;
&lt;br /&gt;
===Rapports===&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/document/d/1yR0vLePV3hI1_HVtTZWwGIwy0Cb-oLOsOTK3Um5KAYE/edit?usp=sharing/ Rapport]&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/presentation/d/1Je_yF0dgc-s9gB7LLsfOg0b05xcwIFJbaqpVytxWv5A/edit?usp=sharing/ Présentation]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1y_NMo9XKJ0WzwE2zmcRblUyuIebwfoN8?usp=sharing/ Régression linéaire]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1bRyrnL1JM870cEcEvfGaS8ItrG16rchy?usp=sharing/ Google Colab]&lt;/div&gt;</summary>
		<author><name>Abrossas</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88063</id>
		<title>IMA3/IMA4 2020/2022 P5</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88063"/>
				<updated>2022-05-03T15:21:35Z</updated>
		
		<summary type="html">&lt;p&gt;Abrossas : /*  Développement du projet  */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 0px; padding: 20px; font-weight: bold; text-align: center; font-size: 80%; background: #61798F; vertical-align: top; width: 100%;&amp;quot;&amp;gt; '''PARTIE I (S6-S7)''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Introduction et cahier des charges''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce projet est la mise en place d’algorithmes de machine Learning afin de diagnostiquer l’état de machines industrielles. Nous travaillerons sur ce projet durant 2 semestres. &lt;br /&gt;
Durant le premier semestre, nous avions comme objectifs d’acquérir la maîtrise des différentes librairies primordiales pour traiter les données en machine Learning, ainsi que d’étudier et d’utiliser certains algorithmes basiques (régression linéaire, logistique, Bayes) sur des datasets que nous traiterons nous même. &lt;br /&gt;
Pour ce qui est du second semestre, notre objectif était de concrétiser les connaissances acquises durant le premier semestre. Nous avons donc essayé de créer notre propre dataset à l’aide des matériels mis à notre disposition, de la prétraiter et d’y appliquer différents algorithmes de Machine Learning en critiquant les résultats.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning pour la détection de défaut s'inscrit parfaitement dans le contexte scientifique actuel, notamment grâce à l’industrie 4.0.&lt;br /&gt;
En effet, cette nouvelle industrie fait apparaître des systèmes communicants (l’IOT : Internet Of Things) interconnectés les uns entre les autres. Ces différents systèmes peuvent êtres nécessaires les uns, les autres afin de réaliser une tâche complexe telle que l'usinage de pièces. Le système devient dès lors potentiellement extrêmement fragile aux pannes.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning a pour but de pouvoir détecter, et localiser les pannes, voir les futures pannes potentielles afin de pouvoir dans un premier temps prévenir un opérateur. Mais il peut aussi potentiellement permettre au système de continuer de tourner, en attendant un technicien. Le machine Learning peut donc aussi permettre à une chaîne de production de continuer de tourner par l’envoie d’un autre robot par exemple, le temps que la panne soit réparée.&lt;br /&gt;
&lt;br /&gt;
Dans le schéma ci-dessous nous avons un exemple de système de système.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Intro1.png|500px|thumb|center|Schéma d'un système de systèmes]]&lt;br /&gt;
&lt;br /&gt;
Il y a deux cas de figure:&lt;br /&gt;
* Un autre système peut être envoyé pour remplacer le système 4.&lt;br /&gt;
* Les systèmes 1 et 2 peuvent permettre à la chaîne de production de continuer de tourner&lt;br /&gt;
* La chaîne de production est hors service jusqu'à réparation.&lt;br /&gt;
&lt;br /&gt;
==Cahier de charges==&lt;br /&gt;
&lt;br /&gt;
'''Ressources disponibles :'''&lt;br /&gt;
&lt;br /&gt;
* Livres sur le machine learning &lt;br /&gt;
* Bases de données (afin d'appliquer divers algorithmes de machine learning) que nous prendrons sur ces sites : [https://www.kaggle.com/datasets] et [https://archive.ics.uci.edu/ml/datasets.php]&lt;br /&gt;
* Librairies Python (Scikit-learn, Pandas, Numpy, Seaborn, Matplotlib)&lt;br /&gt;
* Google Colab&lt;br /&gt;
* Matlab (version étudiante)&lt;br /&gt;
&lt;br /&gt;
'''Objectifs poursuivis :'''&lt;br /&gt;
&lt;br /&gt;
* Détecter les dysfonctionnements de systèmes mécatroniques (par exemple les robots Khepera, Robotino…), grâce au machine learning.&lt;br /&gt;
* Apprendre à implémenter différentes méthodes machine learning .&lt;br /&gt;
&lt;br /&gt;
'''Profil du public cible :'''&lt;br /&gt;
* Secteur mécatronique&lt;br /&gt;
* Entreprises disposant d'ingénieurs pour maintenir le système informatique opérationnel&lt;br /&gt;
* Entreprises utilisant des machines dans le secteur public.&lt;br /&gt;
&lt;br /&gt;
'''Analyse des besoins :'''&lt;br /&gt;
* L’industrie a de plus en plus besoin du machine learning pour détecter les erreurs des systèmes. En effet, cette technologie devient indispensable pour les industriels, notamment afin d'accroître la productivité et l’efficacité des systèmes industriels.&lt;br /&gt;
* Le programme peut ne pas être aussi rapide et optimisé en espace mémoire que d'autres programmes, nous visons l’efficacité de notre algorithme plutôt que la rapidité.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Librairies''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
En Machine Learning, il est très important, voire primordial, de savoir manipuler les différentes librairies mises à notre disposition afin de visualiser, traiter nos différentes dataset ou même appliquer les différents algorithmes de machine Learning.&lt;br /&gt;
Durant les premières semaines de notre projet, nous avons donc appris à utiliser ces différentes librairies nécessaires pour le machine Learning, telles que Numpy, Seaborn, Panda, Matplotlib, Scikit-learn... Nous allons dans un premier temps nous intéresser à l'importation des différentes bibliothèques puis résumer les commandes importantes de ces différentes librairies.&lt;br /&gt;
&lt;br /&gt;
Ces différentes librairies ne sont pas incluses de base dans Python, il est donc nécessaire de les ajouter à Python puis à notre programme.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc choisi d'utiliser google colab car ces librairies y sont déjà installées (et aussi pratique pour travailler à plusieurs sur un même code).&lt;br /&gt;
Puis nous devons importer ces bibliothèques au début de notre programme.&lt;br /&gt;
&lt;br /&gt;
Attention : Plusieurs bibliothèques peuvent avoir la même commande mais avec des significations différentes, comme par exemple la commande randint du module numpy et celle du module random et cela peut conduire à des erreurs. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de pallier à ces problèmes nous apporterons nos librairie au début de nos programmes comme suit :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:librairies1.png]]&lt;br /&gt;
&lt;br /&gt;
Ici le np permet de dire que lorsque nous utilisons np.array alors nous utilisons la commande array () contenu dans la bibliothèque Numpy.&lt;br /&gt;
&lt;br /&gt;
Ceci nous permettra d’utiliser en simultané différentes librairies, toutes les bibliothèques seront importées selon ce schéma.&lt;br /&gt;
Nous allons par la suite, nous intéresser à différentes commandes incluses dans ces librairies.&lt;br /&gt;
&lt;br /&gt;
==Numpy==&lt;br /&gt;
&lt;br /&gt;
Numpy est une bibliothèque dédiée aux calculs mathématiques et à la gestion des listes (telles que des matrices).&lt;br /&gt;
Matplotlib, quant à lui, est dédié aux affichages graphiques de données.&lt;br /&gt;
Nous allons dans cette partie nous intéresser aux commandes principales de ces deux bibliothèques de python.&lt;br /&gt;
&lt;br /&gt;
Sous numpy, les tableaux sont des types array, ils définissent l'équivalent des tableaux statiques en langage C. La taille d’un tableau numpy ne peut donc pas être changée après leur création. &lt;br /&gt;
&lt;br /&gt;
Néanmoins grâce a Numpy nous pouvons simplement effectuer des tâches sur les tableaux comme en extraire un sous tableaux, et d’effectuer simplement les produits entre matrice, vecteur.&lt;br /&gt;
&lt;br /&gt;
Dans notre projet, nous utiliserons plus courament les fonctions : &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.shape&amp;lt;/FONT&amp;gt; permet d’obtenir la taille de la matrice sous forme d’un tuple, suffit de choisir le bon numéro&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.zeros&amp;lt;/FONT&amp;gt; permet de créer une ligne de x zéro(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.ones&amp;lt;/FONT&amp;gt; permet de créer une ligne de x un(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.vstack&amp;lt;/FONT&amp;gt; permet de rajouter des lignes dans une matrice déjà créer en paramètre&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.transpose&amp;lt;/FONT&amp;gt; permet de transposer une matrice en paramètre&lt;br /&gt;
&lt;br /&gt;
==Seaborn==&lt;br /&gt;
&lt;br /&gt;
Seaborn est une bibliothèque de visualisation de données Python basée sur matplotlib. Il fournit une interface de haut niveau pour dessiner des graphiques statistiques attrayants et informatifs.&lt;br /&gt;
&lt;br /&gt;
'''Différences entre Matplotlib et Seaborn'''&lt;br /&gt;
&lt;br /&gt;
Les défauts de Matplotlib qui ne parlent généralement pas aux utilisateurs sont les couleurs, les marques de tiques sur les axes supérieur et droit, le style,...&lt;br /&gt;
Les exemples ci-dessus rendent également une autre frustration des utilisateurs plus apparente: le fait que travailler avec DataFrames ne va pas aussi bien avec Matplotlib, ce qui peut être ennuyeux si vous faites une analyse exploratoire avec Pandas. Et c’est exactement ce que Seaborn adresse : les fonctions de traçage fonctionnent sur dataframes et tableaux qui contiennent tout un ensemble de données.&lt;br /&gt;
[[Fichier:seaborn1.png|300px|thumb|right|Résultat du code python ci gauche]]&lt;br /&gt;
&lt;br /&gt;
   # Import necessary libraries&lt;br /&gt;
   import seaborn as sns&lt;br /&gt;
   import matplotlib.pyplot as plt&lt;br /&gt;
   &lt;br /&gt;
   # Load iris data&lt;br /&gt;
   iris = sns.load_dataset(&amp;quot;iris&amp;quot;) #DATASET ALREADY EXISTING&lt;br /&gt;
   &lt;br /&gt;
   # Construct iris plot&lt;br /&gt;
   sns.swarmplot(x=&amp;quot;species&amp;quot;, y=&amp;quot;petal_length&amp;quot;, data=iris)&lt;br /&gt;
   &lt;br /&gt;
   # Show plot&lt;br /&gt;
   plt.show()&lt;br /&gt;
&lt;br /&gt;
==Pandas==&lt;br /&gt;
&lt;br /&gt;
Pandas est une API d'analyse de données orientée colonnes. C'est un excellent outil pour manipuler et analyser des données d'entrée. Beaucoup de frameworks d'apprentissage automatique acceptent les structures de données Pandas en entrée.&lt;br /&gt;
&lt;br /&gt;
Comme évoqué précédemment, Pandas travaille avec des matrices colonnes communément appelées ‘Series’ mais aussi et surtout avec des tableaux de données appelés ‘DataFrames’.&lt;br /&gt;
Une Series est tout simplement une colonne et une DataFrame est un tableau à plusieurs dimensions constitué de Series.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Panda.JPG]]&lt;br /&gt;
&lt;br /&gt;
A l'aide de Pandas, on peut ainsi créer, importer, lire et manipuler des bases de données facilement.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Théories des algorithmes étudiés''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Il y a différents types d’algorithmes en machine learning, pour notre sujet qui consiste à classer des machines en défectueuse ou fonctionnelles (1 ou 0), nous aurons surtout besoin d’algorithmes de classification binaire. De manière générale, la conception de la plupart des algorithmes fonctionnent de cette manière : &lt;br /&gt;
&lt;br /&gt;
* Élaborer un modèle &lt;br /&gt;
* Établir une fonction coût pour celui-ci correspondant à l’erreur entre le modèle et les données réelles&lt;br /&gt;
* Trouver un algorithme de minimisation de cette fonction coût&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression linéaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression1.png|200px|thumb|right|Exemple de régression linéaire]]&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est un algorithme de prédiction et non un algorithme de classification, nous aurons surtout besoin de ce deuxième type d’algorithme pour notre projet mais nous tenons à présenter cet algorithme qui est le plus basique en machine learning et un bon début pour une formation pédagogique.&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est une méthode de modélisation qui cherche à établir une relation linéaire entre une ou des &amp;quot;features&amp;quot; (variables explicatives) et une &amp;quot;target&amp;quot; (variable expliquée qu'on cherche à prévoir à partir des variables explicatives). En machine learning, la régression linéaire est un modèle d'apprentissage supervisé, c'est-à-dire qu'on apprend à l'algorithme de prédiction à partir d'exemples dont on dispose dans une dataset. Nous nous intéresserons à la régression affine qui est la plus simple pour débuter.&lt;br /&gt;
&lt;br /&gt;
===Modèle et estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
La régression affine consiste donc à trouver un modèle de type&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt;y=ax+b&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
avec x une &amp;quot;feature&amp;quot;, y la target et avec a et b des paramètres qu'il nous faudra déterminer. Le but est donc de trouver les paramètres a et b tels que la distance entre chaque point du nuage et la droite du modèle soit la plus petite possible.&lt;br /&gt;
Mathématiquement, il suffit de résoudre cette formule:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression2.png|200px|thumb|right|Méthode des moindres carrés illustrée]]&lt;br /&gt;
[[Fichier:regression3.png]]&lt;br /&gt;
&lt;br /&gt;
On utilise donc la méthode des moindres carrés pour mesurer l'erreur entre le modèle de prédiction et les données et ainsi fabriquer notre fonction coût :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression4.png]]&lt;br /&gt;
&lt;br /&gt;
avec m le nombre de points du nuage.&lt;br /&gt;
&lt;br /&gt;
L'objectif de l'algorithme est donc de trouver les paramètres optimaux qui minimisent cette fonction J.&lt;br /&gt;
En machine learning, une des méthodes les plus populaires pour faire ceci est la descente de gradient, car c'est une méthode adaptée quand on fait du traitement de grosses dataset (&amp;quot;faible&amp;quot; temps de calcul). En effet, la fonction coût J est une parabole admettant un unique minimum dépendant des paramètres a et b. La descente de gradient consiste à chercher le point de celle-ci où la dérivée est nulle (donc le minimum)&lt;br /&gt;
&lt;br /&gt;
===Méthode de la descente du gradient===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression6.png|200px|thumb|right|Méthode gradient]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression7.png|200px|thumb|right|Généralisation gradient fct parabolique]]&lt;br /&gt;
&lt;br /&gt;
Soit une fonction parabolique ne dépendant que de x. On cherche à trouver le minimum de cette fonction en utilisant la méthode de la descente du gradient&lt;br /&gt;
Pour cela on choisit un point aléatoirement &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;et on va descendre à partir de celui-ci jusqu'à atteindre un minimum en utilisant&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression5.png]]&lt;br /&gt;
&lt;br /&gt;
avec un paramètre  qui influencera la taille du pas de la descente.&lt;br /&gt;
&lt;br /&gt;
Il faut faire attention à ne pas prendre un pas trop grand, ni trop petit, pour éviter de &amp;quot;tourner&amp;quot; autour du minimum ou de prendre trop de temps pour l'atteindre.&lt;br /&gt;
Note : On peut généraliser cela pour une fonction parabolique à n paramètres qui aurait donc une forme de bol.&lt;br /&gt;
&lt;br /&gt;
===Application sur notre fonction coût===&lt;br /&gt;
&lt;br /&gt;
Notre fonction coût dépend des 2 paramètres a et b :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression8.png]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression9.png]]&lt;br /&gt;
&lt;br /&gt;
On choisit &amp;lt;math&amp;gt;a_0&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; aléatoirement et on applique ceci pour un pas :&lt;br /&gt;
&lt;br /&gt;
Avec &lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression10.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d'un certain nombre d'itérations on trouve le couple &amp;lt;math&amp;gt;(a,b)&amp;lt;/math&amp;gt; qui minimise notre fonction coût.&lt;br /&gt;
&lt;br /&gt;
Note : Nous avons démontré la théorie de la régression linéaire affine mais on pourrait généraliser celle-ci pour un modèle polynomiale d’ordre n, la courbe de prédiction serait donc parabolique et il faudrait trouver le tuple &amp;lt;math&amp;gt;(a_1,a_2,...,a_n)&amp;lt;/math&amp;gt; qui minimise la fonction coût.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression logistique binaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo1.png|200px|thumb|right|Modèle régression logistique]]&lt;br /&gt;
&lt;br /&gt;
La régression logistique binaire est un algorithme de classification, contrairement à la régression linéaire qui est un algorithme de prédiction. De la même façon que la régression linéaire,  il s'agit de modéliser au mieux un modèle mathématique simple à des observations réelles nombreuses. Cette méthode se base sur de l’analyse mathématiques et statistique. Il faut donc associer à des “features” &amp;lt;math&amp;gt;(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; une variable Y valant 1 ou 0 (d’où le terme classification binaire).&lt;br /&gt;
&lt;br /&gt;
L’objectif de l’algorithme est donc de trouver la fonction F dépendant d’une loi de probabilité telle que :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo2.png]]&lt;br /&gt;
&lt;br /&gt;
avec S un certain seuil (fixé la plupart du temps à 0,5).&lt;br /&gt;
&lt;br /&gt;
===Modèle===&lt;br /&gt;
&lt;br /&gt;
Comme cette méthode repose principalement sur des statistiques, il est important d’adopter une notation explicite lors de l’explication théorique :&lt;br /&gt;
&lt;br /&gt;
* On notera Y la variable à prédire (qui vaudra 0 ou 1) et &amp;lt;math&amp;gt;X=(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; les variables permettant de prédire Y&lt;br /&gt;
* On travaillera dans un univers  de N échantillons (taille de la dataset)&lt;br /&gt;
* On notera &amp;lt;math&amp;gt;P(Y=1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;P(Y=0)&amp;lt;/math&amp;gt; les probabilités que Y valent respectivement 1 ou 0 &amp;lt;math&amp;gt;p(1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0)&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;p(X|1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(X|0)&amp;lt;/math&amp;gt; sont les distributions conditionnelles des caractéristiques X sachant la valeur prise par Y&lt;br /&gt;
* &amp;lt;math&amp;gt;p(1|X)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0|X)&amp;lt;/math&amp;gt; sont donc les probabilités d’obtenir la valeur de Y (1 ou 0) sachant les valeurs de X&lt;br /&gt;
&lt;br /&gt;
La régression logistique utilise l’hypothèse fondamentale (mesure de l’évidence) :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo3.png]]&lt;br /&gt;
&lt;br /&gt;
On en déduit donc (comme &amp;lt;math&amp;gt;p(0|X)=1-p(1|X))&amp;lt;/math&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo4.png]]&lt;br /&gt;
&lt;br /&gt;
Avec &amp;lt;math&amp;gt;(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; des variables à déterminer.&lt;br /&gt;
&lt;br /&gt;
''Note :'' ce modèle est appelé modèle LOGIT.&lt;br /&gt;
&lt;br /&gt;
===Estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
Contrairement à la régression linéaire affine, on ne peut pas utiliser la méthode des moindres carrés, on utilise alors la méthode de maximisation de la vraisemblance.&lt;br /&gt;
“La vraisemblance mesure une adéquation entre la distribution observée sur un échantillon aléatoire et une loi de probabilité supposée décrire une réalité sur la population dont l'échantillon est issu.” (source : [www.jybaudot.fr])&lt;br /&gt;
&lt;br /&gt;
Le calcul de la vraisemblance L dans un univers  de N échantillons est le suivant :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo5.png]]&lt;br /&gt;
&lt;br /&gt;
Plus la vraisemblance est élevée, alors plus la loi de probabilité est proche de la réalité. Le but est donc de maximiser cette valeur et de trouver les valeurs optimales de &amp;lt;math&amp;gt;A =(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; qui influent directement sur la loi de probabilité établie dans la partie modèle.&lt;br /&gt;
&lt;br /&gt;
===Algorithme d'optimisation===&lt;br /&gt;
&lt;br /&gt;
Afin de trouver la valeur optimale du vecteur A, nous utiliserons encore une fois la méthode de descente du gradient adaptée à notre cas.&lt;br /&gt;
&lt;br /&gt;
Celle-ci utilise la relation suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo6.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d’un certain nombre d’itérations, on trouvera la valeur optimale de A afin de maximiser la vraisemblance.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Mise en pratique''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Pour la mise en pratique, nous avons décidé d’appliquer les méthodes sur un dataset de prédiction de maintenance pour l’industrie, nous importons grâce à la librairie panda : &amp;lt;code&amp;gt; dataset = pd.read_csv('ai4i2020.csv') &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette dataset contient 14 colonnes de données, nous pouvons visualiser la proportion de données saines et non-saines par ce code seaborn : &amp;lt;code&amp;gt; sns.factorplot('Machine failure',data=dataset,kind='count') &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on traitera cette dataset pour la préparer sur l’intervention des modèles de machine learning, puis on appliquera ces méthodes.&lt;br /&gt;
&lt;br /&gt;
==Pré-traitement de la dataset==&lt;br /&gt;
&lt;br /&gt;
Avant d’appliquer les algorithme sur notre dataset, il faut la traiter, le traitement sera le même pour tous les algorithmes et suivra cet ordre :&lt;br /&gt;
* Traitement des valeurs manquantes&lt;br /&gt;
* Équilibrage des données&lt;br /&gt;
* Séparations des données en entrainement et test&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous devons regarder si notre base de données contient des valeurs manquante, pour cela nous implantons ce code : &lt;br /&gt;
&lt;br /&gt;
   import missingno as msno&lt;br /&gt;
   msno.matrix(dataset)&lt;br /&gt;
&lt;br /&gt;
Les lignes blanches dans le résultat correspond aux valeurs manquantes, ci-dessous nous voyons que nous avons aucune données manquantes dans la base que nous avons importer : [[Fichier:Miseenpratique.png]]&lt;br /&gt;
&lt;br /&gt;
Dans le cas, où nous avons des valeurs manquante, il y a plusieurs méthodes pour traiter les valeurs manquantes mais nous retenons 2 méthodes :&lt;br /&gt;
* Une méthode qui consiste à supprimer les lignes où des valeurs manquantes sont présentes : &amp;lt;code&amp;gt; data.dropna(inplace=True) &amp;lt;/code&amp;gt;&lt;br /&gt;
L’avantage de cette méthode est de créer un modèle robuste. L’inconvénient majeur est le fait qu’on peut perdre énormément de données, pour des données où les valeurs manquantes sont excessives, mieux vaut appliquer une autre méthode.&lt;br /&gt;
&lt;br /&gt;
* Une méthode qui consiste à remplacer les valeurs manquantes par la moyenne des données de la colonne : &amp;lt;code&amp;gt; data[0]=drop[0].replace(np.NaN,data[0].mean()) &amp;lt;/code&amp;gt; L’avantage de cette méthode permet d’éviter la suppression de lignes, ce qui permet de garder les autres données comparé à l’autre méthode. Cependant cette méthode n’est que applicable sur les données numériques&lt;br /&gt;
&lt;br /&gt;
Nous passons alors sur l'équilibrage des données. Avant d’appliquer la méthode SMOTE, nous devons mettre dans 2 variables, la target (y) et les features (X) :&lt;br /&gt;
&lt;br /&gt;
   X = dataset.drop(['Machine failure','UDI','Product ID','Type','TWF','HDF','PWF','OSF','RNF'],axis=1).values&lt;br /&gt;
   y = dataset['Machine failure']&lt;br /&gt;
&lt;br /&gt;
Notre target sera seulement ‘Machine failure’ et nos features seront : la température de l’air, la température du processus, le couple, et l’usure des outils.&lt;br /&gt;
&lt;br /&gt;
Durant notre projet , nous avons implémenté la technique SMOTE pour traiter les ensembles de données déséquilibrées.&lt;br /&gt;
Le principe de SMOTE est de générer de nouveaux échantillons en combinant les données de la classe minoritaire avec celles de leurs voisins proches. Techniquement, on peut décomposer SMOTE en 5 étapes :&lt;br /&gt;
* 1 - Choix d’un vecteur caractéristique de notre classe minoritaire que nous appellerons vc &lt;br /&gt;
* 2 - Sélection des k-voisins les plus proches (k=5 par défaut) et choix de l’un d’eux au hasard que l’on appellera pv &lt;br /&gt;
* 3 - Calcul de la différence pour chaque valeur caractéristique (feature value) i, vc[i]-pv[i] et multiplication de celle-ci par un nombre aléatoire entre [0,1]&lt;br /&gt;
* 4 - Ajout du résultat précédent à la valeur de la caractéristique i du vecteur vc afin d’obtenir un nouveau point (une nouvelle donnée) dans l’espace des caractéristiques &lt;br /&gt;
* 5 - Répétition de ces opérations pour chaque point de données de la classe minoritaire &lt;br /&gt;
Nous remarquons que cette technique marche après smote (50% données saines, 50% données non-saines)&lt;br /&gt;
&lt;br /&gt;
Code : &lt;br /&gt;
&lt;br /&gt;
   oversample = SMOTE()&lt;br /&gt;
   Xsmote, ysmote = oversample.fit_resample(X,y)&lt;br /&gt;
   Xsmote = pd.DataFrame(Xsmote)&lt;br /&gt;
   ysmote = pd.DataFrame(ysmote)&lt;br /&gt;
   X=Xsmote&lt;br /&gt;
   y=ysmote&lt;br /&gt;
&lt;br /&gt;
On remarque que la technique smote a ajouté 9322 lignes sur notre base, Maintenant que nous avons un équilibre entre les données ‘sains’ et ‘malsains’, nous pouvons voir la répartitions des points sur 2 axes :&lt;br /&gt;
&lt;br /&gt;
(image)&lt;br /&gt;
&lt;br /&gt;
Nous pouvons alors procéder à la séparation de nos données en données d'entraînement et de test&lt;br /&gt;
&lt;br /&gt;
Nous devons séparer en deux nos données pour pouvoir appliquer les algorithmes de machine learning, ainsi : &lt;br /&gt;
Les données d'entraînement serviront de repères pour l’algorithme&lt;br /&gt;
Les données de test seront entraînées par celle d’entrainement pour créer une prédiction&lt;br /&gt;
&lt;br /&gt;
Nous allons utiliser la fonction train_test_split de la librairie sklearn pour séparer nos données : &lt;br /&gt;
&lt;br /&gt;
   X_train, X_test, y_train, y_test = train_test_split(X,y, test_size = 0.2, random_state = 100)&lt;br /&gt;
&lt;br /&gt;
Ici dans les paramètres :&lt;br /&gt;
X  correspond aux features&lt;br /&gt;
y correspond à la target&lt;br /&gt;
test_size correspond au pourcentage de séparation (soit 0.2 = 20% test et 80% d'entraînement)&lt;br /&gt;
random_state permet d’initialiser le choix aléatoire pour avoir la même répartition à chaque exécution&lt;br /&gt;
&lt;br /&gt;
Maintenant nous pouvons appliquer les algorithme à notre modèle&lt;br /&gt;
&lt;br /&gt;
==Application des algorithmes==&lt;br /&gt;
&lt;br /&gt;
En général, nous allons appliquer les algorithme en suivant cet ordre : &lt;br /&gt;
* Importation de la méthode sur la librairie sklearn&lt;br /&gt;
* Entraînement des données&lt;br /&gt;
* Prédiction&lt;br /&gt;
* Méthodes d’évaluations&lt;br /&gt;
&lt;br /&gt;
===Régression linéaire===&lt;br /&gt;
&lt;br /&gt;
Nous allons commencer par le plus simple : la régression linéaire, nous commençons par importer l’algorithme à partir de la librairie sklearn : &amp;lt;code&amp;gt; from sklearn.linear_model import LinearRegression &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis nous appelons l’algorithme avec les paramètres de base, puis nous entraînons notre dataset : &lt;br /&gt;
   #Méthode de régréssion linéaire&lt;br /&gt;
   lr = LinearRegression()&lt;br /&gt;
   #Training&lt;br /&gt;
   lr.fit(X_train,y_train)&lt;br /&gt;
&lt;br /&gt;
Ensuite la prédiction : &lt;br /&gt;
   #Prediction&lt;br /&gt;
   y_pred = lr.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
Et enfin l'évaluation, nous avons vu 2 méthodes pour évaluer notre modèle : &lt;br /&gt;
* Afficher le score de prédiction&lt;br /&gt;
* Afficher la matrice de confusion, une matrice de taille 2x2 qui donne ces informations : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatrixConfusion.png]]&lt;br /&gt;
&lt;br /&gt;
Le score de prédiction (accuracy) est également calculé à partir de cette matrice&lt;br /&gt;
Pour la régression linéaire, nous allons qu’afficher le score de prédiction, car cet algorithme nous donne en retour des valeurs non-binaire, la construction d’une matrice de confusion et impossible.&lt;br /&gt;
&lt;br /&gt;
   #Evaluation&lt;br /&gt;
   print(lr.score(X_test,y_test))&lt;br /&gt;
&lt;br /&gt;
Nous obtenons ainsi un score de 0.48, un score qui est plus élevé sans la méthode SMOTE (0.14), sauf que cette méthode n’est pas la plus optimisée pour cette base de données, car nous avons en target des valeurs binaires. Il vaut mieux appliquer la méthode de régression logistique ou la méthode de Naives-Bayes.&lt;br /&gt;
&lt;br /&gt;
===Régression logistique===&lt;br /&gt;
&lt;br /&gt;
Dans le même modèle que la régression linéaire, nous procédons à l’import de la méthode, l’appel de la méthode, l'entraînement des données et de la prédiction :&lt;br /&gt;
&lt;br /&gt;
   from sklearn import linear_model&lt;br /&gt;
&lt;br /&gt;
   #Modèle régression logistique&lt;br /&gt;
   modele_regLog = linear_model.LogisticRegression() &lt;br /&gt;
   #random_state = 100, solver = 'liblinear', multi_class = 'auto'&lt;br /&gt;
&lt;br /&gt;
   #training&lt;br /&gt;
   modele_regLog.fit(X_train,y_train)&lt;br /&gt;
&lt;br /&gt;
   #prediction&lt;br /&gt;
   y_pred = modele_regLog.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
   #précision du modèle&lt;br /&gt;
   precision = modele_regLog.score(X_test,y_test)&lt;br /&gt;
   print(precision)&lt;br /&gt;
&lt;br /&gt;
Pour la régression logistique, nous allons afficher la matrice de confusion et le score :&lt;br /&gt;
&lt;br /&gt;
   from sklearn.metrics import plot_confusion_matrix&lt;br /&gt;
   plot_confusion_matrix(modele_regLog, X_test, y_test)  &lt;br /&gt;
   plt.show() &lt;br /&gt;
&lt;br /&gt;
(images)&lt;br /&gt;
&lt;br /&gt;
Nous obtenons un score de 0.82, contre 0.97 sans la méthode de SMOTE, ce qui est cohérent car le score obtenu sans SMOTE n’est pas précis car il y avait peu de données où la machine a planté. Avec SMOTE, nous obtenons certes un score moins élevé mais plus précis.&lt;br /&gt;
Grâce à la matrice de confusion nous pouvons voir que : &lt;br /&gt;
* Il y a 2396 fois où l’algorithme a prédit Machine failure = 0 et a eu raison&lt;br /&gt;
* Il y a 2377 fois où l’algorithme a prédit Machine failure = 1 et a eu raison&lt;br /&gt;
* Il y a 546 fois où l’algorithme a prédit Machine failure = 1 et a eu faux&lt;br /&gt;
* Il y a 478 fois où l’algorithme a prédit Machine failure = 0 et a eu faux&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 0px; padding: 20px; font-weight: bold; text-align: center; font-size: 80%; background: #61798F; vertical-align: top; width: 100%;&amp;quot;&amp;gt; '''PARTIE II (S8)''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Développement du projet''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Durant les deux premiers semestres de ce projet, nous avons découvert et étudié le Machine Learning, que ce soit la théorie de différents algorithmes connus ou l'application pratique à des datasets que nous pouvons récupérer sur Internet ou bien créer nous même.&lt;br /&gt;
&lt;br /&gt;
La création de notre dataset ayant été fastidieuse et peu concluante (voir résultats du semestre précédent), nous avons comme objectif pour ce semestre d'implémenter nos algorithmes (et principalement le réseau de neurones) à des machines dont nous avons accès à l'école.&lt;br /&gt;
&lt;br /&gt;
Après discussion avec notre tuteur de projet Monsieur Lakhal, nous avons décidé d'utiliser des Robotino plutôt que d'utiliser la chaîne de production présente à l'école car il existe des logiciels simples permettant d'effectuer des simulations de réseaux logistiques de Robotinos (Robotino View et Robotino Simulation) dont nous allons récupérer les données en temps réel, les traiter puis commander les différents Robotino à l'aide d’un algorithme de réseaux de neurones.&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce semestre est ainsi de réaliser le scénario d'un réseau logistique autonome (à l'image d'Amazon par exemple) composé de plusieurs Robotino effectuant chacun une tâche et d'y introduire des erreurs puis de les traiter grâce au Machine Learning afin de ne pas perturber la logistique et d’obtenir un maximum d’efficacité.&lt;br /&gt;
&lt;br /&gt;
Nous avons organisé ce projet en plusieurs étapes où chacun des membres a pu plus ou moins participé en fonction de ses capacités :&lt;br /&gt;
&lt;br /&gt;
Conception du Grafcet pour la commande des Robotino&lt;br /&gt;
&lt;br /&gt;
Récupération et traitement des données en temps réel&lt;br /&gt;
&lt;br /&gt;
Utilisation du Machine Learning afin de commander les Robotino&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous avons constitué 2 équipes : une équipe spécialisée dans la commande du Robotino constituée de Loïc et Aymen et l’autre dans le traitement des données avec le Machine Learning avec Antoine, Tom et Florian.&lt;br /&gt;
Nous avons ensuite organisé notre projet à l’aide du diagramme de Gantt ci-dessous.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Gantt.jpg]]&lt;br /&gt;
== [[Fichier:Diagramme de Gantt]] ==&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Élaboration du scénario''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Traitement des erreurs''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
=Recherche bibliographique=&lt;br /&gt;
&lt;br /&gt;
* https://www.wikipedia.com&lt;br /&gt;
&lt;br /&gt;
* https://www.jybaudot.fr&lt;br /&gt;
&lt;br /&gt;
* https://datascientest.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.ipgirl.com&lt;br /&gt;
&lt;br /&gt;
* Cours de probabilités et statistiques de l’Université Jules Vernes&lt;br /&gt;
&lt;br /&gt;
* Chaine youtube Machine Learning : https://www.youtube.com/channel/UCmpptkXu8iIFe6kfDK5o7VQ&lt;br /&gt;
&lt;br /&gt;
* Machine Learning with scikit-learn Quick Start Guide écrit par Kevin Jolly&lt;br /&gt;
&lt;br /&gt;
* https://lucidar.me/&lt;br /&gt;
&lt;br /&gt;
* https://archive.ics.uci.edu/ml/datasets.php&lt;br /&gt;
&lt;br /&gt;
* https://www.kaggle.com/datasets&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com/&lt;br /&gt;
&lt;br /&gt;
* Machine Learning algorithms - Second Edition écrit par Giuseppe Bonaccorso&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com&lt;br /&gt;
&lt;br /&gt;
* https://towardsdatascience.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.learndatasci.com/&lt;br /&gt;
&lt;br /&gt;
==Rapports et présentation==&lt;br /&gt;
&lt;br /&gt;
===Librairies===&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1CQZ1s6fNY_6MsmbBa5TP1OzSedqFeaWI?usp=sharing/ Rapport Numpy]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1tdu_B2wRsUiqdnSeskQENdn_wX3pJMeT?usp=sharing/ Rapport Pandas]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1DPS4ZT91SIEhscwST8kfER7u21tKoM3a?usp=sharing/ Rapport Seaborn]&lt;br /&gt;
&lt;br /&gt;
===Rapports===&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/document/d/1yR0vLePV3hI1_HVtTZWwGIwy0Cb-oLOsOTK3Um5KAYE/edit?usp=sharing/ Rapport]&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/presentation/d/1Je_yF0dgc-s9gB7LLsfOg0b05xcwIFJbaqpVytxWv5A/edit?usp=sharing/ Présentation]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1y_NMo9XKJ0WzwE2zmcRblUyuIebwfoN8?usp=sharing/ Régression linéaire]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1bRyrnL1JM870cEcEvfGaS8ItrG16rchy?usp=sharing/ Google Colab]&lt;/div&gt;</summary>
		<author><name>Abrossas</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88029</id>
		<title>IMA3/IMA4 2020/2022 P5</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88029"/>
				<updated>2022-02-09T17:43:04Z</updated>
		
		<summary type="html">&lt;p&gt;Abrossas : /*  Élaboration du scénario  */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 0px; padding: 20px; font-weight: bold; text-align: center; font-size: 80%; background: #61798F; vertical-align: top; width: 100%;&amp;quot;&amp;gt; '''PARTIE I (S6-S7)''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Introduction et cahier des charges''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce projet est la mise en place d’algorithmes de machine Learning afin de diagnostiquer l’état de machines industrielles. Nous travaillerons sur ce projet durant 2 semestres. &lt;br /&gt;
Durant le premier semestre, nous avions comme objectifs d’acquérir la maîtrise des différentes librairies primordiales pour traiter les données en machine Learning, ainsi que d’étudier et d’utiliser certains algorithmes basiques (régression linéaire, logistique, Bayes) sur des datasets que nous traiterons nous même. &lt;br /&gt;
Pour ce qui est du second semestre, notre objectif était de concrétiser les connaissances acquises durant le premier semestre. Nous avons donc essayé de créer notre propre dataset à l’aide des matériels mis à notre disposition, de la prétraiter et d’y appliquer différents algorithmes de Machine Learning en critiquant les résultats.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning pour la détection de défaut s'inscrit parfaitement dans le contexte scientifique actuel, notamment grâce à l’industrie 4.0.&lt;br /&gt;
En effet, cette nouvelle industrie fait apparaître des systèmes communicants (l’IOT : Internet Of Things) interconnectés les uns entre les autres. Ces différents systèmes peuvent êtres nécessaires les uns, les autres afin de réaliser une tâche complexe telle que l'usinage de pièces. Le système devient dès lors potentiellement extrêmement fragile aux pannes.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning a pour but de pouvoir détecter, et localiser les pannes, voir les futures pannes potentielles afin de pouvoir dans un premier temps prévenir un opérateur. Mais il peut aussi potentiellement permettre au système de continuer de tourner, en attendant un technicien. Le machine Learning peut donc aussi permettre à une chaîne de production de continuer de tourner par l’envoie d’un autre robot par exemple, le temps que la panne soit réparée.&lt;br /&gt;
&lt;br /&gt;
Dans le schéma ci-dessous nous avons un exemple de système de système.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Intro1.png|500px|thumb|center|Schéma d'un système de systèmes]]&lt;br /&gt;
&lt;br /&gt;
Il y a deux cas de figure:&lt;br /&gt;
* Un autre système peut être envoyé pour remplacer le système 4.&lt;br /&gt;
* Les systèmes 1 et 2 peuvent permettre à la chaîne de production de continuer de tourner&lt;br /&gt;
* La chaîne de production est hors service jusqu'à réparation.&lt;br /&gt;
&lt;br /&gt;
==Cahier de charges==&lt;br /&gt;
&lt;br /&gt;
'''Ressources disponibles :'''&lt;br /&gt;
&lt;br /&gt;
* Livres sur le machine learning &lt;br /&gt;
* Bases de données (afin d'appliquer divers algorithmes de machine learning) que nous prendrons sur ces sites : [https://www.kaggle.com/datasets] et [https://archive.ics.uci.edu/ml/datasets.php]&lt;br /&gt;
* Librairies Python (Scikit-learn, Pandas, Numpy, Seaborn, Matplotlib)&lt;br /&gt;
* Google Colab&lt;br /&gt;
* Matlab (version étudiante)&lt;br /&gt;
&lt;br /&gt;
'''Objectifs poursuivis :'''&lt;br /&gt;
&lt;br /&gt;
* Détecter les dysfonctionnements de systèmes mécatroniques (par exemple les robots Khepera, Robotino…), grâce au machine learning.&lt;br /&gt;
* Apprendre à implémenter différentes méthodes machine learning .&lt;br /&gt;
&lt;br /&gt;
'''Profil du public cible :'''&lt;br /&gt;
* Secteur mécatronique&lt;br /&gt;
* Entreprises disposant d'ingénieurs pour maintenir le système informatique opérationnel&lt;br /&gt;
* Entreprises utilisant des machines dans le secteur public.&lt;br /&gt;
&lt;br /&gt;
'''Analyse des besoins :'''&lt;br /&gt;
* L’industrie a de plus en plus besoin du machine learning pour détecter les erreurs des systèmes. En effet, cette technologie devient indispensable pour les industriels, notamment afin d'accroître la productivité et l’efficacité des systèmes industriels.&lt;br /&gt;
* Le programme peut ne pas être aussi rapide et optimisé en espace mémoire que d'autres programmes, nous visons l’efficacité de notre algorithme plutôt que la rapidité.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Librairies''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
En Machine Learning, il est très important, voire primordial, de savoir manipuler les différentes librairies mises à notre disposition afin de visualiser, traiter nos différentes dataset ou même appliquer les différents algorithmes de machine Learning.&lt;br /&gt;
Durant les premières semaines de notre projet, nous avons donc appris à utiliser ces différentes librairies nécessaires pour le machine Learning, telles que Numpy, Seaborn, Panda, Matplotlib, Scikit-learn... Nous allons dans un premier temps nous intéresser à l'importation des différentes bibliothèques puis résumer les commandes importantes de ces différentes librairies.&lt;br /&gt;
&lt;br /&gt;
Ces différentes librairies ne sont pas incluses de base dans Python, il est donc nécessaire de les ajouter à Python puis à notre programme.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc choisi d'utiliser google colab car ces librairies y sont déjà installées (et aussi pratique pour travailler à plusieurs sur un même code).&lt;br /&gt;
Puis nous devons importer ces bibliothèques au début de notre programme.&lt;br /&gt;
&lt;br /&gt;
Attention : Plusieurs bibliothèques peuvent avoir la même commande mais avec des significations différentes, comme par exemple la commande randint du module numpy et celle du module random et cela peut conduire à des erreurs. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de pallier à ces problèmes nous apporterons nos librairie au début de nos programmes comme suit :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:librairies1.png]]&lt;br /&gt;
&lt;br /&gt;
Ici le np permet de dire que lorsque nous utilisons np.array alors nous utilisons la commande array () contenu dans la bibliothèque Numpy.&lt;br /&gt;
&lt;br /&gt;
Ceci nous permettra d’utiliser en simultané différentes librairies, toutes les bibliothèques seront importées selon ce schéma.&lt;br /&gt;
Nous allons par la suite, nous intéresser à différentes commandes incluses dans ces librairies.&lt;br /&gt;
&lt;br /&gt;
==Numpy==&lt;br /&gt;
&lt;br /&gt;
Numpy est une bibliothèque dédiée aux calculs mathématiques et à la gestion des listes (telles que des matrices).&lt;br /&gt;
Matplotlib, quant à lui, est dédié aux affichages graphiques de données.&lt;br /&gt;
Nous allons dans cette partie nous intéresser aux commandes principales de ces deux bibliothèques de python.&lt;br /&gt;
&lt;br /&gt;
Sous numpy, les tableaux sont des types array, ils définissent l'équivalent des tableaux statiques en langage C. La taille d’un tableau numpy ne peut donc pas être changée après leur création. &lt;br /&gt;
&lt;br /&gt;
Néanmoins grâce a Numpy nous pouvons simplement effectuer des tâches sur les tableaux comme en extraire un sous tableaux, et d’effectuer simplement les produits entre matrice, vecteur.&lt;br /&gt;
&lt;br /&gt;
Dans notre projet, nous utiliserons plus courament les fonctions : &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.shape&amp;lt;/FONT&amp;gt; permet d’obtenir la taille de la matrice sous forme d’un tuple, suffit de choisir le bon numéro&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.zeros&amp;lt;/FONT&amp;gt; permet de créer une ligne de x zéro(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.ones&amp;lt;/FONT&amp;gt; permet de créer une ligne de x un(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.vstack&amp;lt;/FONT&amp;gt; permet de rajouter des lignes dans une matrice déjà créer en paramètre&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.transpose&amp;lt;/FONT&amp;gt; permet de transposer une matrice en paramètre&lt;br /&gt;
&lt;br /&gt;
==Seaborn==&lt;br /&gt;
&lt;br /&gt;
Seaborn est une bibliothèque de visualisation de données Python basée sur matplotlib. Il fournit une interface de haut niveau pour dessiner des graphiques statistiques attrayants et informatifs.&lt;br /&gt;
&lt;br /&gt;
'''Différences entre Matplotlib et Seaborn'''&lt;br /&gt;
&lt;br /&gt;
Les défauts de Matplotlib qui ne parlent généralement pas aux utilisateurs sont les couleurs, les marques de tiques sur les axes supérieur et droit, le style,...&lt;br /&gt;
Les exemples ci-dessus rendent également une autre frustration des utilisateurs plus apparente: le fait que travailler avec DataFrames ne va pas aussi bien avec Matplotlib, ce qui peut être ennuyeux si vous faites une analyse exploratoire avec Pandas. Et c’est exactement ce que Seaborn adresse : les fonctions de traçage fonctionnent sur dataframes et tableaux qui contiennent tout un ensemble de données.&lt;br /&gt;
[[Fichier:seaborn1.png|300px|thumb|right|Résultat du code python ci gauche]]&lt;br /&gt;
&lt;br /&gt;
   # Import necessary libraries&lt;br /&gt;
   import seaborn as sns&lt;br /&gt;
   import matplotlib.pyplot as plt&lt;br /&gt;
   &lt;br /&gt;
   # Load iris data&lt;br /&gt;
   iris = sns.load_dataset(&amp;quot;iris&amp;quot;) #DATASET ALREADY EXISTING&lt;br /&gt;
   &lt;br /&gt;
   # Construct iris plot&lt;br /&gt;
   sns.swarmplot(x=&amp;quot;species&amp;quot;, y=&amp;quot;petal_length&amp;quot;, data=iris)&lt;br /&gt;
   &lt;br /&gt;
   # Show plot&lt;br /&gt;
   plt.show()&lt;br /&gt;
&lt;br /&gt;
==Pandas==&lt;br /&gt;
&lt;br /&gt;
Pandas est une API d'analyse de données orientée colonnes. C'est un excellent outil pour manipuler et analyser des données d'entrée. Beaucoup de frameworks d'apprentissage automatique acceptent les structures de données Pandas en entrée.&lt;br /&gt;
&lt;br /&gt;
Comme évoqué précédemment, Pandas travaille avec des matrices colonnes communément appelées ‘Series’ mais aussi et surtout avec des tableaux de données appelés ‘DataFrames’.&lt;br /&gt;
Une Series est tout simplement une colonne et une DataFrame est un tableau à plusieurs dimensions constitué de Series.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Panda.JPG]]&lt;br /&gt;
&lt;br /&gt;
A l'aide de Pandas, on peut ainsi créer, importer, lire et manipuler des bases de données facilement.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Théories des algorithmes étudiés''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Il y a différents types d’algorithmes en machine learning, pour notre sujet qui consiste à classer des machines en défectueuse ou fonctionnelles (1 ou 0), nous aurons surtout besoin d’algorithmes de classification binaire. De manière générale, la conception de la plupart des algorithmes fonctionnent de cette manière : &lt;br /&gt;
&lt;br /&gt;
* Élaborer un modèle &lt;br /&gt;
* Établir une fonction coût pour celui-ci correspondant à l’erreur entre le modèle et les données réelles&lt;br /&gt;
* Trouver un algorithme de minimisation de cette fonction coût&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression linéaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression1.png|200px|thumb|right|Exemple de régression linéaire]]&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est un algorithme de prédiction et non un algorithme de classification, nous aurons surtout besoin de ce deuxième type d’algorithme pour notre projet mais nous tenons à présenter cet algorithme qui est le plus basique en machine learning et un bon début pour une formation pédagogique.&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est une méthode de modélisation qui cherche à établir une relation linéaire entre une ou des &amp;quot;features&amp;quot; (variables explicatives) et une &amp;quot;target&amp;quot; (variable expliquée qu'on cherche à prévoir à partir des variables explicatives). En machine learning, la régression linéaire est un modèle d'apprentissage supervisé, c'est-à-dire qu'on apprend à l'algorithme de prédiction à partir d'exemples dont on dispose dans une dataset. Nous nous intéresserons à la régression affine qui est la plus simple pour débuter.&lt;br /&gt;
&lt;br /&gt;
===Modèle et estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
La régression affine consiste donc à trouver un modèle de type&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt;y=ax+b&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
avec x une &amp;quot;feature&amp;quot;, y la target et avec a et b des paramètres qu'il nous faudra déterminer. Le but est donc de trouver les paramètres a et b tels que la distance entre chaque point du nuage et la droite du modèle soit la plus petite possible.&lt;br /&gt;
Mathématiquement, il suffit de résoudre cette formule:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression2.png|200px|thumb|right|Méthode des moindres carrés illustrée]]&lt;br /&gt;
[[Fichier:regression3.png]]&lt;br /&gt;
&lt;br /&gt;
On utilise donc la méthode des moindres carrés pour mesurer l'erreur entre le modèle de prédiction et les données et ainsi fabriquer notre fonction coût :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression4.png]]&lt;br /&gt;
&lt;br /&gt;
avec m le nombre de points du nuage.&lt;br /&gt;
&lt;br /&gt;
L'objectif de l'algorithme est donc de trouver les paramètres optimaux qui minimisent cette fonction J.&lt;br /&gt;
En machine learning, une des méthodes les plus populaires pour faire ceci est la descente de gradient, car c'est une méthode adaptée quand on fait du traitement de grosses dataset (&amp;quot;faible&amp;quot; temps de calcul). En effet, la fonction coût J est une parabole admettant un unique minimum dépendant des paramètres a et b. La descente de gradient consiste à chercher le point de celle-ci où la dérivée est nulle (donc le minimum)&lt;br /&gt;
&lt;br /&gt;
===Méthode de la descente du gradient===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression6.png|200px|thumb|right|Méthode gradient]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression7.png|200px|thumb|right|Généralisation gradient fct parabolique]]&lt;br /&gt;
&lt;br /&gt;
Soit une fonction parabolique ne dépendant que de x. On cherche à trouver le minimum de cette fonction en utilisant la méthode de la descente du gradient&lt;br /&gt;
Pour cela on choisit un point aléatoirement &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;et on va descendre à partir de celui-ci jusqu'à atteindre un minimum en utilisant&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression5.png]]&lt;br /&gt;
&lt;br /&gt;
avec un paramètre  qui influencera la taille du pas de la descente.&lt;br /&gt;
&lt;br /&gt;
Il faut faire attention à ne pas prendre un pas trop grand, ni trop petit, pour éviter de &amp;quot;tourner&amp;quot; autour du minimum ou de prendre trop de temps pour l'atteindre.&lt;br /&gt;
Note : On peut généraliser cela pour une fonction parabolique à n paramètres qui aurait donc une forme de bol.&lt;br /&gt;
&lt;br /&gt;
===Application sur notre fonction coût===&lt;br /&gt;
&lt;br /&gt;
Notre fonction coût dépend des 2 paramètres a et b :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression8.png]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression9.png]]&lt;br /&gt;
&lt;br /&gt;
On choisit &amp;lt;math&amp;gt;a_0&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; aléatoirement et on applique ceci pour un pas :&lt;br /&gt;
&lt;br /&gt;
Avec &lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression10.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d'un certain nombre d'itérations on trouve le couple &amp;lt;math&amp;gt;(a,b)&amp;lt;/math&amp;gt; qui minimise notre fonction coût.&lt;br /&gt;
&lt;br /&gt;
Note : Nous avons démontré la théorie de la régression linéaire affine mais on pourrait généraliser celle-ci pour un modèle polynomiale d’ordre n, la courbe de prédiction serait donc parabolique et il faudrait trouver le tuple &amp;lt;math&amp;gt;(a_1,a_2,...,a_n)&amp;lt;/math&amp;gt; qui minimise la fonction coût.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression logistique binaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo1.png|200px|thumb|right|Modèle régression logistique]]&lt;br /&gt;
&lt;br /&gt;
La régression logistique binaire est un algorithme de classification, contrairement à la régression linéaire qui est un algorithme de prédiction. De la même façon que la régression linéaire,  il s'agit de modéliser au mieux un modèle mathématique simple à des observations réelles nombreuses. Cette méthode se base sur de l’analyse mathématiques et statistique. Il faut donc associer à des “features” &amp;lt;math&amp;gt;(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; une variable Y valant 1 ou 0 (d’où le terme classification binaire).&lt;br /&gt;
&lt;br /&gt;
L’objectif de l’algorithme est donc de trouver la fonction F dépendant d’une loi de probabilité telle que :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo2.png]]&lt;br /&gt;
&lt;br /&gt;
avec S un certain seuil (fixé la plupart du temps à 0,5).&lt;br /&gt;
&lt;br /&gt;
===Modèle===&lt;br /&gt;
&lt;br /&gt;
Comme cette méthode repose principalement sur des statistiques, il est important d’adopter une notation explicite lors de l’explication théorique :&lt;br /&gt;
&lt;br /&gt;
* On notera Y la variable à prédire (qui vaudra 0 ou 1) et &amp;lt;math&amp;gt;X=(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; les variables permettant de prédire Y&lt;br /&gt;
* On travaillera dans un univers  de N échantillons (taille de la dataset)&lt;br /&gt;
* On notera &amp;lt;math&amp;gt;P(Y=1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;P(Y=0)&amp;lt;/math&amp;gt; les probabilités que Y valent respectivement 1 ou 0 &amp;lt;math&amp;gt;p(1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0)&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;p(X|1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(X|0)&amp;lt;/math&amp;gt; sont les distributions conditionnelles des caractéristiques X sachant la valeur prise par Y&lt;br /&gt;
* &amp;lt;math&amp;gt;p(1|X)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0|X)&amp;lt;/math&amp;gt; sont donc les probabilités d’obtenir la valeur de Y (1 ou 0) sachant les valeurs de X&lt;br /&gt;
&lt;br /&gt;
La régression logistique utilise l’hypothèse fondamentale (mesure de l’évidence) :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo3.png]]&lt;br /&gt;
&lt;br /&gt;
On en déduit donc (comme &amp;lt;math&amp;gt;p(0|X)=1-p(1|X))&amp;lt;/math&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo4.png]]&lt;br /&gt;
&lt;br /&gt;
Avec &amp;lt;math&amp;gt;(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; des variables à déterminer.&lt;br /&gt;
&lt;br /&gt;
''Note :'' ce modèle est appelé modèle LOGIT.&lt;br /&gt;
&lt;br /&gt;
===Estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
Contrairement à la régression linéaire affine, on ne peut pas utiliser la méthode des moindres carrés, on utilise alors la méthode de maximisation de la vraisemblance.&lt;br /&gt;
“La vraisemblance mesure une adéquation entre la distribution observée sur un échantillon aléatoire et une loi de probabilité supposée décrire une réalité sur la population dont l'échantillon est issu.” (source : [www.jybaudot.fr])&lt;br /&gt;
&lt;br /&gt;
Le calcul de la vraisemblance L dans un univers  de N échantillons est le suivant :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo5.png]]&lt;br /&gt;
&lt;br /&gt;
Plus la vraisemblance est élevée, alors plus la loi de probabilité est proche de la réalité. Le but est donc de maximiser cette valeur et de trouver les valeurs optimales de &amp;lt;math&amp;gt;A =(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; qui influent directement sur la loi de probabilité établie dans la partie modèle.&lt;br /&gt;
&lt;br /&gt;
===Algorithme d'optimisation===&lt;br /&gt;
&lt;br /&gt;
Afin de trouver la valeur optimale du vecteur A, nous utiliserons encore une fois la méthode de descente du gradient adaptée à notre cas.&lt;br /&gt;
&lt;br /&gt;
Celle-ci utilise la relation suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo6.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d’un certain nombre d’itérations, on trouvera la valeur optimale de A afin de maximiser la vraisemblance.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Mise en pratique''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Pour la mise en pratique, nous avons décidé d’appliquer les méthodes sur un dataset de prédiction de maintenance pour l’industrie, nous importons grâce à la librairie panda : &amp;lt;code&amp;gt; dataset = pd.read_csv('ai4i2020.csv') &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette dataset contient 14 colonnes de données, nous pouvons visualiser la proportion de données saines et non-saines par ce code seaborn : &amp;lt;code&amp;gt; sns.factorplot('Machine failure',data=dataset,kind='count') &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on traitera cette dataset pour la préparer sur l’intervention des modèles de machine learning, puis on appliquera ces méthodes.&lt;br /&gt;
&lt;br /&gt;
==Pré-traitement de la dataset==&lt;br /&gt;
&lt;br /&gt;
Avant d’appliquer les algorithme sur notre dataset, il faut la traiter, le traitement sera le même pour tous les algorithmes et suivra cet ordre :&lt;br /&gt;
* Traitement des valeurs manquantes&lt;br /&gt;
* Équilibrage des données&lt;br /&gt;
* Séparations des données en entrainement et test&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous devons regarder si notre base de données contient des valeurs manquante, pour cela nous implantons ce code : &lt;br /&gt;
&lt;br /&gt;
   import missingno as msno&lt;br /&gt;
   msno.matrix(dataset)&lt;br /&gt;
&lt;br /&gt;
Les lignes blanches dans le résultat correspond aux valeurs manquantes, ci-dessous nous voyons que nous avons aucune données manquantes dans la base que nous avons importer : [[Fichier:Miseenpratique.png]]&lt;br /&gt;
&lt;br /&gt;
Dans le cas, où nous avons des valeurs manquante, il y a plusieurs méthodes pour traiter les valeurs manquantes mais nous retenons 2 méthodes :&lt;br /&gt;
* Une méthode qui consiste à supprimer les lignes où des valeurs manquantes sont présentes : &amp;lt;code&amp;gt; data.dropna(inplace=True) &amp;lt;/code&amp;gt;&lt;br /&gt;
L’avantage de cette méthode est de créer un modèle robuste. L’inconvénient majeur est le fait qu’on peut perdre énormément de données, pour des données où les valeurs manquantes sont excessives, mieux vaut appliquer une autre méthode.&lt;br /&gt;
&lt;br /&gt;
* Une méthode qui consiste à remplacer les valeurs manquantes par la moyenne des données de la colonne : &amp;lt;code&amp;gt; data[0]=drop[0].replace(np.NaN,data[0].mean()) &amp;lt;/code&amp;gt; L’avantage de cette méthode permet d’éviter la suppression de lignes, ce qui permet de garder les autres données comparé à l’autre méthode. Cependant cette méthode n’est que applicable sur les données numériques&lt;br /&gt;
&lt;br /&gt;
Nous passons alors sur l'équilibrage des données. Avant d’appliquer la méthode SMOTE, nous devons mettre dans 2 variables, la target (y) et les features (X) :&lt;br /&gt;
&lt;br /&gt;
   X = dataset.drop(['Machine failure','UDI','Product ID','Type','TWF','HDF','PWF','OSF','RNF'],axis=1).values&lt;br /&gt;
   y = dataset['Machine failure']&lt;br /&gt;
&lt;br /&gt;
Notre target sera seulement ‘Machine failure’ et nos features seront : la température de l’air, la température du processus, le couple, et l’usure des outils.&lt;br /&gt;
&lt;br /&gt;
Durant notre projet , nous avons implémenté la technique SMOTE pour traiter les ensembles de données déséquilibrées.&lt;br /&gt;
Le principe de SMOTE est de générer de nouveaux échantillons en combinant les données de la classe minoritaire avec celles de leurs voisins proches. Techniquement, on peut décomposer SMOTE en 5 étapes :&lt;br /&gt;
* 1 - Choix d’un vecteur caractéristique de notre classe minoritaire que nous appellerons vc &lt;br /&gt;
* 2 - Sélection des k-voisins les plus proches (k=5 par défaut) et choix de l’un d’eux au hasard que l’on appellera pv &lt;br /&gt;
* 3 - Calcul de la différence pour chaque valeur caractéristique (feature value) i, vc[i]-pv[i] et multiplication de celle-ci par un nombre aléatoire entre [0,1]&lt;br /&gt;
* 4 - Ajout du résultat précédent à la valeur de la caractéristique i du vecteur vc afin d’obtenir un nouveau point (une nouvelle donnée) dans l’espace des caractéristiques &lt;br /&gt;
* 5 - Répétition de ces opérations pour chaque point de données de la classe minoritaire &lt;br /&gt;
Nous remarquons que cette technique marche après smote (50% données saines, 50% données non-saines)&lt;br /&gt;
&lt;br /&gt;
Code : &lt;br /&gt;
&lt;br /&gt;
   oversample = SMOTE()&lt;br /&gt;
   Xsmote, ysmote = oversample.fit_resample(X,y)&lt;br /&gt;
   Xsmote = pd.DataFrame(Xsmote)&lt;br /&gt;
   ysmote = pd.DataFrame(ysmote)&lt;br /&gt;
   X=Xsmote&lt;br /&gt;
   y=ysmote&lt;br /&gt;
&lt;br /&gt;
On remarque que la technique smote a ajouté 9322 lignes sur notre base, Maintenant que nous avons un équilibre entre les données ‘sains’ et ‘malsains’, nous pouvons voir la répartitions des points sur 2 axes :&lt;br /&gt;
&lt;br /&gt;
(image)&lt;br /&gt;
&lt;br /&gt;
Nous pouvons alors procéder à la séparation de nos données en données d'entraînement et de test&lt;br /&gt;
&lt;br /&gt;
Nous devons séparer en deux nos données pour pouvoir appliquer les algorithmes de machine learning, ainsi : &lt;br /&gt;
Les données d'entraînement serviront de repères pour l’algorithme&lt;br /&gt;
Les données de test seront entraînées par celle d’entrainement pour créer une prédiction&lt;br /&gt;
&lt;br /&gt;
Nous allons utiliser la fonction train_test_split de la librairie sklearn pour séparer nos données : &lt;br /&gt;
&lt;br /&gt;
   X_train, X_test, y_train, y_test = train_test_split(X,y, test_size = 0.2, random_state = 100)&lt;br /&gt;
&lt;br /&gt;
Ici dans les paramètres :&lt;br /&gt;
X  correspond aux features&lt;br /&gt;
y correspond à la target&lt;br /&gt;
test_size correspond au pourcentage de séparation (soit 0.2 = 20% test et 80% d'entraînement)&lt;br /&gt;
random_state permet d’initialiser le choix aléatoire pour avoir la même répartition à chaque exécution&lt;br /&gt;
&lt;br /&gt;
Maintenant nous pouvons appliquer les algorithme à notre modèle&lt;br /&gt;
&lt;br /&gt;
==Application des algorithmes==&lt;br /&gt;
&lt;br /&gt;
En général, nous allons appliquer les algorithme en suivant cet ordre : &lt;br /&gt;
* Importation de la méthode sur la librairie sklearn&lt;br /&gt;
* Entraînement des données&lt;br /&gt;
* Prédiction&lt;br /&gt;
* Méthodes d’évaluations&lt;br /&gt;
&lt;br /&gt;
===Régression linéaire===&lt;br /&gt;
&lt;br /&gt;
Nous allons commencer par le plus simple : la régression linéaire, nous commençons par importer l’algorithme à partir de la librairie sklearn : &amp;lt;code&amp;gt; from sklearn.linear_model import LinearRegression &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis nous appelons l’algorithme avec les paramètres de base, puis nous entraînons notre dataset : &lt;br /&gt;
   #Méthode de régréssion linéaire&lt;br /&gt;
   lr = LinearRegression()&lt;br /&gt;
   #Training&lt;br /&gt;
   lr.fit(X_train,y_train)&lt;br /&gt;
&lt;br /&gt;
Ensuite la prédiction : &lt;br /&gt;
   #Prediction&lt;br /&gt;
   y_pred = lr.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
Et enfin l'évaluation, nous avons vu 2 méthodes pour évaluer notre modèle : &lt;br /&gt;
* Afficher le score de prédiction&lt;br /&gt;
* Afficher la matrice de confusion, une matrice de taille 2x2 qui donne ces informations : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatrixConfusion.png]]&lt;br /&gt;
&lt;br /&gt;
Le score de prédiction (accuracy) est également calculé à partir de cette matrice&lt;br /&gt;
Pour la régression linéaire, nous allons qu’afficher le score de prédiction, car cet algorithme nous donne en retour des valeurs non-binaire, la construction d’une matrice de confusion et impossible.&lt;br /&gt;
&lt;br /&gt;
   #Evaluation&lt;br /&gt;
   print(lr.score(X_test,y_test))&lt;br /&gt;
&lt;br /&gt;
Nous obtenons ainsi un score de 0.48, un score qui est plus élevé sans la méthode SMOTE (0.14), sauf que cette méthode n’est pas la plus optimisée pour cette base de données, car nous avons en target des valeurs binaires. Il vaut mieux appliquer la méthode de régression logistique ou la méthode de Naives-Bayes.&lt;br /&gt;
&lt;br /&gt;
===Régression logistique===&lt;br /&gt;
&lt;br /&gt;
Dans le même modèle que la régression linéaire, nous procédons à l’import de la méthode, l’appel de la méthode, l'entraînement des données et de la prédiction :&lt;br /&gt;
&lt;br /&gt;
   from sklearn import linear_model&lt;br /&gt;
&lt;br /&gt;
   #Modèle régression logistique&lt;br /&gt;
   modele_regLog = linear_model.LogisticRegression() &lt;br /&gt;
   #random_state = 100, solver = 'liblinear', multi_class = 'auto'&lt;br /&gt;
&lt;br /&gt;
   #training&lt;br /&gt;
   modele_regLog.fit(X_train,y_train)&lt;br /&gt;
&lt;br /&gt;
   #prediction&lt;br /&gt;
   y_pred = modele_regLog.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
   #précision du modèle&lt;br /&gt;
   precision = modele_regLog.score(X_test,y_test)&lt;br /&gt;
   print(precision)&lt;br /&gt;
&lt;br /&gt;
Pour la régression logistique, nous allons afficher la matrice de confusion et le score :&lt;br /&gt;
&lt;br /&gt;
   from sklearn.metrics import plot_confusion_matrix&lt;br /&gt;
   plot_confusion_matrix(modele_regLog, X_test, y_test)  &lt;br /&gt;
   plt.show() &lt;br /&gt;
&lt;br /&gt;
(images)&lt;br /&gt;
&lt;br /&gt;
Nous obtenons un score de 0.82, contre 0.97 sans la méthode de SMOTE, ce qui est cohérent car le score obtenu sans SMOTE n’est pas précis car il y avait peu de données où la machine a planté. Avec SMOTE, nous obtenons certes un score moins élevé mais plus précis.&lt;br /&gt;
Grâce à la matrice de confusion nous pouvons voir que : &lt;br /&gt;
* Il y a 2396 fois où l’algorithme a prédit Machine failure = 0 et a eu raison&lt;br /&gt;
* Il y a 2377 fois où l’algorithme a prédit Machine failure = 1 et a eu raison&lt;br /&gt;
* Il y a 546 fois où l’algorithme a prédit Machine failure = 1 et a eu faux&lt;br /&gt;
* Il y a 478 fois où l’algorithme a prédit Machine failure = 0 et a eu faux&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 0px; padding: 20px; font-weight: bold; text-align: center; font-size: 80%; background: #61798F; vertical-align: top; width: 100%;&amp;quot;&amp;gt; '''PARTIE II (S8)''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Développement du projet''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Durant les deux premiers semestres, nous avons découvert et étudié le Machine Learning, que ce soit la théorie de différents algorithmes connus ou l'application à pratique à des datasets que nous pouvons récupérer sur Internet ou bien les créer nous même. La création de notre dataset ayant été fastidieuse et peu concluante (voir résultats précédents), nous avons comme objectif pour ce semestre d'implémenter nos algorithmes (et principalement le réseau de neurones) à des machines dont nous avons accès à l'école.&lt;br /&gt;
&lt;br /&gt;
Après discussion avec notre tuteur de projet Monsieur Lakhal, nous avons décidé d'utiliser des Robotino plutôt que d'utiliser la chaîne de production présente à l'école car il existe des logiciels simples permettant d'effectuer des simulations de réseaux logistiques de Robotinos (Robotino View et Robotino Simulation) dont nous allons récupérer les données en temps réel et les traiter sur Matlab à l'aide de notre algorithme de réseaux de neurones.&lt;br /&gt;
&lt;br /&gt;
L'objectif est ainsi de réaliser le scénario d'un réseau logistique (à l'image d'Amazon par exemple) composé de plusieurs Robotino effectuant chacun une tache et d'y introduire des erreurs puis de les traiter afin de ne pas perturber la logistique.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Élaboration du scénario''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Traitement des erreurs''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
=Recherche bibliographique=&lt;br /&gt;
&lt;br /&gt;
* https://www.wikipedia.com&lt;br /&gt;
&lt;br /&gt;
* https://www.jybaudot.fr&lt;br /&gt;
&lt;br /&gt;
* https://datascientest.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.ipgirl.com&lt;br /&gt;
&lt;br /&gt;
* Cours de probabilités et statistiques de l’Université Jules Vernes&lt;br /&gt;
&lt;br /&gt;
* Chaine youtube Machine Learning : https://www.youtube.com/channel/UCmpptkXu8iIFe6kfDK5o7VQ&lt;br /&gt;
&lt;br /&gt;
* Machine Learning with scikit-learn Quick Start Guide écrit par Kevin Jolly&lt;br /&gt;
&lt;br /&gt;
* https://lucidar.me/&lt;br /&gt;
&lt;br /&gt;
* https://archive.ics.uci.edu/ml/datasets.php&lt;br /&gt;
&lt;br /&gt;
* https://www.kaggle.com/datasets&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com/&lt;br /&gt;
&lt;br /&gt;
* Machine Learning algorithms - Second Edition écrit par Giuseppe Bonaccorso&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com&lt;br /&gt;
&lt;br /&gt;
* https://towardsdatascience.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.learndatasci.com/&lt;br /&gt;
&lt;br /&gt;
==Rapports et présentation==&lt;br /&gt;
&lt;br /&gt;
===Librairies===&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1CQZ1s6fNY_6MsmbBa5TP1OzSedqFeaWI?usp=sharing/ Rapport Numpy]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1tdu_B2wRsUiqdnSeskQENdn_wX3pJMeT?usp=sharing/ Rapport Pandas]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1DPS4ZT91SIEhscwST8kfER7u21tKoM3a?usp=sharing/ Rapport Seaborn]&lt;br /&gt;
&lt;br /&gt;
===Rapports===&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/document/d/1yR0vLePV3hI1_HVtTZWwGIwy0Cb-oLOsOTK3Um5KAYE/edit?usp=sharing/ Rapport]&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/presentation/d/1Je_yF0dgc-s9gB7LLsfOg0b05xcwIFJbaqpVytxWv5A/edit?usp=sharing/ Présentation]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1y_NMo9XKJ0WzwE2zmcRblUyuIebwfoN8?usp=sharing/ Régression linéaire]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1bRyrnL1JM870cEcEvfGaS8ItrG16rchy?usp=sharing/ Google Colab]&lt;/div&gt;</summary>
		<author><name>Abrossas</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88028</id>
		<title>IMA3/IMA4 2020/2022 P5</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88028"/>
				<updated>2022-02-09T17:42:29Z</updated>
		
		<summary type="html">&lt;p&gt;Abrossas : /*  Développement du projet  */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 0px; padding: 20px; font-weight: bold; text-align: center; font-size: 80%; background: #61798F; vertical-align: top; width: 100%;&amp;quot;&amp;gt; '''PARTIE I (S6-S7)''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Introduction et cahier des charges''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce projet est la mise en place d’algorithmes de machine Learning afin de diagnostiquer l’état de machines industrielles. Nous travaillerons sur ce projet durant 2 semestres. &lt;br /&gt;
Durant le premier semestre, nous avions comme objectifs d’acquérir la maîtrise des différentes librairies primordiales pour traiter les données en machine Learning, ainsi que d’étudier et d’utiliser certains algorithmes basiques (régression linéaire, logistique, Bayes) sur des datasets que nous traiterons nous même. &lt;br /&gt;
Pour ce qui est du second semestre, notre objectif était de concrétiser les connaissances acquises durant le premier semestre. Nous avons donc essayé de créer notre propre dataset à l’aide des matériels mis à notre disposition, de la prétraiter et d’y appliquer différents algorithmes de Machine Learning en critiquant les résultats.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning pour la détection de défaut s'inscrit parfaitement dans le contexte scientifique actuel, notamment grâce à l’industrie 4.0.&lt;br /&gt;
En effet, cette nouvelle industrie fait apparaître des systèmes communicants (l’IOT : Internet Of Things) interconnectés les uns entre les autres. Ces différents systèmes peuvent êtres nécessaires les uns, les autres afin de réaliser une tâche complexe telle que l'usinage de pièces. Le système devient dès lors potentiellement extrêmement fragile aux pannes.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning a pour but de pouvoir détecter, et localiser les pannes, voir les futures pannes potentielles afin de pouvoir dans un premier temps prévenir un opérateur. Mais il peut aussi potentiellement permettre au système de continuer de tourner, en attendant un technicien. Le machine Learning peut donc aussi permettre à une chaîne de production de continuer de tourner par l’envoie d’un autre robot par exemple, le temps que la panne soit réparée.&lt;br /&gt;
&lt;br /&gt;
Dans le schéma ci-dessous nous avons un exemple de système de système.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Intro1.png|500px|thumb|center|Schéma d'un système de systèmes]]&lt;br /&gt;
&lt;br /&gt;
Il y a deux cas de figure:&lt;br /&gt;
* Un autre système peut être envoyé pour remplacer le système 4.&lt;br /&gt;
* Les systèmes 1 et 2 peuvent permettre à la chaîne de production de continuer de tourner&lt;br /&gt;
* La chaîne de production est hors service jusqu'à réparation.&lt;br /&gt;
&lt;br /&gt;
==Cahier de charges==&lt;br /&gt;
&lt;br /&gt;
'''Ressources disponibles :'''&lt;br /&gt;
&lt;br /&gt;
* Livres sur le machine learning &lt;br /&gt;
* Bases de données (afin d'appliquer divers algorithmes de machine learning) que nous prendrons sur ces sites : [https://www.kaggle.com/datasets] et [https://archive.ics.uci.edu/ml/datasets.php]&lt;br /&gt;
* Librairies Python (Scikit-learn, Pandas, Numpy, Seaborn, Matplotlib)&lt;br /&gt;
* Google Colab&lt;br /&gt;
* Matlab (version étudiante)&lt;br /&gt;
&lt;br /&gt;
'''Objectifs poursuivis :'''&lt;br /&gt;
&lt;br /&gt;
* Détecter les dysfonctionnements de systèmes mécatroniques (par exemple les robots Khepera, Robotino…), grâce au machine learning.&lt;br /&gt;
* Apprendre à implémenter différentes méthodes machine learning .&lt;br /&gt;
&lt;br /&gt;
'''Profil du public cible :'''&lt;br /&gt;
* Secteur mécatronique&lt;br /&gt;
* Entreprises disposant d'ingénieurs pour maintenir le système informatique opérationnel&lt;br /&gt;
* Entreprises utilisant des machines dans le secteur public.&lt;br /&gt;
&lt;br /&gt;
'''Analyse des besoins :'''&lt;br /&gt;
* L’industrie a de plus en plus besoin du machine learning pour détecter les erreurs des systèmes. En effet, cette technologie devient indispensable pour les industriels, notamment afin d'accroître la productivité et l’efficacité des systèmes industriels.&lt;br /&gt;
* Le programme peut ne pas être aussi rapide et optimisé en espace mémoire que d'autres programmes, nous visons l’efficacité de notre algorithme plutôt que la rapidité.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Librairies''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
En Machine Learning, il est très important, voire primordial, de savoir manipuler les différentes librairies mises à notre disposition afin de visualiser, traiter nos différentes dataset ou même appliquer les différents algorithmes de machine Learning.&lt;br /&gt;
Durant les premières semaines de notre projet, nous avons donc appris à utiliser ces différentes librairies nécessaires pour le machine Learning, telles que Numpy, Seaborn, Panda, Matplotlib, Scikit-learn... Nous allons dans un premier temps nous intéresser à l'importation des différentes bibliothèques puis résumer les commandes importantes de ces différentes librairies.&lt;br /&gt;
&lt;br /&gt;
Ces différentes librairies ne sont pas incluses de base dans Python, il est donc nécessaire de les ajouter à Python puis à notre programme.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc choisi d'utiliser google colab car ces librairies y sont déjà installées (et aussi pratique pour travailler à plusieurs sur un même code).&lt;br /&gt;
Puis nous devons importer ces bibliothèques au début de notre programme.&lt;br /&gt;
&lt;br /&gt;
Attention : Plusieurs bibliothèques peuvent avoir la même commande mais avec des significations différentes, comme par exemple la commande randint du module numpy et celle du module random et cela peut conduire à des erreurs. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de pallier à ces problèmes nous apporterons nos librairie au début de nos programmes comme suit :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:librairies1.png]]&lt;br /&gt;
&lt;br /&gt;
Ici le np permet de dire que lorsque nous utilisons np.array alors nous utilisons la commande array () contenu dans la bibliothèque Numpy.&lt;br /&gt;
&lt;br /&gt;
Ceci nous permettra d’utiliser en simultané différentes librairies, toutes les bibliothèques seront importées selon ce schéma.&lt;br /&gt;
Nous allons par la suite, nous intéresser à différentes commandes incluses dans ces librairies.&lt;br /&gt;
&lt;br /&gt;
==Numpy==&lt;br /&gt;
&lt;br /&gt;
Numpy est une bibliothèque dédiée aux calculs mathématiques et à la gestion des listes (telles que des matrices).&lt;br /&gt;
Matplotlib, quant à lui, est dédié aux affichages graphiques de données.&lt;br /&gt;
Nous allons dans cette partie nous intéresser aux commandes principales de ces deux bibliothèques de python.&lt;br /&gt;
&lt;br /&gt;
Sous numpy, les tableaux sont des types array, ils définissent l'équivalent des tableaux statiques en langage C. La taille d’un tableau numpy ne peut donc pas être changée après leur création. &lt;br /&gt;
&lt;br /&gt;
Néanmoins grâce a Numpy nous pouvons simplement effectuer des tâches sur les tableaux comme en extraire un sous tableaux, et d’effectuer simplement les produits entre matrice, vecteur.&lt;br /&gt;
&lt;br /&gt;
Dans notre projet, nous utiliserons plus courament les fonctions : &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.shape&amp;lt;/FONT&amp;gt; permet d’obtenir la taille de la matrice sous forme d’un tuple, suffit de choisir le bon numéro&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.zeros&amp;lt;/FONT&amp;gt; permet de créer une ligne de x zéro(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.ones&amp;lt;/FONT&amp;gt; permet de créer une ligne de x un(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.vstack&amp;lt;/FONT&amp;gt; permet de rajouter des lignes dans une matrice déjà créer en paramètre&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.transpose&amp;lt;/FONT&amp;gt; permet de transposer une matrice en paramètre&lt;br /&gt;
&lt;br /&gt;
==Seaborn==&lt;br /&gt;
&lt;br /&gt;
Seaborn est une bibliothèque de visualisation de données Python basée sur matplotlib. Il fournit une interface de haut niveau pour dessiner des graphiques statistiques attrayants et informatifs.&lt;br /&gt;
&lt;br /&gt;
'''Différences entre Matplotlib et Seaborn'''&lt;br /&gt;
&lt;br /&gt;
Les défauts de Matplotlib qui ne parlent généralement pas aux utilisateurs sont les couleurs, les marques de tiques sur les axes supérieur et droit, le style,...&lt;br /&gt;
Les exemples ci-dessus rendent également une autre frustration des utilisateurs plus apparente: le fait que travailler avec DataFrames ne va pas aussi bien avec Matplotlib, ce qui peut être ennuyeux si vous faites une analyse exploratoire avec Pandas. Et c’est exactement ce que Seaborn adresse : les fonctions de traçage fonctionnent sur dataframes et tableaux qui contiennent tout un ensemble de données.&lt;br /&gt;
[[Fichier:seaborn1.png|300px|thumb|right|Résultat du code python ci gauche]]&lt;br /&gt;
&lt;br /&gt;
   # Import necessary libraries&lt;br /&gt;
   import seaborn as sns&lt;br /&gt;
   import matplotlib.pyplot as plt&lt;br /&gt;
   &lt;br /&gt;
   # Load iris data&lt;br /&gt;
   iris = sns.load_dataset(&amp;quot;iris&amp;quot;) #DATASET ALREADY EXISTING&lt;br /&gt;
   &lt;br /&gt;
   # Construct iris plot&lt;br /&gt;
   sns.swarmplot(x=&amp;quot;species&amp;quot;, y=&amp;quot;petal_length&amp;quot;, data=iris)&lt;br /&gt;
   &lt;br /&gt;
   # Show plot&lt;br /&gt;
   plt.show()&lt;br /&gt;
&lt;br /&gt;
==Pandas==&lt;br /&gt;
&lt;br /&gt;
Pandas est une API d'analyse de données orientée colonnes. C'est un excellent outil pour manipuler et analyser des données d'entrée. Beaucoup de frameworks d'apprentissage automatique acceptent les structures de données Pandas en entrée.&lt;br /&gt;
&lt;br /&gt;
Comme évoqué précédemment, Pandas travaille avec des matrices colonnes communément appelées ‘Series’ mais aussi et surtout avec des tableaux de données appelés ‘DataFrames’.&lt;br /&gt;
Une Series est tout simplement une colonne et une DataFrame est un tableau à plusieurs dimensions constitué de Series.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Panda.JPG]]&lt;br /&gt;
&lt;br /&gt;
A l'aide de Pandas, on peut ainsi créer, importer, lire et manipuler des bases de données facilement.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Théories des algorithmes étudiés''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Il y a différents types d’algorithmes en machine learning, pour notre sujet qui consiste à classer des machines en défectueuse ou fonctionnelles (1 ou 0), nous aurons surtout besoin d’algorithmes de classification binaire. De manière générale, la conception de la plupart des algorithmes fonctionnent de cette manière : &lt;br /&gt;
&lt;br /&gt;
* Élaborer un modèle &lt;br /&gt;
* Établir une fonction coût pour celui-ci correspondant à l’erreur entre le modèle et les données réelles&lt;br /&gt;
* Trouver un algorithme de minimisation de cette fonction coût&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression linéaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression1.png|200px|thumb|right|Exemple de régression linéaire]]&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est un algorithme de prédiction et non un algorithme de classification, nous aurons surtout besoin de ce deuxième type d’algorithme pour notre projet mais nous tenons à présenter cet algorithme qui est le plus basique en machine learning et un bon début pour une formation pédagogique.&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est une méthode de modélisation qui cherche à établir une relation linéaire entre une ou des &amp;quot;features&amp;quot; (variables explicatives) et une &amp;quot;target&amp;quot; (variable expliquée qu'on cherche à prévoir à partir des variables explicatives). En machine learning, la régression linéaire est un modèle d'apprentissage supervisé, c'est-à-dire qu'on apprend à l'algorithme de prédiction à partir d'exemples dont on dispose dans une dataset. Nous nous intéresserons à la régression affine qui est la plus simple pour débuter.&lt;br /&gt;
&lt;br /&gt;
===Modèle et estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
La régression affine consiste donc à trouver un modèle de type&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt;y=ax+b&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
avec x une &amp;quot;feature&amp;quot;, y la target et avec a et b des paramètres qu'il nous faudra déterminer. Le but est donc de trouver les paramètres a et b tels que la distance entre chaque point du nuage et la droite du modèle soit la plus petite possible.&lt;br /&gt;
Mathématiquement, il suffit de résoudre cette formule:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression2.png|200px|thumb|right|Méthode des moindres carrés illustrée]]&lt;br /&gt;
[[Fichier:regression3.png]]&lt;br /&gt;
&lt;br /&gt;
On utilise donc la méthode des moindres carrés pour mesurer l'erreur entre le modèle de prédiction et les données et ainsi fabriquer notre fonction coût :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression4.png]]&lt;br /&gt;
&lt;br /&gt;
avec m le nombre de points du nuage.&lt;br /&gt;
&lt;br /&gt;
L'objectif de l'algorithme est donc de trouver les paramètres optimaux qui minimisent cette fonction J.&lt;br /&gt;
En machine learning, une des méthodes les plus populaires pour faire ceci est la descente de gradient, car c'est une méthode adaptée quand on fait du traitement de grosses dataset (&amp;quot;faible&amp;quot; temps de calcul). En effet, la fonction coût J est une parabole admettant un unique minimum dépendant des paramètres a et b. La descente de gradient consiste à chercher le point de celle-ci où la dérivée est nulle (donc le minimum)&lt;br /&gt;
&lt;br /&gt;
===Méthode de la descente du gradient===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression6.png|200px|thumb|right|Méthode gradient]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression7.png|200px|thumb|right|Généralisation gradient fct parabolique]]&lt;br /&gt;
&lt;br /&gt;
Soit une fonction parabolique ne dépendant que de x. On cherche à trouver le minimum de cette fonction en utilisant la méthode de la descente du gradient&lt;br /&gt;
Pour cela on choisit un point aléatoirement &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;et on va descendre à partir de celui-ci jusqu'à atteindre un minimum en utilisant&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression5.png]]&lt;br /&gt;
&lt;br /&gt;
avec un paramètre  qui influencera la taille du pas de la descente.&lt;br /&gt;
&lt;br /&gt;
Il faut faire attention à ne pas prendre un pas trop grand, ni trop petit, pour éviter de &amp;quot;tourner&amp;quot; autour du minimum ou de prendre trop de temps pour l'atteindre.&lt;br /&gt;
Note : On peut généraliser cela pour une fonction parabolique à n paramètres qui aurait donc une forme de bol.&lt;br /&gt;
&lt;br /&gt;
===Application sur notre fonction coût===&lt;br /&gt;
&lt;br /&gt;
Notre fonction coût dépend des 2 paramètres a et b :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression8.png]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression9.png]]&lt;br /&gt;
&lt;br /&gt;
On choisit &amp;lt;math&amp;gt;a_0&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; aléatoirement et on applique ceci pour un pas :&lt;br /&gt;
&lt;br /&gt;
Avec &lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression10.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d'un certain nombre d'itérations on trouve le couple &amp;lt;math&amp;gt;(a,b)&amp;lt;/math&amp;gt; qui minimise notre fonction coût.&lt;br /&gt;
&lt;br /&gt;
Note : Nous avons démontré la théorie de la régression linéaire affine mais on pourrait généraliser celle-ci pour un modèle polynomiale d’ordre n, la courbe de prédiction serait donc parabolique et il faudrait trouver le tuple &amp;lt;math&amp;gt;(a_1,a_2,...,a_n)&amp;lt;/math&amp;gt; qui minimise la fonction coût.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression logistique binaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo1.png|200px|thumb|right|Modèle régression logistique]]&lt;br /&gt;
&lt;br /&gt;
La régression logistique binaire est un algorithme de classification, contrairement à la régression linéaire qui est un algorithme de prédiction. De la même façon que la régression linéaire,  il s'agit de modéliser au mieux un modèle mathématique simple à des observations réelles nombreuses. Cette méthode se base sur de l’analyse mathématiques et statistique. Il faut donc associer à des “features” &amp;lt;math&amp;gt;(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; une variable Y valant 1 ou 0 (d’où le terme classification binaire).&lt;br /&gt;
&lt;br /&gt;
L’objectif de l’algorithme est donc de trouver la fonction F dépendant d’une loi de probabilité telle que :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo2.png]]&lt;br /&gt;
&lt;br /&gt;
avec S un certain seuil (fixé la plupart du temps à 0,5).&lt;br /&gt;
&lt;br /&gt;
===Modèle===&lt;br /&gt;
&lt;br /&gt;
Comme cette méthode repose principalement sur des statistiques, il est important d’adopter une notation explicite lors de l’explication théorique :&lt;br /&gt;
&lt;br /&gt;
* On notera Y la variable à prédire (qui vaudra 0 ou 1) et &amp;lt;math&amp;gt;X=(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; les variables permettant de prédire Y&lt;br /&gt;
* On travaillera dans un univers  de N échantillons (taille de la dataset)&lt;br /&gt;
* On notera &amp;lt;math&amp;gt;P(Y=1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;P(Y=0)&amp;lt;/math&amp;gt; les probabilités que Y valent respectivement 1 ou 0 &amp;lt;math&amp;gt;p(1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0)&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;p(X|1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(X|0)&amp;lt;/math&amp;gt; sont les distributions conditionnelles des caractéristiques X sachant la valeur prise par Y&lt;br /&gt;
* &amp;lt;math&amp;gt;p(1|X)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0|X)&amp;lt;/math&amp;gt; sont donc les probabilités d’obtenir la valeur de Y (1 ou 0) sachant les valeurs de X&lt;br /&gt;
&lt;br /&gt;
La régression logistique utilise l’hypothèse fondamentale (mesure de l’évidence) :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo3.png]]&lt;br /&gt;
&lt;br /&gt;
On en déduit donc (comme &amp;lt;math&amp;gt;p(0|X)=1-p(1|X))&amp;lt;/math&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo4.png]]&lt;br /&gt;
&lt;br /&gt;
Avec &amp;lt;math&amp;gt;(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; des variables à déterminer.&lt;br /&gt;
&lt;br /&gt;
''Note :'' ce modèle est appelé modèle LOGIT.&lt;br /&gt;
&lt;br /&gt;
===Estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
Contrairement à la régression linéaire affine, on ne peut pas utiliser la méthode des moindres carrés, on utilise alors la méthode de maximisation de la vraisemblance.&lt;br /&gt;
“La vraisemblance mesure une adéquation entre la distribution observée sur un échantillon aléatoire et une loi de probabilité supposée décrire une réalité sur la population dont l'échantillon est issu.” (source : [www.jybaudot.fr])&lt;br /&gt;
&lt;br /&gt;
Le calcul de la vraisemblance L dans un univers  de N échantillons est le suivant :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo5.png]]&lt;br /&gt;
&lt;br /&gt;
Plus la vraisemblance est élevée, alors plus la loi de probabilité est proche de la réalité. Le but est donc de maximiser cette valeur et de trouver les valeurs optimales de &amp;lt;math&amp;gt;A =(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; qui influent directement sur la loi de probabilité établie dans la partie modèle.&lt;br /&gt;
&lt;br /&gt;
===Algorithme d'optimisation===&lt;br /&gt;
&lt;br /&gt;
Afin de trouver la valeur optimale du vecteur A, nous utiliserons encore une fois la méthode de descente du gradient adaptée à notre cas.&lt;br /&gt;
&lt;br /&gt;
Celle-ci utilise la relation suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo6.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d’un certain nombre d’itérations, on trouvera la valeur optimale de A afin de maximiser la vraisemblance.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Mise en pratique''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Pour la mise en pratique, nous avons décidé d’appliquer les méthodes sur un dataset de prédiction de maintenance pour l’industrie, nous importons grâce à la librairie panda : &amp;lt;code&amp;gt; dataset = pd.read_csv('ai4i2020.csv') &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette dataset contient 14 colonnes de données, nous pouvons visualiser la proportion de données saines et non-saines par ce code seaborn : &amp;lt;code&amp;gt; sns.factorplot('Machine failure',data=dataset,kind='count') &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on traitera cette dataset pour la préparer sur l’intervention des modèles de machine learning, puis on appliquera ces méthodes.&lt;br /&gt;
&lt;br /&gt;
==Pré-traitement de la dataset==&lt;br /&gt;
&lt;br /&gt;
Avant d’appliquer les algorithme sur notre dataset, il faut la traiter, le traitement sera le même pour tous les algorithmes et suivra cet ordre :&lt;br /&gt;
* Traitement des valeurs manquantes&lt;br /&gt;
* Équilibrage des données&lt;br /&gt;
* Séparations des données en entrainement et test&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous devons regarder si notre base de données contient des valeurs manquante, pour cela nous implantons ce code : &lt;br /&gt;
&lt;br /&gt;
   import missingno as msno&lt;br /&gt;
   msno.matrix(dataset)&lt;br /&gt;
&lt;br /&gt;
Les lignes blanches dans le résultat correspond aux valeurs manquantes, ci-dessous nous voyons que nous avons aucune données manquantes dans la base que nous avons importer : [[Fichier:Miseenpratique.png]]&lt;br /&gt;
&lt;br /&gt;
Dans le cas, où nous avons des valeurs manquante, il y a plusieurs méthodes pour traiter les valeurs manquantes mais nous retenons 2 méthodes :&lt;br /&gt;
* Une méthode qui consiste à supprimer les lignes où des valeurs manquantes sont présentes : &amp;lt;code&amp;gt; data.dropna(inplace=True) &amp;lt;/code&amp;gt;&lt;br /&gt;
L’avantage de cette méthode est de créer un modèle robuste. L’inconvénient majeur est le fait qu’on peut perdre énormément de données, pour des données où les valeurs manquantes sont excessives, mieux vaut appliquer une autre méthode.&lt;br /&gt;
&lt;br /&gt;
* Une méthode qui consiste à remplacer les valeurs manquantes par la moyenne des données de la colonne : &amp;lt;code&amp;gt; data[0]=drop[0].replace(np.NaN,data[0].mean()) &amp;lt;/code&amp;gt; L’avantage de cette méthode permet d’éviter la suppression de lignes, ce qui permet de garder les autres données comparé à l’autre méthode. Cependant cette méthode n’est que applicable sur les données numériques&lt;br /&gt;
&lt;br /&gt;
Nous passons alors sur l'équilibrage des données. Avant d’appliquer la méthode SMOTE, nous devons mettre dans 2 variables, la target (y) et les features (X) :&lt;br /&gt;
&lt;br /&gt;
   X = dataset.drop(['Machine failure','UDI','Product ID','Type','TWF','HDF','PWF','OSF','RNF'],axis=1).values&lt;br /&gt;
   y = dataset['Machine failure']&lt;br /&gt;
&lt;br /&gt;
Notre target sera seulement ‘Machine failure’ et nos features seront : la température de l’air, la température du processus, le couple, et l’usure des outils.&lt;br /&gt;
&lt;br /&gt;
Durant notre projet , nous avons implémenté la technique SMOTE pour traiter les ensembles de données déséquilibrées.&lt;br /&gt;
Le principe de SMOTE est de générer de nouveaux échantillons en combinant les données de la classe minoritaire avec celles de leurs voisins proches. Techniquement, on peut décomposer SMOTE en 5 étapes :&lt;br /&gt;
* 1 - Choix d’un vecteur caractéristique de notre classe minoritaire que nous appellerons vc &lt;br /&gt;
* 2 - Sélection des k-voisins les plus proches (k=5 par défaut) et choix de l’un d’eux au hasard que l’on appellera pv &lt;br /&gt;
* 3 - Calcul de la différence pour chaque valeur caractéristique (feature value) i, vc[i]-pv[i] et multiplication de celle-ci par un nombre aléatoire entre [0,1]&lt;br /&gt;
* 4 - Ajout du résultat précédent à la valeur de la caractéristique i du vecteur vc afin d’obtenir un nouveau point (une nouvelle donnée) dans l’espace des caractéristiques &lt;br /&gt;
* 5 - Répétition de ces opérations pour chaque point de données de la classe minoritaire &lt;br /&gt;
Nous remarquons que cette technique marche après smote (50% données saines, 50% données non-saines)&lt;br /&gt;
&lt;br /&gt;
Code : &lt;br /&gt;
&lt;br /&gt;
   oversample = SMOTE()&lt;br /&gt;
   Xsmote, ysmote = oversample.fit_resample(X,y)&lt;br /&gt;
   Xsmote = pd.DataFrame(Xsmote)&lt;br /&gt;
   ysmote = pd.DataFrame(ysmote)&lt;br /&gt;
   X=Xsmote&lt;br /&gt;
   y=ysmote&lt;br /&gt;
&lt;br /&gt;
On remarque que la technique smote a ajouté 9322 lignes sur notre base, Maintenant que nous avons un équilibre entre les données ‘sains’ et ‘malsains’, nous pouvons voir la répartitions des points sur 2 axes :&lt;br /&gt;
&lt;br /&gt;
(image)&lt;br /&gt;
&lt;br /&gt;
Nous pouvons alors procéder à la séparation de nos données en données d'entraînement et de test&lt;br /&gt;
&lt;br /&gt;
Nous devons séparer en deux nos données pour pouvoir appliquer les algorithmes de machine learning, ainsi : &lt;br /&gt;
Les données d'entraînement serviront de repères pour l’algorithme&lt;br /&gt;
Les données de test seront entraînées par celle d’entrainement pour créer une prédiction&lt;br /&gt;
&lt;br /&gt;
Nous allons utiliser la fonction train_test_split de la librairie sklearn pour séparer nos données : &lt;br /&gt;
&lt;br /&gt;
   X_train, X_test, y_train, y_test = train_test_split(X,y, test_size = 0.2, random_state = 100)&lt;br /&gt;
&lt;br /&gt;
Ici dans les paramètres :&lt;br /&gt;
X  correspond aux features&lt;br /&gt;
y correspond à la target&lt;br /&gt;
test_size correspond au pourcentage de séparation (soit 0.2 = 20% test et 80% d'entraînement)&lt;br /&gt;
random_state permet d’initialiser le choix aléatoire pour avoir la même répartition à chaque exécution&lt;br /&gt;
&lt;br /&gt;
Maintenant nous pouvons appliquer les algorithme à notre modèle&lt;br /&gt;
&lt;br /&gt;
==Application des algorithmes==&lt;br /&gt;
&lt;br /&gt;
En général, nous allons appliquer les algorithme en suivant cet ordre : &lt;br /&gt;
* Importation de la méthode sur la librairie sklearn&lt;br /&gt;
* Entraînement des données&lt;br /&gt;
* Prédiction&lt;br /&gt;
* Méthodes d’évaluations&lt;br /&gt;
&lt;br /&gt;
===Régression linéaire===&lt;br /&gt;
&lt;br /&gt;
Nous allons commencer par le plus simple : la régression linéaire, nous commençons par importer l’algorithme à partir de la librairie sklearn : &amp;lt;code&amp;gt; from sklearn.linear_model import LinearRegression &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis nous appelons l’algorithme avec les paramètres de base, puis nous entraînons notre dataset : &lt;br /&gt;
   #Méthode de régréssion linéaire&lt;br /&gt;
   lr = LinearRegression()&lt;br /&gt;
   #Training&lt;br /&gt;
   lr.fit(X_train,y_train)&lt;br /&gt;
&lt;br /&gt;
Ensuite la prédiction : &lt;br /&gt;
   #Prediction&lt;br /&gt;
   y_pred = lr.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
Et enfin l'évaluation, nous avons vu 2 méthodes pour évaluer notre modèle : &lt;br /&gt;
* Afficher le score de prédiction&lt;br /&gt;
* Afficher la matrice de confusion, une matrice de taille 2x2 qui donne ces informations : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatrixConfusion.png]]&lt;br /&gt;
&lt;br /&gt;
Le score de prédiction (accuracy) est également calculé à partir de cette matrice&lt;br /&gt;
Pour la régression linéaire, nous allons qu’afficher le score de prédiction, car cet algorithme nous donne en retour des valeurs non-binaire, la construction d’une matrice de confusion et impossible.&lt;br /&gt;
&lt;br /&gt;
   #Evaluation&lt;br /&gt;
   print(lr.score(X_test,y_test))&lt;br /&gt;
&lt;br /&gt;
Nous obtenons ainsi un score de 0.48, un score qui est plus élevé sans la méthode SMOTE (0.14), sauf que cette méthode n’est pas la plus optimisée pour cette base de données, car nous avons en target des valeurs binaires. Il vaut mieux appliquer la méthode de régression logistique ou la méthode de Naives-Bayes.&lt;br /&gt;
&lt;br /&gt;
===Régression logistique===&lt;br /&gt;
&lt;br /&gt;
Dans le même modèle que la régression linéaire, nous procédons à l’import de la méthode, l’appel de la méthode, l'entraînement des données et de la prédiction :&lt;br /&gt;
&lt;br /&gt;
   from sklearn import linear_model&lt;br /&gt;
&lt;br /&gt;
   #Modèle régression logistique&lt;br /&gt;
   modele_regLog = linear_model.LogisticRegression() &lt;br /&gt;
   #random_state = 100, solver = 'liblinear', multi_class = 'auto'&lt;br /&gt;
&lt;br /&gt;
   #training&lt;br /&gt;
   modele_regLog.fit(X_train,y_train)&lt;br /&gt;
&lt;br /&gt;
   #prediction&lt;br /&gt;
   y_pred = modele_regLog.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
   #précision du modèle&lt;br /&gt;
   precision = modele_regLog.score(X_test,y_test)&lt;br /&gt;
   print(precision)&lt;br /&gt;
&lt;br /&gt;
Pour la régression logistique, nous allons afficher la matrice de confusion et le score :&lt;br /&gt;
&lt;br /&gt;
   from sklearn.metrics import plot_confusion_matrix&lt;br /&gt;
   plot_confusion_matrix(modele_regLog, X_test, y_test)  &lt;br /&gt;
   plt.show() &lt;br /&gt;
&lt;br /&gt;
(images)&lt;br /&gt;
&lt;br /&gt;
Nous obtenons un score de 0.82, contre 0.97 sans la méthode de SMOTE, ce qui est cohérent car le score obtenu sans SMOTE n’est pas précis car il y avait peu de données où la machine a planté. Avec SMOTE, nous obtenons certes un score moins élevé mais plus précis.&lt;br /&gt;
Grâce à la matrice de confusion nous pouvons voir que : &lt;br /&gt;
* Il y a 2396 fois où l’algorithme a prédit Machine failure = 0 et a eu raison&lt;br /&gt;
* Il y a 2377 fois où l’algorithme a prédit Machine failure = 1 et a eu raison&lt;br /&gt;
* Il y a 546 fois où l’algorithme a prédit Machine failure = 1 et a eu faux&lt;br /&gt;
* Il y a 478 fois où l’algorithme a prédit Machine failure = 0 et a eu faux&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 0px; padding: 20px; font-weight: bold; text-align: center; font-size: 80%; background: #61798F; vertical-align: top; width: 100%;&amp;quot;&amp;gt; '''PARTIE II (S8)''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Développement du projet''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Durant les deux premiers semestres, nous avons découvert et étudié le Machine Learning, que ce soit la théorie de différents algorithmes connus ou l'application à pratique à des datasets que nous pouvons récupérer sur Internet ou bien les créer nous même. La création de notre dataset ayant été fastidieuse et peu concluante (voir résultats précédents), nous avons comme objectif pour ce semestre d'implémenter nos algorithmes (et principalement le réseau de neurones) à des machines dont nous avons accès à l'école.&lt;br /&gt;
&lt;br /&gt;
Après discussion avec notre tuteur de projet Monsieur Lakhal, nous avons décidé d'utiliser des Robotino plutôt que d'utiliser la chaîne de production présente à l'école car il existe des logiciels simples permettant d'effectuer des simulations de réseaux logistiques de Robotinos (Robotino View et Robotino Simulation) dont nous allons récupérer les données en temps réel et les traiter sur Matlab à l'aide de notre algorithme de réseaux de neurones.&lt;br /&gt;
&lt;br /&gt;
L'objectif est ainsi de réaliser le scénario d'un réseau logistique (à l'image d'Amazon par exemple) composé de plusieurs Robotino effectuant chacun une tache et d'y introduire des erreurs puis de les traiter afin de ne pas perturber la logistique.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Élaboration du scénario''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
=Recherche bibliographique=&lt;br /&gt;
&lt;br /&gt;
* https://www.wikipedia.com&lt;br /&gt;
&lt;br /&gt;
* https://www.jybaudot.fr&lt;br /&gt;
&lt;br /&gt;
* https://datascientest.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.ipgirl.com&lt;br /&gt;
&lt;br /&gt;
* Cours de probabilités et statistiques de l’Université Jules Vernes&lt;br /&gt;
&lt;br /&gt;
* Chaine youtube Machine Learning : https://www.youtube.com/channel/UCmpptkXu8iIFe6kfDK5o7VQ&lt;br /&gt;
&lt;br /&gt;
* Machine Learning with scikit-learn Quick Start Guide écrit par Kevin Jolly&lt;br /&gt;
&lt;br /&gt;
* https://lucidar.me/&lt;br /&gt;
&lt;br /&gt;
* https://archive.ics.uci.edu/ml/datasets.php&lt;br /&gt;
&lt;br /&gt;
* https://www.kaggle.com/datasets&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com/&lt;br /&gt;
&lt;br /&gt;
* Machine Learning algorithms - Second Edition écrit par Giuseppe Bonaccorso&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com&lt;br /&gt;
&lt;br /&gt;
* https://towardsdatascience.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.learndatasci.com/&lt;br /&gt;
&lt;br /&gt;
==Rapports et présentation==&lt;br /&gt;
&lt;br /&gt;
===Librairies===&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1CQZ1s6fNY_6MsmbBa5TP1OzSedqFeaWI?usp=sharing/ Rapport Numpy]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1tdu_B2wRsUiqdnSeskQENdn_wX3pJMeT?usp=sharing/ Rapport Pandas]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1DPS4ZT91SIEhscwST8kfER7u21tKoM3a?usp=sharing/ Rapport Seaborn]&lt;br /&gt;
&lt;br /&gt;
===Rapports===&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/document/d/1yR0vLePV3hI1_HVtTZWwGIwy0Cb-oLOsOTK3Um5KAYE/edit?usp=sharing/ Rapport]&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/presentation/d/1Je_yF0dgc-s9gB7LLsfOg0b05xcwIFJbaqpVytxWv5A/edit?usp=sharing/ Présentation]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1y_NMo9XKJ0WzwE2zmcRblUyuIebwfoN8?usp=sharing/ Régression linéaire]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1bRyrnL1JM870cEcEvfGaS8ItrG16rchy?usp=sharing/ Google Colab]&lt;/div&gt;</summary>
		<author><name>Abrossas</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88027</id>
		<title>IMA3/IMA4 2020/2022 P5</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88027"/>
				<updated>2022-02-09T17:41:44Z</updated>
		
		<summary type="html">&lt;p&gt;Abrossas : /*  Développement du projet  */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 0px; padding: 20px; font-weight: bold; text-align: center; font-size: 80%; background: #61798F; vertical-align: top; width: 100%;&amp;quot;&amp;gt; '''PARTIE I (S6-S7)''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Introduction et cahier des charges''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce projet est la mise en place d’algorithmes de machine Learning afin de diagnostiquer l’état de machines industrielles. Nous travaillerons sur ce projet durant 2 semestres. &lt;br /&gt;
Durant le premier semestre, nous avions comme objectifs d’acquérir la maîtrise des différentes librairies primordiales pour traiter les données en machine Learning, ainsi que d’étudier et d’utiliser certains algorithmes basiques (régression linéaire, logistique, Bayes) sur des datasets que nous traiterons nous même. &lt;br /&gt;
Pour ce qui est du second semestre, notre objectif était de concrétiser les connaissances acquises durant le premier semestre. Nous avons donc essayé de créer notre propre dataset à l’aide des matériels mis à notre disposition, de la prétraiter et d’y appliquer différents algorithmes de Machine Learning en critiquant les résultats.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning pour la détection de défaut s'inscrit parfaitement dans le contexte scientifique actuel, notamment grâce à l’industrie 4.0.&lt;br /&gt;
En effet, cette nouvelle industrie fait apparaître des systèmes communicants (l’IOT : Internet Of Things) interconnectés les uns entre les autres. Ces différents systèmes peuvent êtres nécessaires les uns, les autres afin de réaliser une tâche complexe telle que l'usinage de pièces. Le système devient dès lors potentiellement extrêmement fragile aux pannes.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning a pour but de pouvoir détecter, et localiser les pannes, voir les futures pannes potentielles afin de pouvoir dans un premier temps prévenir un opérateur. Mais il peut aussi potentiellement permettre au système de continuer de tourner, en attendant un technicien. Le machine Learning peut donc aussi permettre à une chaîne de production de continuer de tourner par l’envoie d’un autre robot par exemple, le temps que la panne soit réparée.&lt;br /&gt;
&lt;br /&gt;
Dans le schéma ci-dessous nous avons un exemple de système de système.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Intro1.png|500px|thumb|center|Schéma d'un système de systèmes]]&lt;br /&gt;
&lt;br /&gt;
Il y a deux cas de figure:&lt;br /&gt;
* Un autre système peut être envoyé pour remplacer le système 4.&lt;br /&gt;
* Les systèmes 1 et 2 peuvent permettre à la chaîne de production de continuer de tourner&lt;br /&gt;
* La chaîne de production est hors service jusqu'à réparation.&lt;br /&gt;
&lt;br /&gt;
==Cahier de charges==&lt;br /&gt;
&lt;br /&gt;
'''Ressources disponibles :'''&lt;br /&gt;
&lt;br /&gt;
* Livres sur le machine learning &lt;br /&gt;
* Bases de données (afin d'appliquer divers algorithmes de machine learning) que nous prendrons sur ces sites : [https://www.kaggle.com/datasets] et [https://archive.ics.uci.edu/ml/datasets.php]&lt;br /&gt;
* Librairies Python (Scikit-learn, Pandas, Numpy, Seaborn, Matplotlib)&lt;br /&gt;
* Google Colab&lt;br /&gt;
* Matlab (version étudiante)&lt;br /&gt;
&lt;br /&gt;
'''Objectifs poursuivis :'''&lt;br /&gt;
&lt;br /&gt;
* Détecter les dysfonctionnements de systèmes mécatroniques (par exemple les robots Khepera, Robotino…), grâce au machine learning.&lt;br /&gt;
* Apprendre à implémenter différentes méthodes machine learning .&lt;br /&gt;
&lt;br /&gt;
'''Profil du public cible :'''&lt;br /&gt;
* Secteur mécatronique&lt;br /&gt;
* Entreprises disposant d'ingénieurs pour maintenir le système informatique opérationnel&lt;br /&gt;
* Entreprises utilisant des machines dans le secteur public.&lt;br /&gt;
&lt;br /&gt;
'''Analyse des besoins :'''&lt;br /&gt;
* L’industrie a de plus en plus besoin du machine learning pour détecter les erreurs des systèmes. En effet, cette technologie devient indispensable pour les industriels, notamment afin d'accroître la productivité et l’efficacité des systèmes industriels.&lt;br /&gt;
* Le programme peut ne pas être aussi rapide et optimisé en espace mémoire que d'autres programmes, nous visons l’efficacité de notre algorithme plutôt que la rapidité.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Librairies''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
En Machine Learning, il est très important, voire primordial, de savoir manipuler les différentes librairies mises à notre disposition afin de visualiser, traiter nos différentes dataset ou même appliquer les différents algorithmes de machine Learning.&lt;br /&gt;
Durant les premières semaines de notre projet, nous avons donc appris à utiliser ces différentes librairies nécessaires pour le machine Learning, telles que Numpy, Seaborn, Panda, Matplotlib, Scikit-learn... Nous allons dans un premier temps nous intéresser à l'importation des différentes bibliothèques puis résumer les commandes importantes de ces différentes librairies.&lt;br /&gt;
&lt;br /&gt;
Ces différentes librairies ne sont pas incluses de base dans Python, il est donc nécessaire de les ajouter à Python puis à notre programme.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc choisi d'utiliser google colab car ces librairies y sont déjà installées (et aussi pratique pour travailler à plusieurs sur un même code).&lt;br /&gt;
Puis nous devons importer ces bibliothèques au début de notre programme.&lt;br /&gt;
&lt;br /&gt;
Attention : Plusieurs bibliothèques peuvent avoir la même commande mais avec des significations différentes, comme par exemple la commande randint du module numpy et celle du module random et cela peut conduire à des erreurs. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de pallier à ces problèmes nous apporterons nos librairie au début de nos programmes comme suit :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:librairies1.png]]&lt;br /&gt;
&lt;br /&gt;
Ici le np permet de dire que lorsque nous utilisons np.array alors nous utilisons la commande array () contenu dans la bibliothèque Numpy.&lt;br /&gt;
&lt;br /&gt;
Ceci nous permettra d’utiliser en simultané différentes librairies, toutes les bibliothèques seront importées selon ce schéma.&lt;br /&gt;
Nous allons par la suite, nous intéresser à différentes commandes incluses dans ces librairies.&lt;br /&gt;
&lt;br /&gt;
==Numpy==&lt;br /&gt;
&lt;br /&gt;
Numpy est une bibliothèque dédiée aux calculs mathématiques et à la gestion des listes (telles que des matrices).&lt;br /&gt;
Matplotlib, quant à lui, est dédié aux affichages graphiques de données.&lt;br /&gt;
Nous allons dans cette partie nous intéresser aux commandes principales de ces deux bibliothèques de python.&lt;br /&gt;
&lt;br /&gt;
Sous numpy, les tableaux sont des types array, ils définissent l'équivalent des tableaux statiques en langage C. La taille d’un tableau numpy ne peut donc pas être changée après leur création. &lt;br /&gt;
&lt;br /&gt;
Néanmoins grâce a Numpy nous pouvons simplement effectuer des tâches sur les tableaux comme en extraire un sous tableaux, et d’effectuer simplement les produits entre matrice, vecteur.&lt;br /&gt;
&lt;br /&gt;
Dans notre projet, nous utiliserons plus courament les fonctions : &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.shape&amp;lt;/FONT&amp;gt; permet d’obtenir la taille de la matrice sous forme d’un tuple, suffit de choisir le bon numéro&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.zeros&amp;lt;/FONT&amp;gt; permet de créer une ligne de x zéro(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.ones&amp;lt;/FONT&amp;gt; permet de créer une ligne de x un(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.vstack&amp;lt;/FONT&amp;gt; permet de rajouter des lignes dans une matrice déjà créer en paramètre&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.transpose&amp;lt;/FONT&amp;gt; permet de transposer une matrice en paramètre&lt;br /&gt;
&lt;br /&gt;
==Seaborn==&lt;br /&gt;
&lt;br /&gt;
Seaborn est une bibliothèque de visualisation de données Python basée sur matplotlib. Il fournit une interface de haut niveau pour dessiner des graphiques statistiques attrayants et informatifs.&lt;br /&gt;
&lt;br /&gt;
'''Différences entre Matplotlib et Seaborn'''&lt;br /&gt;
&lt;br /&gt;
Les défauts de Matplotlib qui ne parlent généralement pas aux utilisateurs sont les couleurs, les marques de tiques sur les axes supérieur et droit, le style,...&lt;br /&gt;
Les exemples ci-dessus rendent également une autre frustration des utilisateurs plus apparente: le fait que travailler avec DataFrames ne va pas aussi bien avec Matplotlib, ce qui peut être ennuyeux si vous faites une analyse exploratoire avec Pandas. Et c’est exactement ce que Seaborn adresse : les fonctions de traçage fonctionnent sur dataframes et tableaux qui contiennent tout un ensemble de données.&lt;br /&gt;
[[Fichier:seaborn1.png|300px|thumb|right|Résultat du code python ci gauche]]&lt;br /&gt;
&lt;br /&gt;
   # Import necessary libraries&lt;br /&gt;
   import seaborn as sns&lt;br /&gt;
   import matplotlib.pyplot as plt&lt;br /&gt;
   &lt;br /&gt;
   # Load iris data&lt;br /&gt;
   iris = sns.load_dataset(&amp;quot;iris&amp;quot;) #DATASET ALREADY EXISTING&lt;br /&gt;
   &lt;br /&gt;
   # Construct iris plot&lt;br /&gt;
   sns.swarmplot(x=&amp;quot;species&amp;quot;, y=&amp;quot;petal_length&amp;quot;, data=iris)&lt;br /&gt;
   &lt;br /&gt;
   # Show plot&lt;br /&gt;
   plt.show()&lt;br /&gt;
&lt;br /&gt;
==Pandas==&lt;br /&gt;
&lt;br /&gt;
Pandas est une API d'analyse de données orientée colonnes. C'est un excellent outil pour manipuler et analyser des données d'entrée. Beaucoup de frameworks d'apprentissage automatique acceptent les structures de données Pandas en entrée.&lt;br /&gt;
&lt;br /&gt;
Comme évoqué précédemment, Pandas travaille avec des matrices colonnes communément appelées ‘Series’ mais aussi et surtout avec des tableaux de données appelés ‘DataFrames’.&lt;br /&gt;
Une Series est tout simplement une colonne et une DataFrame est un tableau à plusieurs dimensions constitué de Series.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Panda.JPG]]&lt;br /&gt;
&lt;br /&gt;
A l'aide de Pandas, on peut ainsi créer, importer, lire et manipuler des bases de données facilement.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Théories des algorithmes étudiés''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Il y a différents types d’algorithmes en machine learning, pour notre sujet qui consiste à classer des machines en défectueuse ou fonctionnelles (1 ou 0), nous aurons surtout besoin d’algorithmes de classification binaire. De manière générale, la conception de la plupart des algorithmes fonctionnent de cette manière : &lt;br /&gt;
&lt;br /&gt;
* Élaborer un modèle &lt;br /&gt;
* Établir une fonction coût pour celui-ci correspondant à l’erreur entre le modèle et les données réelles&lt;br /&gt;
* Trouver un algorithme de minimisation de cette fonction coût&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression linéaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression1.png|200px|thumb|right|Exemple de régression linéaire]]&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est un algorithme de prédiction et non un algorithme de classification, nous aurons surtout besoin de ce deuxième type d’algorithme pour notre projet mais nous tenons à présenter cet algorithme qui est le plus basique en machine learning et un bon début pour une formation pédagogique.&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est une méthode de modélisation qui cherche à établir une relation linéaire entre une ou des &amp;quot;features&amp;quot; (variables explicatives) et une &amp;quot;target&amp;quot; (variable expliquée qu'on cherche à prévoir à partir des variables explicatives). En machine learning, la régression linéaire est un modèle d'apprentissage supervisé, c'est-à-dire qu'on apprend à l'algorithme de prédiction à partir d'exemples dont on dispose dans une dataset. Nous nous intéresserons à la régression affine qui est la plus simple pour débuter.&lt;br /&gt;
&lt;br /&gt;
===Modèle et estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
La régression affine consiste donc à trouver un modèle de type&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt;y=ax+b&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
avec x une &amp;quot;feature&amp;quot;, y la target et avec a et b des paramètres qu'il nous faudra déterminer. Le but est donc de trouver les paramètres a et b tels que la distance entre chaque point du nuage et la droite du modèle soit la plus petite possible.&lt;br /&gt;
Mathématiquement, il suffit de résoudre cette formule:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression2.png|200px|thumb|right|Méthode des moindres carrés illustrée]]&lt;br /&gt;
[[Fichier:regression3.png]]&lt;br /&gt;
&lt;br /&gt;
On utilise donc la méthode des moindres carrés pour mesurer l'erreur entre le modèle de prédiction et les données et ainsi fabriquer notre fonction coût :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression4.png]]&lt;br /&gt;
&lt;br /&gt;
avec m le nombre de points du nuage.&lt;br /&gt;
&lt;br /&gt;
L'objectif de l'algorithme est donc de trouver les paramètres optimaux qui minimisent cette fonction J.&lt;br /&gt;
En machine learning, une des méthodes les plus populaires pour faire ceci est la descente de gradient, car c'est une méthode adaptée quand on fait du traitement de grosses dataset (&amp;quot;faible&amp;quot; temps de calcul). En effet, la fonction coût J est une parabole admettant un unique minimum dépendant des paramètres a et b. La descente de gradient consiste à chercher le point de celle-ci où la dérivée est nulle (donc le minimum)&lt;br /&gt;
&lt;br /&gt;
===Méthode de la descente du gradient===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression6.png|200px|thumb|right|Méthode gradient]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression7.png|200px|thumb|right|Généralisation gradient fct parabolique]]&lt;br /&gt;
&lt;br /&gt;
Soit une fonction parabolique ne dépendant que de x. On cherche à trouver le minimum de cette fonction en utilisant la méthode de la descente du gradient&lt;br /&gt;
Pour cela on choisit un point aléatoirement &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;et on va descendre à partir de celui-ci jusqu'à atteindre un minimum en utilisant&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression5.png]]&lt;br /&gt;
&lt;br /&gt;
avec un paramètre  qui influencera la taille du pas de la descente.&lt;br /&gt;
&lt;br /&gt;
Il faut faire attention à ne pas prendre un pas trop grand, ni trop petit, pour éviter de &amp;quot;tourner&amp;quot; autour du minimum ou de prendre trop de temps pour l'atteindre.&lt;br /&gt;
Note : On peut généraliser cela pour une fonction parabolique à n paramètres qui aurait donc une forme de bol.&lt;br /&gt;
&lt;br /&gt;
===Application sur notre fonction coût===&lt;br /&gt;
&lt;br /&gt;
Notre fonction coût dépend des 2 paramètres a et b :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression8.png]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression9.png]]&lt;br /&gt;
&lt;br /&gt;
On choisit &amp;lt;math&amp;gt;a_0&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; aléatoirement et on applique ceci pour un pas :&lt;br /&gt;
&lt;br /&gt;
Avec &lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression10.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d'un certain nombre d'itérations on trouve le couple &amp;lt;math&amp;gt;(a,b)&amp;lt;/math&amp;gt; qui minimise notre fonction coût.&lt;br /&gt;
&lt;br /&gt;
Note : Nous avons démontré la théorie de la régression linéaire affine mais on pourrait généraliser celle-ci pour un modèle polynomiale d’ordre n, la courbe de prédiction serait donc parabolique et il faudrait trouver le tuple &amp;lt;math&amp;gt;(a_1,a_2,...,a_n)&amp;lt;/math&amp;gt; qui minimise la fonction coût.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression logistique binaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo1.png|200px|thumb|right|Modèle régression logistique]]&lt;br /&gt;
&lt;br /&gt;
La régression logistique binaire est un algorithme de classification, contrairement à la régression linéaire qui est un algorithme de prédiction. De la même façon que la régression linéaire,  il s'agit de modéliser au mieux un modèle mathématique simple à des observations réelles nombreuses. Cette méthode se base sur de l’analyse mathématiques et statistique. Il faut donc associer à des “features” &amp;lt;math&amp;gt;(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; une variable Y valant 1 ou 0 (d’où le terme classification binaire).&lt;br /&gt;
&lt;br /&gt;
L’objectif de l’algorithme est donc de trouver la fonction F dépendant d’une loi de probabilité telle que :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo2.png]]&lt;br /&gt;
&lt;br /&gt;
avec S un certain seuil (fixé la plupart du temps à 0,5).&lt;br /&gt;
&lt;br /&gt;
===Modèle===&lt;br /&gt;
&lt;br /&gt;
Comme cette méthode repose principalement sur des statistiques, il est important d’adopter une notation explicite lors de l’explication théorique :&lt;br /&gt;
&lt;br /&gt;
* On notera Y la variable à prédire (qui vaudra 0 ou 1) et &amp;lt;math&amp;gt;X=(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; les variables permettant de prédire Y&lt;br /&gt;
* On travaillera dans un univers  de N échantillons (taille de la dataset)&lt;br /&gt;
* On notera &amp;lt;math&amp;gt;P(Y=1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;P(Y=0)&amp;lt;/math&amp;gt; les probabilités que Y valent respectivement 1 ou 0 &amp;lt;math&amp;gt;p(1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0)&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;p(X|1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(X|0)&amp;lt;/math&amp;gt; sont les distributions conditionnelles des caractéristiques X sachant la valeur prise par Y&lt;br /&gt;
* &amp;lt;math&amp;gt;p(1|X)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0|X)&amp;lt;/math&amp;gt; sont donc les probabilités d’obtenir la valeur de Y (1 ou 0) sachant les valeurs de X&lt;br /&gt;
&lt;br /&gt;
La régression logistique utilise l’hypothèse fondamentale (mesure de l’évidence) :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo3.png]]&lt;br /&gt;
&lt;br /&gt;
On en déduit donc (comme &amp;lt;math&amp;gt;p(0|X)=1-p(1|X))&amp;lt;/math&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo4.png]]&lt;br /&gt;
&lt;br /&gt;
Avec &amp;lt;math&amp;gt;(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; des variables à déterminer.&lt;br /&gt;
&lt;br /&gt;
''Note :'' ce modèle est appelé modèle LOGIT.&lt;br /&gt;
&lt;br /&gt;
===Estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
Contrairement à la régression linéaire affine, on ne peut pas utiliser la méthode des moindres carrés, on utilise alors la méthode de maximisation de la vraisemblance.&lt;br /&gt;
“La vraisemblance mesure une adéquation entre la distribution observée sur un échantillon aléatoire et une loi de probabilité supposée décrire une réalité sur la population dont l'échantillon est issu.” (source : [www.jybaudot.fr])&lt;br /&gt;
&lt;br /&gt;
Le calcul de la vraisemblance L dans un univers  de N échantillons est le suivant :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo5.png]]&lt;br /&gt;
&lt;br /&gt;
Plus la vraisemblance est élevée, alors plus la loi de probabilité est proche de la réalité. Le but est donc de maximiser cette valeur et de trouver les valeurs optimales de &amp;lt;math&amp;gt;A =(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; qui influent directement sur la loi de probabilité établie dans la partie modèle.&lt;br /&gt;
&lt;br /&gt;
===Algorithme d'optimisation===&lt;br /&gt;
&lt;br /&gt;
Afin de trouver la valeur optimale du vecteur A, nous utiliserons encore une fois la méthode de descente du gradient adaptée à notre cas.&lt;br /&gt;
&lt;br /&gt;
Celle-ci utilise la relation suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo6.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d’un certain nombre d’itérations, on trouvera la valeur optimale de A afin de maximiser la vraisemblance.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Mise en pratique''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Pour la mise en pratique, nous avons décidé d’appliquer les méthodes sur un dataset de prédiction de maintenance pour l’industrie, nous importons grâce à la librairie panda : &amp;lt;code&amp;gt; dataset = pd.read_csv('ai4i2020.csv') &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette dataset contient 14 colonnes de données, nous pouvons visualiser la proportion de données saines et non-saines par ce code seaborn : &amp;lt;code&amp;gt; sns.factorplot('Machine failure',data=dataset,kind='count') &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on traitera cette dataset pour la préparer sur l’intervention des modèles de machine learning, puis on appliquera ces méthodes.&lt;br /&gt;
&lt;br /&gt;
==Pré-traitement de la dataset==&lt;br /&gt;
&lt;br /&gt;
Avant d’appliquer les algorithme sur notre dataset, il faut la traiter, le traitement sera le même pour tous les algorithmes et suivra cet ordre :&lt;br /&gt;
* Traitement des valeurs manquantes&lt;br /&gt;
* Équilibrage des données&lt;br /&gt;
* Séparations des données en entrainement et test&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous devons regarder si notre base de données contient des valeurs manquante, pour cela nous implantons ce code : &lt;br /&gt;
&lt;br /&gt;
   import missingno as msno&lt;br /&gt;
   msno.matrix(dataset)&lt;br /&gt;
&lt;br /&gt;
Les lignes blanches dans le résultat correspond aux valeurs manquantes, ci-dessous nous voyons que nous avons aucune données manquantes dans la base que nous avons importer : [[Fichier:Miseenpratique.png]]&lt;br /&gt;
&lt;br /&gt;
Dans le cas, où nous avons des valeurs manquante, il y a plusieurs méthodes pour traiter les valeurs manquantes mais nous retenons 2 méthodes :&lt;br /&gt;
* Une méthode qui consiste à supprimer les lignes où des valeurs manquantes sont présentes : &amp;lt;code&amp;gt; data.dropna(inplace=True) &amp;lt;/code&amp;gt;&lt;br /&gt;
L’avantage de cette méthode est de créer un modèle robuste. L’inconvénient majeur est le fait qu’on peut perdre énormément de données, pour des données où les valeurs manquantes sont excessives, mieux vaut appliquer une autre méthode.&lt;br /&gt;
&lt;br /&gt;
* Une méthode qui consiste à remplacer les valeurs manquantes par la moyenne des données de la colonne : &amp;lt;code&amp;gt; data[0]=drop[0].replace(np.NaN,data[0].mean()) &amp;lt;/code&amp;gt; L’avantage de cette méthode permet d’éviter la suppression de lignes, ce qui permet de garder les autres données comparé à l’autre méthode. Cependant cette méthode n’est que applicable sur les données numériques&lt;br /&gt;
&lt;br /&gt;
Nous passons alors sur l'équilibrage des données. Avant d’appliquer la méthode SMOTE, nous devons mettre dans 2 variables, la target (y) et les features (X) :&lt;br /&gt;
&lt;br /&gt;
   X = dataset.drop(['Machine failure','UDI','Product ID','Type','TWF','HDF','PWF','OSF','RNF'],axis=1).values&lt;br /&gt;
   y = dataset['Machine failure']&lt;br /&gt;
&lt;br /&gt;
Notre target sera seulement ‘Machine failure’ et nos features seront : la température de l’air, la température du processus, le couple, et l’usure des outils.&lt;br /&gt;
&lt;br /&gt;
Durant notre projet , nous avons implémenté la technique SMOTE pour traiter les ensembles de données déséquilibrées.&lt;br /&gt;
Le principe de SMOTE est de générer de nouveaux échantillons en combinant les données de la classe minoritaire avec celles de leurs voisins proches. Techniquement, on peut décomposer SMOTE en 5 étapes :&lt;br /&gt;
* 1 - Choix d’un vecteur caractéristique de notre classe minoritaire que nous appellerons vc &lt;br /&gt;
* 2 - Sélection des k-voisins les plus proches (k=5 par défaut) et choix de l’un d’eux au hasard que l’on appellera pv &lt;br /&gt;
* 3 - Calcul de la différence pour chaque valeur caractéristique (feature value) i, vc[i]-pv[i] et multiplication de celle-ci par un nombre aléatoire entre [0,1]&lt;br /&gt;
* 4 - Ajout du résultat précédent à la valeur de la caractéristique i du vecteur vc afin d’obtenir un nouveau point (une nouvelle donnée) dans l’espace des caractéristiques &lt;br /&gt;
* 5 - Répétition de ces opérations pour chaque point de données de la classe minoritaire &lt;br /&gt;
Nous remarquons que cette technique marche après smote (50% données saines, 50% données non-saines)&lt;br /&gt;
&lt;br /&gt;
Code : &lt;br /&gt;
&lt;br /&gt;
   oversample = SMOTE()&lt;br /&gt;
   Xsmote, ysmote = oversample.fit_resample(X,y)&lt;br /&gt;
   Xsmote = pd.DataFrame(Xsmote)&lt;br /&gt;
   ysmote = pd.DataFrame(ysmote)&lt;br /&gt;
   X=Xsmote&lt;br /&gt;
   y=ysmote&lt;br /&gt;
&lt;br /&gt;
On remarque que la technique smote a ajouté 9322 lignes sur notre base, Maintenant que nous avons un équilibre entre les données ‘sains’ et ‘malsains’, nous pouvons voir la répartitions des points sur 2 axes :&lt;br /&gt;
&lt;br /&gt;
(image)&lt;br /&gt;
&lt;br /&gt;
Nous pouvons alors procéder à la séparation de nos données en données d'entraînement et de test&lt;br /&gt;
&lt;br /&gt;
Nous devons séparer en deux nos données pour pouvoir appliquer les algorithmes de machine learning, ainsi : &lt;br /&gt;
Les données d'entraînement serviront de repères pour l’algorithme&lt;br /&gt;
Les données de test seront entraînées par celle d’entrainement pour créer une prédiction&lt;br /&gt;
&lt;br /&gt;
Nous allons utiliser la fonction train_test_split de la librairie sklearn pour séparer nos données : &lt;br /&gt;
&lt;br /&gt;
   X_train, X_test, y_train, y_test = train_test_split(X,y, test_size = 0.2, random_state = 100)&lt;br /&gt;
&lt;br /&gt;
Ici dans les paramètres :&lt;br /&gt;
X  correspond aux features&lt;br /&gt;
y correspond à la target&lt;br /&gt;
test_size correspond au pourcentage de séparation (soit 0.2 = 20% test et 80% d'entraînement)&lt;br /&gt;
random_state permet d’initialiser le choix aléatoire pour avoir la même répartition à chaque exécution&lt;br /&gt;
&lt;br /&gt;
Maintenant nous pouvons appliquer les algorithme à notre modèle&lt;br /&gt;
&lt;br /&gt;
==Application des algorithmes==&lt;br /&gt;
&lt;br /&gt;
En général, nous allons appliquer les algorithme en suivant cet ordre : &lt;br /&gt;
* Importation de la méthode sur la librairie sklearn&lt;br /&gt;
* Entraînement des données&lt;br /&gt;
* Prédiction&lt;br /&gt;
* Méthodes d’évaluations&lt;br /&gt;
&lt;br /&gt;
===Régression linéaire===&lt;br /&gt;
&lt;br /&gt;
Nous allons commencer par le plus simple : la régression linéaire, nous commençons par importer l’algorithme à partir de la librairie sklearn : &amp;lt;code&amp;gt; from sklearn.linear_model import LinearRegression &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis nous appelons l’algorithme avec les paramètres de base, puis nous entraînons notre dataset : &lt;br /&gt;
   #Méthode de régréssion linéaire&lt;br /&gt;
   lr = LinearRegression()&lt;br /&gt;
   #Training&lt;br /&gt;
   lr.fit(X_train,y_train)&lt;br /&gt;
&lt;br /&gt;
Ensuite la prédiction : &lt;br /&gt;
   #Prediction&lt;br /&gt;
   y_pred = lr.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
Et enfin l'évaluation, nous avons vu 2 méthodes pour évaluer notre modèle : &lt;br /&gt;
* Afficher le score de prédiction&lt;br /&gt;
* Afficher la matrice de confusion, une matrice de taille 2x2 qui donne ces informations : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatrixConfusion.png]]&lt;br /&gt;
&lt;br /&gt;
Le score de prédiction (accuracy) est également calculé à partir de cette matrice&lt;br /&gt;
Pour la régression linéaire, nous allons qu’afficher le score de prédiction, car cet algorithme nous donne en retour des valeurs non-binaire, la construction d’une matrice de confusion et impossible.&lt;br /&gt;
&lt;br /&gt;
   #Evaluation&lt;br /&gt;
   print(lr.score(X_test,y_test))&lt;br /&gt;
&lt;br /&gt;
Nous obtenons ainsi un score de 0.48, un score qui est plus élevé sans la méthode SMOTE (0.14), sauf que cette méthode n’est pas la plus optimisée pour cette base de données, car nous avons en target des valeurs binaires. Il vaut mieux appliquer la méthode de régression logistique ou la méthode de Naives-Bayes.&lt;br /&gt;
&lt;br /&gt;
===Régression logistique===&lt;br /&gt;
&lt;br /&gt;
Dans le même modèle que la régression linéaire, nous procédons à l’import de la méthode, l’appel de la méthode, l'entraînement des données et de la prédiction :&lt;br /&gt;
&lt;br /&gt;
   from sklearn import linear_model&lt;br /&gt;
&lt;br /&gt;
   #Modèle régression logistique&lt;br /&gt;
   modele_regLog = linear_model.LogisticRegression() &lt;br /&gt;
   #random_state = 100, solver = 'liblinear', multi_class = 'auto'&lt;br /&gt;
&lt;br /&gt;
   #training&lt;br /&gt;
   modele_regLog.fit(X_train,y_train)&lt;br /&gt;
&lt;br /&gt;
   #prediction&lt;br /&gt;
   y_pred = modele_regLog.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
   #précision du modèle&lt;br /&gt;
   precision = modele_regLog.score(X_test,y_test)&lt;br /&gt;
   print(precision)&lt;br /&gt;
&lt;br /&gt;
Pour la régression logistique, nous allons afficher la matrice de confusion et le score :&lt;br /&gt;
&lt;br /&gt;
   from sklearn.metrics import plot_confusion_matrix&lt;br /&gt;
   plot_confusion_matrix(modele_regLog, X_test, y_test)  &lt;br /&gt;
   plt.show() &lt;br /&gt;
&lt;br /&gt;
(images)&lt;br /&gt;
&lt;br /&gt;
Nous obtenons un score de 0.82, contre 0.97 sans la méthode de SMOTE, ce qui est cohérent car le score obtenu sans SMOTE n’est pas précis car il y avait peu de données où la machine a planté. Avec SMOTE, nous obtenons certes un score moins élevé mais plus précis.&lt;br /&gt;
Grâce à la matrice de confusion nous pouvons voir que : &lt;br /&gt;
* Il y a 2396 fois où l’algorithme a prédit Machine failure = 0 et a eu raison&lt;br /&gt;
* Il y a 2377 fois où l’algorithme a prédit Machine failure = 1 et a eu raison&lt;br /&gt;
* Il y a 546 fois où l’algorithme a prédit Machine failure = 1 et a eu faux&lt;br /&gt;
* Il y a 478 fois où l’algorithme a prédit Machine failure = 0 et a eu faux&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 0px; padding: 20px; font-weight: bold; text-align: center; font-size: 80%; background: #61798F; vertical-align: top; width: 100%;&amp;quot;&amp;gt; '''PARTIE II (S8)''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Développement du projet''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Durant les deux premiers semestres, nous avons découvert et étudié le Machine Learning, que ce soit la théorie de différents algorithmes connus ou l'application à pratique à des datasets que nous pouvons récupérer sur Internet ou bien les créer nous même. La création de notre dataset ayant été fastidieuse et peu concluante (voir résultats précédents), nous avons comme objectif pour ce semestre d'implémenter nos algorithmes (et principalement le réseau de neurones) à des machines dont nous avons accès à l'école.&lt;br /&gt;
&lt;br /&gt;
Après discussion avec notre tuteur de projet Monsieur Lakhal, nous avons décidé d'utiliser des Robotino plutôt que d'utiliser la chaîne de production présente à l'école car il existe des logiciels simples permettant d'effectuer des simulations de réseaux logistiques de Robotinos (Robotino View et Robotino Simulation) dont nous allons récupérer les données en temps réel et les traiter sur Matlab à l'aide de notre algorithme de réseaux de neurones.&lt;br /&gt;
&lt;br /&gt;
L'objectif est ainsi de réaliser le scénario d'un réseau logistique (à l'image d'Amazon par exemple) composé de plusieurs Robotino effectuant chacun une tache et d'y introduire des erreurs puis de les traiter afin de ne pas perturber la logistique.&lt;br /&gt;
&lt;br /&gt;
=Recherche bibliographique=&lt;br /&gt;
&lt;br /&gt;
* https://www.wikipedia.com&lt;br /&gt;
&lt;br /&gt;
* https://www.jybaudot.fr&lt;br /&gt;
&lt;br /&gt;
* https://datascientest.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.ipgirl.com&lt;br /&gt;
&lt;br /&gt;
* Cours de probabilités et statistiques de l’Université Jules Vernes&lt;br /&gt;
&lt;br /&gt;
* Chaine youtube Machine Learning : https://www.youtube.com/channel/UCmpptkXu8iIFe6kfDK5o7VQ&lt;br /&gt;
&lt;br /&gt;
* Machine Learning with scikit-learn Quick Start Guide écrit par Kevin Jolly&lt;br /&gt;
&lt;br /&gt;
* https://lucidar.me/&lt;br /&gt;
&lt;br /&gt;
* https://archive.ics.uci.edu/ml/datasets.php&lt;br /&gt;
&lt;br /&gt;
* https://www.kaggle.com/datasets&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com/&lt;br /&gt;
&lt;br /&gt;
* Machine Learning algorithms - Second Edition écrit par Giuseppe Bonaccorso&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com&lt;br /&gt;
&lt;br /&gt;
* https://towardsdatascience.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.learndatasci.com/&lt;br /&gt;
&lt;br /&gt;
==Rapports et présentation==&lt;br /&gt;
&lt;br /&gt;
===Librairies===&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1CQZ1s6fNY_6MsmbBa5TP1OzSedqFeaWI?usp=sharing/ Rapport Numpy]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1tdu_B2wRsUiqdnSeskQENdn_wX3pJMeT?usp=sharing/ Rapport Pandas]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1DPS4ZT91SIEhscwST8kfER7u21tKoM3a?usp=sharing/ Rapport Seaborn]&lt;br /&gt;
&lt;br /&gt;
===Rapports===&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/document/d/1yR0vLePV3hI1_HVtTZWwGIwy0Cb-oLOsOTK3Um5KAYE/edit?usp=sharing/ Rapport]&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/presentation/d/1Je_yF0dgc-s9gB7LLsfOg0b05xcwIFJbaqpVytxWv5A/edit?usp=sharing/ Présentation]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1y_NMo9XKJ0WzwE2zmcRblUyuIebwfoN8?usp=sharing/ Régression linéaire]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1bRyrnL1JM870cEcEvfGaS8ItrG16rchy?usp=sharing/ Google Colab]&lt;/div&gt;</summary>
		<author><name>Abrossas</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88026</id>
		<title>IMA3/IMA4 2020/2022 P5</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88026"/>
				<updated>2022-02-09T17:40:58Z</updated>
		
		<summary type="html">&lt;p&gt;Abrossas : /*  Développement du projet  */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 0px; padding: 20px; font-weight: bold; text-align: center; font-size: 80%; background: #61798F; vertical-align: top; width: 100%;&amp;quot;&amp;gt; '''PARTIE I (S6-S7)''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Introduction et cahier des charges''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce projet est la mise en place d’algorithmes de machine Learning afin de diagnostiquer l’état de machines industrielles. Nous travaillerons sur ce projet durant 2 semestres. &lt;br /&gt;
Durant le premier semestre, nous avions comme objectifs d’acquérir la maîtrise des différentes librairies primordiales pour traiter les données en machine Learning, ainsi que d’étudier et d’utiliser certains algorithmes basiques (régression linéaire, logistique, Bayes) sur des datasets que nous traiterons nous même. &lt;br /&gt;
Pour ce qui est du second semestre, notre objectif était de concrétiser les connaissances acquises durant le premier semestre. Nous avons donc essayé de créer notre propre dataset à l’aide des matériels mis à notre disposition, de la prétraiter et d’y appliquer différents algorithmes de Machine Learning en critiquant les résultats.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning pour la détection de défaut s'inscrit parfaitement dans le contexte scientifique actuel, notamment grâce à l’industrie 4.0.&lt;br /&gt;
En effet, cette nouvelle industrie fait apparaître des systèmes communicants (l’IOT : Internet Of Things) interconnectés les uns entre les autres. Ces différents systèmes peuvent êtres nécessaires les uns, les autres afin de réaliser une tâche complexe telle que l'usinage de pièces. Le système devient dès lors potentiellement extrêmement fragile aux pannes.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning a pour but de pouvoir détecter, et localiser les pannes, voir les futures pannes potentielles afin de pouvoir dans un premier temps prévenir un opérateur. Mais il peut aussi potentiellement permettre au système de continuer de tourner, en attendant un technicien. Le machine Learning peut donc aussi permettre à une chaîne de production de continuer de tourner par l’envoie d’un autre robot par exemple, le temps que la panne soit réparée.&lt;br /&gt;
&lt;br /&gt;
Dans le schéma ci-dessous nous avons un exemple de système de système.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Intro1.png|500px|thumb|center|Schéma d'un système de systèmes]]&lt;br /&gt;
&lt;br /&gt;
Il y a deux cas de figure:&lt;br /&gt;
* Un autre système peut être envoyé pour remplacer le système 4.&lt;br /&gt;
* Les systèmes 1 et 2 peuvent permettre à la chaîne de production de continuer de tourner&lt;br /&gt;
* La chaîne de production est hors service jusqu'à réparation.&lt;br /&gt;
&lt;br /&gt;
==Cahier de charges==&lt;br /&gt;
&lt;br /&gt;
'''Ressources disponibles :'''&lt;br /&gt;
&lt;br /&gt;
* Livres sur le machine learning &lt;br /&gt;
* Bases de données (afin d'appliquer divers algorithmes de machine learning) que nous prendrons sur ces sites : [https://www.kaggle.com/datasets] et [https://archive.ics.uci.edu/ml/datasets.php]&lt;br /&gt;
* Librairies Python (Scikit-learn, Pandas, Numpy, Seaborn, Matplotlib)&lt;br /&gt;
* Google Colab&lt;br /&gt;
* Matlab (version étudiante)&lt;br /&gt;
&lt;br /&gt;
'''Objectifs poursuivis :'''&lt;br /&gt;
&lt;br /&gt;
* Détecter les dysfonctionnements de systèmes mécatroniques (par exemple les robots Khepera, Robotino…), grâce au machine learning.&lt;br /&gt;
* Apprendre à implémenter différentes méthodes machine learning .&lt;br /&gt;
&lt;br /&gt;
'''Profil du public cible :'''&lt;br /&gt;
* Secteur mécatronique&lt;br /&gt;
* Entreprises disposant d'ingénieurs pour maintenir le système informatique opérationnel&lt;br /&gt;
* Entreprises utilisant des machines dans le secteur public.&lt;br /&gt;
&lt;br /&gt;
'''Analyse des besoins :'''&lt;br /&gt;
* L’industrie a de plus en plus besoin du machine learning pour détecter les erreurs des systèmes. En effet, cette technologie devient indispensable pour les industriels, notamment afin d'accroître la productivité et l’efficacité des systèmes industriels.&lt;br /&gt;
* Le programme peut ne pas être aussi rapide et optimisé en espace mémoire que d'autres programmes, nous visons l’efficacité de notre algorithme plutôt que la rapidité.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Librairies''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
En Machine Learning, il est très important, voire primordial, de savoir manipuler les différentes librairies mises à notre disposition afin de visualiser, traiter nos différentes dataset ou même appliquer les différents algorithmes de machine Learning.&lt;br /&gt;
Durant les premières semaines de notre projet, nous avons donc appris à utiliser ces différentes librairies nécessaires pour le machine Learning, telles que Numpy, Seaborn, Panda, Matplotlib, Scikit-learn... Nous allons dans un premier temps nous intéresser à l'importation des différentes bibliothèques puis résumer les commandes importantes de ces différentes librairies.&lt;br /&gt;
&lt;br /&gt;
Ces différentes librairies ne sont pas incluses de base dans Python, il est donc nécessaire de les ajouter à Python puis à notre programme.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc choisi d'utiliser google colab car ces librairies y sont déjà installées (et aussi pratique pour travailler à plusieurs sur un même code).&lt;br /&gt;
Puis nous devons importer ces bibliothèques au début de notre programme.&lt;br /&gt;
&lt;br /&gt;
Attention : Plusieurs bibliothèques peuvent avoir la même commande mais avec des significations différentes, comme par exemple la commande randint du module numpy et celle du module random et cela peut conduire à des erreurs. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de pallier à ces problèmes nous apporterons nos librairie au début de nos programmes comme suit :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:librairies1.png]]&lt;br /&gt;
&lt;br /&gt;
Ici le np permet de dire que lorsque nous utilisons np.array alors nous utilisons la commande array () contenu dans la bibliothèque Numpy.&lt;br /&gt;
&lt;br /&gt;
Ceci nous permettra d’utiliser en simultané différentes librairies, toutes les bibliothèques seront importées selon ce schéma.&lt;br /&gt;
Nous allons par la suite, nous intéresser à différentes commandes incluses dans ces librairies.&lt;br /&gt;
&lt;br /&gt;
==Numpy==&lt;br /&gt;
&lt;br /&gt;
Numpy est une bibliothèque dédiée aux calculs mathématiques et à la gestion des listes (telles que des matrices).&lt;br /&gt;
Matplotlib, quant à lui, est dédié aux affichages graphiques de données.&lt;br /&gt;
Nous allons dans cette partie nous intéresser aux commandes principales de ces deux bibliothèques de python.&lt;br /&gt;
&lt;br /&gt;
Sous numpy, les tableaux sont des types array, ils définissent l'équivalent des tableaux statiques en langage C. La taille d’un tableau numpy ne peut donc pas être changée après leur création. &lt;br /&gt;
&lt;br /&gt;
Néanmoins grâce a Numpy nous pouvons simplement effectuer des tâches sur les tableaux comme en extraire un sous tableaux, et d’effectuer simplement les produits entre matrice, vecteur.&lt;br /&gt;
&lt;br /&gt;
Dans notre projet, nous utiliserons plus courament les fonctions : &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.shape&amp;lt;/FONT&amp;gt; permet d’obtenir la taille de la matrice sous forme d’un tuple, suffit de choisir le bon numéro&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.zeros&amp;lt;/FONT&amp;gt; permet de créer une ligne de x zéro(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.ones&amp;lt;/FONT&amp;gt; permet de créer une ligne de x un(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.vstack&amp;lt;/FONT&amp;gt; permet de rajouter des lignes dans une matrice déjà créer en paramètre&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.transpose&amp;lt;/FONT&amp;gt; permet de transposer une matrice en paramètre&lt;br /&gt;
&lt;br /&gt;
==Seaborn==&lt;br /&gt;
&lt;br /&gt;
Seaborn est une bibliothèque de visualisation de données Python basée sur matplotlib. Il fournit une interface de haut niveau pour dessiner des graphiques statistiques attrayants et informatifs.&lt;br /&gt;
&lt;br /&gt;
'''Différences entre Matplotlib et Seaborn'''&lt;br /&gt;
&lt;br /&gt;
Les défauts de Matplotlib qui ne parlent généralement pas aux utilisateurs sont les couleurs, les marques de tiques sur les axes supérieur et droit, le style,...&lt;br /&gt;
Les exemples ci-dessus rendent également une autre frustration des utilisateurs plus apparente: le fait que travailler avec DataFrames ne va pas aussi bien avec Matplotlib, ce qui peut être ennuyeux si vous faites une analyse exploratoire avec Pandas. Et c’est exactement ce que Seaborn adresse : les fonctions de traçage fonctionnent sur dataframes et tableaux qui contiennent tout un ensemble de données.&lt;br /&gt;
[[Fichier:seaborn1.png|300px|thumb|right|Résultat du code python ci gauche]]&lt;br /&gt;
&lt;br /&gt;
   # Import necessary libraries&lt;br /&gt;
   import seaborn as sns&lt;br /&gt;
   import matplotlib.pyplot as plt&lt;br /&gt;
   &lt;br /&gt;
   # Load iris data&lt;br /&gt;
   iris = sns.load_dataset(&amp;quot;iris&amp;quot;) #DATASET ALREADY EXISTING&lt;br /&gt;
   &lt;br /&gt;
   # Construct iris plot&lt;br /&gt;
   sns.swarmplot(x=&amp;quot;species&amp;quot;, y=&amp;quot;petal_length&amp;quot;, data=iris)&lt;br /&gt;
   &lt;br /&gt;
   # Show plot&lt;br /&gt;
   plt.show()&lt;br /&gt;
&lt;br /&gt;
==Pandas==&lt;br /&gt;
&lt;br /&gt;
Pandas est une API d'analyse de données orientée colonnes. C'est un excellent outil pour manipuler et analyser des données d'entrée. Beaucoup de frameworks d'apprentissage automatique acceptent les structures de données Pandas en entrée.&lt;br /&gt;
&lt;br /&gt;
Comme évoqué précédemment, Pandas travaille avec des matrices colonnes communément appelées ‘Series’ mais aussi et surtout avec des tableaux de données appelés ‘DataFrames’.&lt;br /&gt;
Une Series est tout simplement une colonne et une DataFrame est un tableau à plusieurs dimensions constitué de Series.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Panda.JPG]]&lt;br /&gt;
&lt;br /&gt;
A l'aide de Pandas, on peut ainsi créer, importer, lire et manipuler des bases de données facilement.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Théories des algorithmes étudiés''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Il y a différents types d’algorithmes en machine learning, pour notre sujet qui consiste à classer des machines en défectueuse ou fonctionnelles (1 ou 0), nous aurons surtout besoin d’algorithmes de classification binaire. De manière générale, la conception de la plupart des algorithmes fonctionnent de cette manière : &lt;br /&gt;
&lt;br /&gt;
* Élaborer un modèle &lt;br /&gt;
* Établir une fonction coût pour celui-ci correspondant à l’erreur entre le modèle et les données réelles&lt;br /&gt;
* Trouver un algorithme de minimisation de cette fonction coût&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression linéaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression1.png|200px|thumb|right|Exemple de régression linéaire]]&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est un algorithme de prédiction et non un algorithme de classification, nous aurons surtout besoin de ce deuxième type d’algorithme pour notre projet mais nous tenons à présenter cet algorithme qui est le plus basique en machine learning et un bon début pour une formation pédagogique.&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est une méthode de modélisation qui cherche à établir une relation linéaire entre une ou des &amp;quot;features&amp;quot; (variables explicatives) et une &amp;quot;target&amp;quot; (variable expliquée qu'on cherche à prévoir à partir des variables explicatives). En machine learning, la régression linéaire est un modèle d'apprentissage supervisé, c'est-à-dire qu'on apprend à l'algorithme de prédiction à partir d'exemples dont on dispose dans une dataset. Nous nous intéresserons à la régression affine qui est la plus simple pour débuter.&lt;br /&gt;
&lt;br /&gt;
===Modèle et estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
La régression affine consiste donc à trouver un modèle de type&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt;y=ax+b&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
avec x une &amp;quot;feature&amp;quot;, y la target et avec a et b des paramètres qu'il nous faudra déterminer. Le but est donc de trouver les paramètres a et b tels que la distance entre chaque point du nuage et la droite du modèle soit la plus petite possible.&lt;br /&gt;
Mathématiquement, il suffit de résoudre cette formule:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression2.png|200px|thumb|right|Méthode des moindres carrés illustrée]]&lt;br /&gt;
[[Fichier:regression3.png]]&lt;br /&gt;
&lt;br /&gt;
On utilise donc la méthode des moindres carrés pour mesurer l'erreur entre le modèle de prédiction et les données et ainsi fabriquer notre fonction coût :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression4.png]]&lt;br /&gt;
&lt;br /&gt;
avec m le nombre de points du nuage.&lt;br /&gt;
&lt;br /&gt;
L'objectif de l'algorithme est donc de trouver les paramètres optimaux qui minimisent cette fonction J.&lt;br /&gt;
En machine learning, une des méthodes les plus populaires pour faire ceci est la descente de gradient, car c'est une méthode adaptée quand on fait du traitement de grosses dataset (&amp;quot;faible&amp;quot; temps de calcul). En effet, la fonction coût J est une parabole admettant un unique minimum dépendant des paramètres a et b. La descente de gradient consiste à chercher le point de celle-ci où la dérivée est nulle (donc le minimum)&lt;br /&gt;
&lt;br /&gt;
===Méthode de la descente du gradient===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression6.png|200px|thumb|right|Méthode gradient]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression7.png|200px|thumb|right|Généralisation gradient fct parabolique]]&lt;br /&gt;
&lt;br /&gt;
Soit une fonction parabolique ne dépendant que de x. On cherche à trouver le minimum de cette fonction en utilisant la méthode de la descente du gradient&lt;br /&gt;
Pour cela on choisit un point aléatoirement &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;et on va descendre à partir de celui-ci jusqu'à atteindre un minimum en utilisant&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression5.png]]&lt;br /&gt;
&lt;br /&gt;
avec un paramètre  qui influencera la taille du pas de la descente.&lt;br /&gt;
&lt;br /&gt;
Il faut faire attention à ne pas prendre un pas trop grand, ni trop petit, pour éviter de &amp;quot;tourner&amp;quot; autour du minimum ou de prendre trop de temps pour l'atteindre.&lt;br /&gt;
Note : On peut généraliser cela pour une fonction parabolique à n paramètres qui aurait donc une forme de bol.&lt;br /&gt;
&lt;br /&gt;
===Application sur notre fonction coût===&lt;br /&gt;
&lt;br /&gt;
Notre fonction coût dépend des 2 paramètres a et b :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression8.png]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression9.png]]&lt;br /&gt;
&lt;br /&gt;
On choisit &amp;lt;math&amp;gt;a_0&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; aléatoirement et on applique ceci pour un pas :&lt;br /&gt;
&lt;br /&gt;
Avec &lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression10.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d'un certain nombre d'itérations on trouve le couple &amp;lt;math&amp;gt;(a,b)&amp;lt;/math&amp;gt; qui minimise notre fonction coût.&lt;br /&gt;
&lt;br /&gt;
Note : Nous avons démontré la théorie de la régression linéaire affine mais on pourrait généraliser celle-ci pour un modèle polynomiale d’ordre n, la courbe de prédiction serait donc parabolique et il faudrait trouver le tuple &amp;lt;math&amp;gt;(a_1,a_2,...,a_n)&amp;lt;/math&amp;gt; qui minimise la fonction coût.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression logistique binaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo1.png|200px|thumb|right|Modèle régression logistique]]&lt;br /&gt;
&lt;br /&gt;
La régression logistique binaire est un algorithme de classification, contrairement à la régression linéaire qui est un algorithme de prédiction. De la même façon que la régression linéaire,  il s'agit de modéliser au mieux un modèle mathématique simple à des observations réelles nombreuses. Cette méthode se base sur de l’analyse mathématiques et statistique. Il faut donc associer à des “features” &amp;lt;math&amp;gt;(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; une variable Y valant 1 ou 0 (d’où le terme classification binaire).&lt;br /&gt;
&lt;br /&gt;
L’objectif de l’algorithme est donc de trouver la fonction F dépendant d’une loi de probabilité telle que :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo2.png]]&lt;br /&gt;
&lt;br /&gt;
avec S un certain seuil (fixé la plupart du temps à 0,5).&lt;br /&gt;
&lt;br /&gt;
===Modèle===&lt;br /&gt;
&lt;br /&gt;
Comme cette méthode repose principalement sur des statistiques, il est important d’adopter une notation explicite lors de l’explication théorique :&lt;br /&gt;
&lt;br /&gt;
* On notera Y la variable à prédire (qui vaudra 0 ou 1) et &amp;lt;math&amp;gt;X=(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; les variables permettant de prédire Y&lt;br /&gt;
* On travaillera dans un univers  de N échantillons (taille de la dataset)&lt;br /&gt;
* On notera &amp;lt;math&amp;gt;P(Y=1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;P(Y=0)&amp;lt;/math&amp;gt; les probabilités que Y valent respectivement 1 ou 0 &amp;lt;math&amp;gt;p(1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0)&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;p(X|1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(X|0)&amp;lt;/math&amp;gt; sont les distributions conditionnelles des caractéristiques X sachant la valeur prise par Y&lt;br /&gt;
* &amp;lt;math&amp;gt;p(1|X)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0|X)&amp;lt;/math&amp;gt; sont donc les probabilités d’obtenir la valeur de Y (1 ou 0) sachant les valeurs de X&lt;br /&gt;
&lt;br /&gt;
La régression logistique utilise l’hypothèse fondamentale (mesure de l’évidence) :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo3.png]]&lt;br /&gt;
&lt;br /&gt;
On en déduit donc (comme &amp;lt;math&amp;gt;p(0|X)=1-p(1|X))&amp;lt;/math&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo4.png]]&lt;br /&gt;
&lt;br /&gt;
Avec &amp;lt;math&amp;gt;(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; des variables à déterminer.&lt;br /&gt;
&lt;br /&gt;
''Note :'' ce modèle est appelé modèle LOGIT.&lt;br /&gt;
&lt;br /&gt;
===Estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
Contrairement à la régression linéaire affine, on ne peut pas utiliser la méthode des moindres carrés, on utilise alors la méthode de maximisation de la vraisemblance.&lt;br /&gt;
“La vraisemblance mesure une adéquation entre la distribution observée sur un échantillon aléatoire et une loi de probabilité supposée décrire une réalité sur la population dont l'échantillon est issu.” (source : [www.jybaudot.fr])&lt;br /&gt;
&lt;br /&gt;
Le calcul de la vraisemblance L dans un univers  de N échantillons est le suivant :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo5.png]]&lt;br /&gt;
&lt;br /&gt;
Plus la vraisemblance est élevée, alors plus la loi de probabilité est proche de la réalité. Le but est donc de maximiser cette valeur et de trouver les valeurs optimales de &amp;lt;math&amp;gt;A =(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; qui influent directement sur la loi de probabilité établie dans la partie modèle.&lt;br /&gt;
&lt;br /&gt;
===Algorithme d'optimisation===&lt;br /&gt;
&lt;br /&gt;
Afin de trouver la valeur optimale du vecteur A, nous utiliserons encore une fois la méthode de descente du gradient adaptée à notre cas.&lt;br /&gt;
&lt;br /&gt;
Celle-ci utilise la relation suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo6.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d’un certain nombre d’itérations, on trouvera la valeur optimale de A afin de maximiser la vraisemblance.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Mise en pratique''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Pour la mise en pratique, nous avons décidé d’appliquer les méthodes sur un dataset de prédiction de maintenance pour l’industrie, nous importons grâce à la librairie panda : &amp;lt;code&amp;gt; dataset = pd.read_csv('ai4i2020.csv') &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette dataset contient 14 colonnes de données, nous pouvons visualiser la proportion de données saines et non-saines par ce code seaborn : &amp;lt;code&amp;gt; sns.factorplot('Machine failure',data=dataset,kind='count') &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on traitera cette dataset pour la préparer sur l’intervention des modèles de machine learning, puis on appliquera ces méthodes.&lt;br /&gt;
&lt;br /&gt;
==Pré-traitement de la dataset==&lt;br /&gt;
&lt;br /&gt;
Avant d’appliquer les algorithme sur notre dataset, il faut la traiter, le traitement sera le même pour tous les algorithmes et suivra cet ordre :&lt;br /&gt;
* Traitement des valeurs manquantes&lt;br /&gt;
* Équilibrage des données&lt;br /&gt;
* Séparations des données en entrainement et test&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous devons regarder si notre base de données contient des valeurs manquante, pour cela nous implantons ce code : &lt;br /&gt;
&lt;br /&gt;
   import missingno as msno&lt;br /&gt;
   msno.matrix(dataset)&lt;br /&gt;
&lt;br /&gt;
Les lignes blanches dans le résultat correspond aux valeurs manquantes, ci-dessous nous voyons que nous avons aucune données manquantes dans la base que nous avons importer : [[Fichier:Miseenpratique.png]]&lt;br /&gt;
&lt;br /&gt;
Dans le cas, où nous avons des valeurs manquante, il y a plusieurs méthodes pour traiter les valeurs manquantes mais nous retenons 2 méthodes :&lt;br /&gt;
* Une méthode qui consiste à supprimer les lignes où des valeurs manquantes sont présentes : &amp;lt;code&amp;gt; data.dropna(inplace=True) &amp;lt;/code&amp;gt;&lt;br /&gt;
L’avantage de cette méthode est de créer un modèle robuste. L’inconvénient majeur est le fait qu’on peut perdre énormément de données, pour des données où les valeurs manquantes sont excessives, mieux vaut appliquer une autre méthode.&lt;br /&gt;
&lt;br /&gt;
* Une méthode qui consiste à remplacer les valeurs manquantes par la moyenne des données de la colonne : &amp;lt;code&amp;gt; data[0]=drop[0].replace(np.NaN,data[0].mean()) &amp;lt;/code&amp;gt; L’avantage de cette méthode permet d’éviter la suppression de lignes, ce qui permet de garder les autres données comparé à l’autre méthode. Cependant cette méthode n’est que applicable sur les données numériques&lt;br /&gt;
&lt;br /&gt;
Nous passons alors sur l'équilibrage des données. Avant d’appliquer la méthode SMOTE, nous devons mettre dans 2 variables, la target (y) et les features (X) :&lt;br /&gt;
&lt;br /&gt;
   X = dataset.drop(['Machine failure','UDI','Product ID','Type','TWF','HDF','PWF','OSF','RNF'],axis=1).values&lt;br /&gt;
   y = dataset['Machine failure']&lt;br /&gt;
&lt;br /&gt;
Notre target sera seulement ‘Machine failure’ et nos features seront : la température de l’air, la température du processus, le couple, et l’usure des outils.&lt;br /&gt;
&lt;br /&gt;
Durant notre projet , nous avons implémenté la technique SMOTE pour traiter les ensembles de données déséquilibrées.&lt;br /&gt;
Le principe de SMOTE est de générer de nouveaux échantillons en combinant les données de la classe minoritaire avec celles de leurs voisins proches. Techniquement, on peut décomposer SMOTE en 5 étapes :&lt;br /&gt;
* 1 - Choix d’un vecteur caractéristique de notre classe minoritaire que nous appellerons vc &lt;br /&gt;
* 2 - Sélection des k-voisins les plus proches (k=5 par défaut) et choix de l’un d’eux au hasard que l’on appellera pv &lt;br /&gt;
* 3 - Calcul de la différence pour chaque valeur caractéristique (feature value) i, vc[i]-pv[i] et multiplication de celle-ci par un nombre aléatoire entre [0,1]&lt;br /&gt;
* 4 - Ajout du résultat précédent à la valeur de la caractéristique i du vecteur vc afin d’obtenir un nouveau point (une nouvelle donnée) dans l’espace des caractéristiques &lt;br /&gt;
* 5 - Répétition de ces opérations pour chaque point de données de la classe minoritaire &lt;br /&gt;
Nous remarquons que cette technique marche après smote (50% données saines, 50% données non-saines)&lt;br /&gt;
&lt;br /&gt;
Code : &lt;br /&gt;
&lt;br /&gt;
   oversample = SMOTE()&lt;br /&gt;
   Xsmote, ysmote = oversample.fit_resample(X,y)&lt;br /&gt;
   Xsmote = pd.DataFrame(Xsmote)&lt;br /&gt;
   ysmote = pd.DataFrame(ysmote)&lt;br /&gt;
   X=Xsmote&lt;br /&gt;
   y=ysmote&lt;br /&gt;
&lt;br /&gt;
On remarque que la technique smote a ajouté 9322 lignes sur notre base, Maintenant que nous avons un équilibre entre les données ‘sains’ et ‘malsains’, nous pouvons voir la répartitions des points sur 2 axes :&lt;br /&gt;
&lt;br /&gt;
(image)&lt;br /&gt;
&lt;br /&gt;
Nous pouvons alors procéder à la séparation de nos données en données d'entraînement et de test&lt;br /&gt;
&lt;br /&gt;
Nous devons séparer en deux nos données pour pouvoir appliquer les algorithmes de machine learning, ainsi : &lt;br /&gt;
Les données d'entraînement serviront de repères pour l’algorithme&lt;br /&gt;
Les données de test seront entraînées par celle d’entrainement pour créer une prédiction&lt;br /&gt;
&lt;br /&gt;
Nous allons utiliser la fonction train_test_split de la librairie sklearn pour séparer nos données : &lt;br /&gt;
&lt;br /&gt;
   X_train, X_test, y_train, y_test = train_test_split(X,y, test_size = 0.2, random_state = 100)&lt;br /&gt;
&lt;br /&gt;
Ici dans les paramètres :&lt;br /&gt;
X  correspond aux features&lt;br /&gt;
y correspond à la target&lt;br /&gt;
test_size correspond au pourcentage de séparation (soit 0.2 = 20% test et 80% d'entraînement)&lt;br /&gt;
random_state permet d’initialiser le choix aléatoire pour avoir la même répartition à chaque exécution&lt;br /&gt;
&lt;br /&gt;
Maintenant nous pouvons appliquer les algorithme à notre modèle&lt;br /&gt;
&lt;br /&gt;
==Application des algorithmes==&lt;br /&gt;
&lt;br /&gt;
En général, nous allons appliquer les algorithme en suivant cet ordre : &lt;br /&gt;
* Importation de la méthode sur la librairie sklearn&lt;br /&gt;
* Entraînement des données&lt;br /&gt;
* Prédiction&lt;br /&gt;
* Méthodes d’évaluations&lt;br /&gt;
&lt;br /&gt;
===Régression linéaire===&lt;br /&gt;
&lt;br /&gt;
Nous allons commencer par le plus simple : la régression linéaire, nous commençons par importer l’algorithme à partir de la librairie sklearn : &amp;lt;code&amp;gt; from sklearn.linear_model import LinearRegression &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis nous appelons l’algorithme avec les paramètres de base, puis nous entraînons notre dataset : &lt;br /&gt;
   #Méthode de régréssion linéaire&lt;br /&gt;
   lr = LinearRegression()&lt;br /&gt;
   #Training&lt;br /&gt;
   lr.fit(X_train,y_train)&lt;br /&gt;
&lt;br /&gt;
Ensuite la prédiction : &lt;br /&gt;
   #Prediction&lt;br /&gt;
   y_pred = lr.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
Et enfin l'évaluation, nous avons vu 2 méthodes pour évaluer notre modèle : &lt;br /&gt;
* Afficher le score de prédiction&lt;br /&gt;
* Afficher la matrice de confusion, une matrice de taille 2x2 qui donne ces informations : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatrixConfusion.png]]&lt;br /&gt;
&lt;br /&gt;
Le score de prédiction (accuracy) est également calculé à partir de cette matrice&lt;br /&gt;
Pour la régression linéaire, nous allons qu’afficher le score de prédiction, car cet algorithme nous donne en retour des valeurs non-binaire, la construction d’une matrice de confusion et impossible.&lt;br /&gt;
&lt;br /&gt;
   #Evaluation&lt;br /&gt;
   print(lr.score(X_test,y_test))&lt;br /&gt;
&lt;br /&gt;
Nous obtenons ainsi un score de 0.48, un score qui est plus élevé sans la méthode SMOTE (0.14), sauf que cette méthode n’est pas la plus optimisée pour cette base de données, car nous avons en target des valeurs binaires. Il vaut mieux appliquer la méthode de régression logistique ou la méthode de Naives-Bayes.&lt;br /&gt;
&lt;br /&gt;
===Régression logistique===&lt;br /&gt;
&lt;br /&gt;
Dans le même modèle que la régression linéaire, nous procédons à l’import de la méthode, l’appel de la méthode, l'entraînement des données et de la prédiction :&lt;br /&gt;
&lt;br /&gt;
   from sklearn import linear_model&lt;br /&gt;
&lt;br /&gt;
   #Modèle régression logistique&lt;br /&gt;
   modele_regLog = linear_model.LogisticRegression() &lt;br /&gt;
   #random_state = 100, solver = 'liblinear', multi_class = 'auto'&lt;br /&gt;
&lt;br /&gt;
   #training&lt;br /&gt;
   modele_regLog.fit(X_train,y_train)&lt;br /&gt;
&lt;br /&gt;
   #prediction&lt;br /&gt;
   y_pred = modele_regLog.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
   #précision du modèle&lt;br /&gt;
   precision = modele_regLog.score(X_test,y_test)&lt;br /&gt;
   print(precision)&lt;br /&gt;
&lt;br /&gt;
Pour la régression logistique, nous allons afficher la matrice de confusion et le score :&lt;br /&gt;
&lt;br /&gt;
   from sklearn.metrics import plot_confusion_matrix&lt;br /&gt;
   plot_confusion_matrix(modele_regLog, X_test, y_test)  &lt;br /&gt;
   plt.show() &lt;br /&gt;
&lt;br /&gt;
(images)&lt;br /&gt;
&lt;br /&gt;
Nous obtenons un score de 0.82, contre 0.97 sans la méthode de SMOTE, ce qui est cohérent car le score obtenu sans SMOTE n’est pas précis car il y avait peu de données où la machine a planté. Avec SMOTE, nous obtenons certes un score moins élevé mais plus précis.&lt;br /&gt;
Grâce à la matrice de confusion nous pouvons voir que : &lt;br /&gt;
* Il y a 2396 fois où l’algorithme a prédit Machine failure = 0 et a eu raison&lt;br /&gt;
* Il y a 2377 fois où l’algorithme a prédit Machine failure = 1 et a eu raison&lt;br /&gt;
* Il y a 546 fois où l’algorithme a prédit Machine failure = 1 et a eu faux&lt;br /&gt;
* Il y a 478 fois où l’algorithme a prédit Machine failure = 0 et a eu faux&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 0px; padding: 20px; font-weight: bold; text-align: center; font-size: 80%; background: #61798F; vertical-align: top; width: 100%;&amp;quot;&amp;gt; '''PARTIE II (S8)''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Développement du projet''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Durant les deux premiers semestres, nous avons découvert et étudié le Machine Learning, que ce soit la théorie de différents algorithmes connus ou l'application à pratique à des datasets que nous pouvons récupérer sur Internet ou bien les créer nous même. La création de notre dataset ayant été fastidieuse et peu concluante (voir résultats précédents), nous avons comme objectif pour ce semestre d'implémenter nos algorithmes (et principalement le réseau de neurones) à des machines dont nous avons accès à l'école.&lt;br /&gt;
Après discussion avec notre tuteur de projet Monsieur Lakhal, nous avons décidé d'utiliser des Robotino plutôt que d'utiliser la chaîne de production présente à l'école car il existe des logiciels simples permettant d'effectuer des simulations de réseaux logistiques de Robotinos (Robotino View et Robotino Simulation) dont nous allons récupérer les données en temps réel et les traiter sur Matlab à l'aide de notre algorithme de réseaux de neurones.&lt;br /&gt;
&lt;br /&gt;
L'objectif est ainsi de réaliser le scénario d'un réseau logistique (à l'image d'Amazon par exemple) composé de plusieurs Robotino effectuant chacun une tache et d'y introduire des erreurs puis de les traiter afin de ne pas perturber la logistique.&lt;br /&gt;
&lt;br /&gt;
=Recherche bibliographique=&lt;br /&gt;
&lt;br /&gt;
* https://www.wikipedia.com&lt;br /&gt;
&lt;br /&gt;
* https://www.jybaudot.fr&lt;br /&gt;
&lt;br /&gt;
* https://datascientest.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.ipgirl.com&lt;br /&gt;
&lt;br /&gt;
* Cours de probabilités et statistiques de l’Université Jules Vernes&lt;br /&gt;
&lt;br /&gt;
* Chaine youtube Machine Learning : https://www.youtube.com/channel/UCmpptkXu8iIFe6kfDK5o7VQ&lt;br /&gt;
&lt;br /&gt;
* Machine Learning with scikit-learn Quick Start Guide écrit par Kevin Jolly&lt;br /&gt;
&lt;br /&gt;
* https://lucidar.me/&lt;br /&gt;
&lt;br /&gt;
* https://archive.ics.uci.edu/ml/datasets.php&lt;br /&gt;
&lt;br /&gt;
* https://www.kaggle.com/datasets&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com/&lt;br /&gt;
&lt;br /&gt;
* Machine Learning algorithms - Second Edition écrit par Giuseppe Bonaccorso&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com&lt;br /&gt;
&lt;br /&gt;
* https://towardsdatascience.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.learndatasci.com/&lt;br /&gt;
&lt;br /&gt;
==Rapports et présentation==&lt;br /&gt;
&lt;br /&gt;
===Librairies===&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1CQZ1s6fNY_6MsmbBa5TP1OzSedqFeaWI?usp=sharing/ Rapport Numpy]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1tdu_B2wRsUiqdnSeskQENdn_wX3pJMeT?usp=sharing/ Rapport Pandas]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1DPS4ZT91SIEhscwST8kfER7u21tKoM3a?usp=sharing/ Rapport Seaborn]&lt;br /&gt;
&lt;br /&gt;
===Rapports===&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/document/d/1yR0vLePV3hI1_HVtTZWwGIwy0Cb-oLOsOTK3Um5KAYE/edit?usp=sharing/ Rapport]&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/presentation/d/1Je_yF0dgc-s9gB7LLsfOg0b05xcwIFJbaqpVytxWv5A/edit?usp=sharing/ Présentation]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1y_NMo9XKJ0WzwE2zmcRblUyuIebwfoN8?usp=sharing/ Régression linéaire]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1bRyrnL1JM870cEcEvfGaS8ItrG16rchy?usp=sharing/ Google Colab]&lt;/div&gt;</summary>
		<author><name>Abrossas</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88025</id>
		<title>IMA3/IMA4 2020/2022 P5</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88025"/>
				<updated>2022-02-09T16:00:03Z</updated>
		
		<summary type="html">&lt;p&gt;Abrossas : m&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 0px; padding: 20px; font-weight: bold; text-align: center; font-size: 80%; background: #61798F; vertical-align: top; width: 100%;&amp;quot;&amp;gt; '''PARTIE I (S6-S7)''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Introduction et cahier des charges''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce projet est la mise en place d’algorithmes de machine Learning afin de diagnostiquer l’état de machines industrielles. Nous travaillerons sur ce projet durant 2 semestres. &lt;br /&gt;
Durant le premier semestre, nous avions comme objectifs d’acquérir la maîtrise des différentes librairies primordiales pour traiter les données en machine Learning, ainsi que d’étudier et d’utiliser certains algorithmes basiques (régression linéaire, logistique, Bayes) sur des datasets que nous traiterons nous même. &lt;br /&gt;
Pour ce qui est du second semestre, notre objectif était de concrétiser les connaissances acquises durant le premier semestre. Nous avons donc essayé de créer notre propre dataset à l’aide des matériels mis à notre disposition, de la prétraiter et d’y appliquer différents algorithmes de Machine Learning en critiquant les résultats.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning pour la détection de défaut s'inscrit parfaitement dans le contexte scientifique actuel, notamment grâce à l’industrie 4.0.&lt;br /&gt;
En effet, cette nouvelle industrie fait apparaître des systèmes communicants (l’IOT : Internet Of Things) interconnectés les uns entre les autres. Ces différents systèmes peuvent êtres nécessaires les uns, les autres afin de réaliser une tâche complexe telle que l'usinage de pièces. Le système devient dès lors potentiellement extrêmement fragile aux pannes.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning a pour but de pouvoir détecter, et localiser les pannes, voir les futures pannes potentielles afin de pouvoir dans un premier temps prévenir un opérateur. Mais il peut aussi potentiellement permettre au système de continuer de tourner, en attendant un technicien. Le machine Learning peut donc aussi permettre à une chaîne de production de continuer de tourner par l’envoie d’un autre robot par exemple, le temps que la panne soit réparée.&lt;br /&gt;
&lt;br /&gt;
Dans le schéma ci-dessous nous avons un exemple de système de système.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Intro1.png|500px|thumb|center|Schéma d'un système de systèmes]]&lt;br /&gt;
&lt;br /&gt;
Il y a deux cas de figure:&lt;br /&gt;
* Un autre système peut être envoyé pour remplacer le système 4.&lt;br /&gt;
* Les systèmes 1 et 2 peuvent permettre à la chaîne de production de continuer de tourner&lt;br /&gt;
* La chaîne de production est hors service jusqu'à réparation.&lt;br /&gt;
&lt;br /&gt;
==Cahier de charges==&lt;br /&gt;
&lt;br /&gt;
'''Ressources disponibles :'''&lt;br /&gt;
&lt;br /&gt;
* Livres sur le machine learning &lt;br /&gt;
* Bases de données (afin d'appliquer divers algorithmes de machine learning) que nous prendrons sur ces sites : [https://www.kaggle.com/datasets] et [https://archive.ics.uci.edu/ml/datasets.php]&lt;br /&gt;
* Librairies Python (Scikit-learn, Pandas, Numpy, Seaborn, Matplotlib)&lt;br /&gt;
* Google Colab&lt;br /&gt;
* Matlab (version étudiante)&lt;br /&gt;
&lt;br /&gt;
'''Objectifs poursuivis :'''&lt;br /&gt;
&lt;br /&gt;
* Détecter les dysfonctionnements de systèmes mécatroniques (par exemple les robots Khepera, Robotino…), grâce au machine learning.&lt;br /&gt;
* Apprendre à implémenter différentes méthodes machine learning .&lt;br /&gt;
&lt;br /&gt;
'''Profil du public cible :'''&lt;br /&gt;
* Secteur mécatronique&lt;br /&gt;
* Entreprises disposant d'ingénieurs pour maintenir le système informatique opérationnel&lt;br /&gt;
* Entreprises utilisant des machines dans le secteur public.&lt;br /&gt;
&lt;br /&gt;
'''Analyse des besoins :'''&lt;br /&gt;
* L’industrie a de plus en plus besoin du machine learning pour détecter les erreurs des systèmes. En effet, cette technologie devient indispensable pour les industriels, notamment afin d'accroître la productivité et l’efficacité des systèmes industriels.&lt;br /&gt;
* Le programme peut ne pas être aussi rapide et optimisé en espace mémoire que d'autres programmes, nous visons l’efficacité de notre algorithme plutôt que la rapidité.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Librairies''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
En Machine Learning, il est très important, voire primordial, de savoir manipuler les différentes librairies mises à notre disposition afin de visualiser, traiter nos différentes dataset ou même appliquer les différents algorithmes de machine Learning.&lt;br /&gt;
Durant les premières semaines de notre projet, nous avons donc appris à utiliser ces différentes librairies nécessaires pour le machine Learning, telles que Numpy, Seaborn, Panda, Matplotlib, Scikit-learn... Nous allons dans un premier temps nous intéresser à l'importation des différentes bibliothèques puis résumer les commandes importantes de ces différentes librairies.&lt;br /&gt;
&lt;br /&gt;
Ces différentes librairies ne sont pas incluses de base dans Python, il est donc nécessaire de les ajouter à Python puis à notre programme.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc choisi d'utiliser google colab car ces librairies y sont déjà installées (et aussi pratique pour travailler à plusieurs sur un même code).&lt;br /&gt;
Puis nous devons importer ces bibliothèques au début de notre programme.&lt;br /&gt;
&lt;br /&gt;
Attention : Plusieurs bibliothèques peuvent avoir la même commande mais avec des significations différentes, comme par exemple la commande randint du module numpy et celle du module random et cela peut conduire à des erreurs. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de pallier à ces problèmes nous apporterons nos librairie au début de nos programmes comme suit :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:librairies1.png]]&lt;br /&gt;
&lt;br /&gt;
Ici le np permet de dire que lorsque nous utilisons np.array alors nous utilisons la commande array () contenu dans la bibliothèque Numpy.&lt;br /&gt;
&lt;br /&gt;
Ceci nous permettra d’utiliser en simultané différentes librairies, toutes les bibliothèques seront importées selon ce schéma.&lt;br /&gt;
Nous allons par la suite, nous intéresser à différentes commandes incluses dans ces librairies.&lt;br /&gt;
&lt;br /&gt;
==Numpy==&lt;br /&gt;
&lt;br /&gt;
Numpy est une bibliothèque dédiée aux calculs mathématiques et à la gestion des listes (telles que des matrices).&lt;br /&gt;
Matplotlib, quant à lui, est dédié aux affichages graphiques de données.&lt;br /&gt;
Nous allons dans cette partie nous intéresser aux commandes principales de ces deux bibliothèques de python.&lt;br /&gt;
&lt;br /&gt;
Sous numpy, les tableaux sont des types array, ils définissent l'équivalent des tableaux statiques en langage C. La taille d’un tableau numpy ne peut donc pas être changée après leur création. &lt;br /&gt;
&lt;br /&gt;
Néanmoins grâce a Numpy nous pouvons simplement effectuer des tâches sur les tableaux comme en extraire un sous tableaux, et d’effectuer simplement les produits entre matrice, vecteur.&lt;br /&gt;
&lt;br /&gt;
Dans notre projet, nous utiliserons plus courament les fonctions : &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.shape&amp;lt;/FONT&amp;gt; permet d’obtenir la taille de la matrice sous forme d’un tuple, suffit de choisir le bon numéro&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.zeros&amp;lt;/FONT&amp;gt; permet de créer une ligne de x zéro(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.ones&amp;lt;/FONT&amp;gt; permet de créer une ligne de x un(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.vstack&amp;lt;/FONT&amp;gt; permet de rajouter des lignes dans une matrice déjà créer en paramètre&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.transpose&amp;lt;/FONT&amp;gt; permet de transposer une matrice en paramètre&lt;br /&gt;
&lt;br /&gt;
==Seaborn==&lt;br /&gt;
&lt;br /&gt;
Seaborn est une bibliothèque de visualisation de données Python basée sur matplotlib. Il fournit une interface de haut niveau pour dessiner des graphiques statistiques attrayants et informatifs.&lt;br /&gt;
&lt;br /&gt;
'''Différences entre Matplotlib et Seaborn'''&lt;br /&gt;
&lt;br /&gt;
Les défauts de Matplotlib qui ne parlent généralement pas aux utilisateurs sont les couleurs, les marques de tiques sur les axes supérieur et droit, le style,...&lt;br /&gt;
Les exemples ci-dessus rendent également une autre frustration des utilisateurs plus apparente: le fait que travailler avec DataFrames ne va pas aussi bien avec Matplotlib, ce qui peut être ennuyeux si vous faites une analyse exploratoire avec Pandas. Et c’est exactement ce que Seaborn adresse : les fonctions de traçage fonctionnent sur dataframes et tableaux qui contiennent tout un ensemble de données.&lt;br /&gt;
[[Fichier:seaborn1.png|300px|thumb|right|Résultat du code python ci gauche]]&lt;br /&gt;
&lt;br /&gt;
   # Import necessary libraries&lt;br /&gt;
   import seaborn as sns&lt;br /&gt;
   import matplotlib.pyplot as plt&lt;br /&gt;
   &lt;br /&gt;
   # Load iris data&lt;br /&gt;
   iris = sns.load_dataset(&amp;quot;iris&amp;quot;) #DATASET ALREADY EXISTING&lt;br /&gt;
   &lt;br /&gt;
   # Construct iris plot&lt;br /&gt;
   sns.swarmplot(x=&amp;quot;species&amp;quot;, y=&amp;quot;petal_length&amp;quot;, data=iris)&lt;br /&gt;
   &lt;br /&gt;
   # Show plot&lt;br /&gt;
   plt.show()&lt;br /&gt;
&lt;br /&gt;
==Pandas==&lt;br /&gt;
&lt;br /&gt;
Pandas est une API d'analyse de données orientée colonnes. C'est un excellent outil pour manipuler et analyser des données d'entrée. Beaucoup de frameworks d'apprentissage automatique acceptent les structures de données Pandas en entrée.&lt;br /&gt;
&lt;br /&gt;
Comme évoqué précédemment, Pandas travaille avec des matrices colonnes communément appelées ‘Series’ mais aussi et surtout avec des tableaux de données appelés ‘DataFrames’.&lt;br /&gt;
Une Series est tout simplement une colonne et une DataFrame est un tableau à plusieurs dimensions constitué de Series.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Panda.JPG]]&lt;br /&gt;
&lt;br /&gt;
A l'aide de Pandas, on peut ainsi créer, importer, lire et manipuler des bases de données facilement.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Théories des algorithmes étudiés''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Il y a différents types d’algorithmes en machine learning, pour notre sujet qui consiste à classer des machines en défectueuse ou fonctionnelles (1 ou 0), nous aurons surtout besoin d’algorithmes de classification binaire. De manière générale, la conception de la plupart des algorithmes fonctionnent de cette manière : &lt;br /&gt;
&lt;br /&gt;
* Élaborer un modèle &lt;br /&gt;
* Établir une fonction coût pour celui-ci correspondant à l’erreur entre le modèle et les données réelles&lt;br /&gt;
* Trouver un algorithme de minimisation de cette fonction coût&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression linéaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression1.png|200px|thumb|right|Exemple de régression linéaire]]&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est un algorithme de prédiction et non un algorithme de classification, nous aurons surtout besoin de ce deuxième type d’algorithme pour notre projet mais nous tenons à présenter cet algorithme qui est le plus basique en machine learning et un bon début pour une formation pédagogique.&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est une méthode de modélisation qui cherche à établir une relation linéaire entre une ou des &amp;quot;features&amp;quot; (variables explicatives) et une &amp;quot;target&amp;quot; (variable expliquée qu'on cherche à prévoir à partir des variables explicatives). En machine learning, la régression linéaire est un modèle d'apprentissage supervisé, c'est-à-dire qu'on apprend à l'algorithme de prédiction à partir d'exemples dont on dispose dans une dataset. Nous nous intéresserons à la régression affine qui est la plus simple pour débuter.&lt;br /&gt;
&lt;br /&gt;
===Modèle et estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
La régression affine consiste donc à trouver un modèle de type&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt;y=ax+b&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
avec x une &amp;quot;feature&amp;quot;, y la target et avec a et b des paramètres qu'il nous faudra déterminer. Le but est donc de trouver les paramètres a et b tels que la distance entre chaque point du nuage et la droite du modèle soit la plus petite possible.&lt;br /&gt;
Mathématiquement, il suffit de résoudre cette formule:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression2.png|200px|thumb|right|Méthode des moindres carrés illustrée]]&lt;br /&gt;
[[Fichier:regression3.png]]&lt;br /&gt;
&lt;br /&gt;
On utilise donc la méthode des moindres carrés pour mesurer l'erreur entre le modèle de prédiction et les données et ainsi fabriquer notre fonction coût :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression4.png]]&lt;br /&gt;
&lt;br /&gt;
avec m le nombre de points du nuage.&lt;br /&gt;
&lt;br /&gt;
L'objectif de l'algorithme est donc de trouver les paramètres optimaux qui minimisent cette fonction J.&lt;br /&gt;
En machine learning, une des méthodes les plus populaires pour faire ceci est la descente de gradient, car c'est une méthode adaptée quand on fait du traitement de grosses dataset (&amp;quot;faible&amp;quot; temps de calcul). En effet, la fonction coût J est une parabole admettant un unique minimum dépendant des paramètres a et b. La descente de gradient consiste à chercher le point de celle-ci où la dérivée est nulle (donc le minimum)&lt;br /&gt;
&lt;br /&gt;
===Méthode de la descente du gradient===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression6.png|200px|thumb|right|Méthode gradient]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression7.png|200px|thumb|right|Généralisation gradient fct parabolique]]&lt;br /&gt;
&lt;br /&gt;
Soit une fonction parabolique ne dépendant que de x. On cherche à trouver le minimum de cette fonction en utilisant la méthode de la descente du gradient&lt;br /&gt;
Pour cela on choisit un point aléatoirement &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;et on va descendre à partir de celui-ci jusqu'à atteindre un minimum en utilisant&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression5.png]]&lt;br /&gt;
&lt;br /&gt;
avec un paramètre  qui influencera la taille du pas de la descente.&lt;br /&gt;
&lt;br /&gt;
Il faut faire attention à ne pas prendre un pas trop grand, ni trop petit, pour éviter de &amp;quot;tourner&amp;quot; autour du minimum ou de prendre trop de temps pour l'atteindre.&lt;br /&gt;
Note : On peut généraliser cela pour une fonction parabolique à n paramètres qui aurait donc une forme de bol.&lt;br /&gt;
&lt;br /&gt;
===Application sur notre fonction coût===&lt;br /&gt;
&lt;br /&gt;
Notre fonction coût dépend des 2 paramètres a et b :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression8.png]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression9.png]]&lt;br /&gt;
&lt;br /&gt;
On choisit &amp;lt;math&amp;gt;a_0&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; aléatoirement et on applique ceci pour un pas :&lt;br /&gt;
&lt;br /&gt;
Avec &lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression10.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d'un certain nombre d'itérations on trouve le couple &amp;lt;math&amp;gt;(a,b)&amp;lt;/math&amp;gt; qui minimise notre fonction coût.&lt;br /&gt;
&lt;br /&gt;
Note : Nous avons démontré la théorie de la régression linéaire affine mais on pourrait généraliser celle-ci pour un modèle polynomiale d’ordre n, la courbe de prédiction serait donc parabolique et il faudrait trouver le tuple &amp;lt;math&amp;gt;(a_1,a_2,...,a_n)&amp;lt;/math&amp;gt; qui minimise la fonction coût.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression logistique binaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo1.png|200px|thumb|right|Modèle régression logistique]]&lt;br /&gt;
&lt;br /&gt;
La régression logistique binaire est un algorithme de classification, contrairement à la régression linéaire qui est un algorithme de prédiction. De la même façon que la régression linéaire,  il s'agit de modéliser au mieux un modèle mathématique simple à des observations réelles nombreuses. Cette méthode se base sur de l’analyse mathématiques et statistique. Il faut donc associer à des “features” &amp;lt;math&amp;gt;(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; une variable Y valant 1 ou 0 (d’où le terme classification binaire).&lt;br /&gt;
&lt;br /&gt;
L’objectif de l’algorithme est donc de trouver la fonction F dépendant d’une loi de probabilité telle que :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo2.png]]&lt;br /&gt;
&lt;br /&gt;
avec S un certain seuil (fixé la plupart du temps à 0,5).&lt;br /&gt;
&lt;br /&gt;
===Modèle===&lt;br /&gt;
&lt;br /&gt;
Comme cette méthode repose principalement sur des statistiques, il est important d’adopter une notation explicite lors de l’explication théorique :&lt;br /&gt;
&lt;br /&gt;
* On notera Y la variable à prédire (qui vaudra 0 ou 1) et &amp;lt;math&amp;gt;X=(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; les variables permettant de prédire Y&lt;br /&gt;
* On travaillera dans un univers  de N échantillons (taille de la dataset)&lt;br /&gt;
* On notera &amp;lt;math&amp;gt;P(Y=1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;P(Y=0)&amp;lt;/math&amp;gt; les probabilités que Y valent respectivement 1 ou 0 &amp;lt;math&amp;gt;p(1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0)&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;p(X|1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(X|0)&amp;lt;/math&amp;gt; sont les distributions conditionnelles des caractéristiques X sachant la valeur prise par Y&lt;br /&gt;
* &amp;lt;math&amp;gt;p(1|X)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0|X)&amp;lt;/math&amp;gt; sont donc les probabilités d’obtenir la valeur de Y (1 ou 0) sachant les valeurs de X&lt;br /&gt;
&lt;br /&gt;
La régression logistique utilise l’hypothèse fondamentale (mesure de l’évidence) :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo3.png]]&lt;br /&gt;
&lt;br /&gt;
On en déduit donc (comme &amp;lt;math&amp;gt;p(0|X)=1-p(1|X))&amp;lt;/math&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo4.png]]&lt;br /&gt;
&lt;br /&gt;
Avec &amp;lt;math&amp;gt;(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; des variables à déterminer.&lt;br /&gt;
&lt;br /&gt;
''Note :'' ce modèle est appelé modèle LOGIT.&lt;br /&gt;
&lt;br /&gt;
===Estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
Contrairement à la régression linéaire affine, on ne peut pas utiliser la méthode des moindres carrés, on utilise alors la méthode de maximisation de la vraisemblance.&lt;br /&gt;
“La vraisemblance mesure une adéquation entre la distribution observée sur un échantillon aléatoire et une loi de probabilité supposée décrire une réalité sur la population dont l'échantillon est issu.” (source : [www.jybaudot.fr])&lt;br /&gt;
&lt;br /&gt;
Le calcul de la vraisemblance L dans un univers  de N échantillons est le suivant :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo5.png]]&lt;br /&gt;
&lt;br /&gt;
Plus la vraisemblance est élevée, alors plus la loi de probabilité est proche de la réalité. Le but est donc de maximiser cette valeur et de trouver les valeurs optimales de &amp;lt;math&amp;gt;A =(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; qui influent directement sur la loi de probabilité établie dans la partie modèle.&lt;br /&gt;
&lt;br /&gt;
===Algorithme d'optimisation===&lt;br /&gt;
&lt;br /&gt;
Afin de trouver la valeur optimale du vecteur A, nous utiliserons encore une fois la méthode de descente du gradient adaptée à notre cas.&lt;br /&gt;
&lt;br /&gt;
Celle-ci utilise la relation suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo6.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d’un certain nombre d’itérations, on trouvera la valeur optimale de A afin de maximiser la vraisemblance.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Mise en pratique''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Pour la mise en pratique, nous avons décidé d’appliquer les méthodes sur un dataset de prédiction de maintenance pour l’industrie, nous importons grâce à la librairie panda : &amp;lt;code&amp;gt; dataset = pd.read_csv('ai4i2020.csv') &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette dataset contient 14 colonnes de données, nous pouvons visualiser la proportion de données saines et non-saines par ce code seaborn : &amp;lt;code&amp;gt; sns.factorplot('Machine failure',data=dataset,kind='count') &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on traitera cette dataset pour la préparer sur l’intervention des modèles de machine learning, puis on appliquera ces méthodes.&lt;br /&gt;
&lt;br /&gt;
==Pré-traitement de la dataset==&lt;br /&gt;
&lt;br /&gt;
Avant d’appliquer les algorithme sur notre dataset, il faut la traiter, le traitement sera le même pour tous les algorithmes et suivra cet ordre :&lt;br /&gt;
* Traitement des valeurs manquantes&lt;br /&gt;
* Équilibrage des données&lt;br /&gt;
* Séparations des données en entrainement et test&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous devons regarder si notre base de données contient des valeurs manquante, pour cela nous implantons ce code : &lt;br /&gt;
&lt;br /&gt;
   import missingno as msno&lt;br /&gt;
   msno.matrix(dataset)&lt;br /&gt;
&lt;br /&gt;
Les lignes blanches dans le résultat correspond aux valeurs manquantes, ci-dessous nous voyons que nous avons aucune données manquantes dans la base que nous avons importer : [[Fichier:Miseenpratique.png]]&lt;br /&gt;
&lt;br /&gt;
Dans le cas, où nous avons des valeurs manquante, il y a plusieurs méthodes pour traiter les valeurs manquantes mais nous retenons 2 méthodes :&lt;br /&gt;
* Une méthode qui consiste à supprimer les lignes où des valeurs manquantes sont présentes : &amp;lt;code&amp;gt; data.dropna(inplace=True) &amp;lt;/code&amp;gt;&lt;br /&gt;
L’avantage de cette méthode est de créer un modèle robuste. L’inconvénient majeur est le fait qu’on peut perdre énormément de données, pour des données où les valeurs manquantes sont excessives, mieux vaut appliquer une autre méthode.&lt;br /&gt;
&lt;br /&gt;
* Une méthode qui consiste à remplacer les valeurs manquantes par la moyenne des données de la colonne : &amp;lt;code&amp;gt; data[0]=drop[0].replace(np.NaN,data[0].mean()) &amp;lt;/code&amp;gt; L’avantage de cette méthode permet d’éviter la suppression de lignes, ce qui permet de garder les autres données comparé à l’autre méthode. Cependant cette méthode n’est que applicable sur les données numériques&lt;br /&gt;
&lt;br /&gt;
Nous passons alors sur l'équilibrage des données. Avant d’appliquer la méthode SMOTE, nous devons mettre dans 2 variables, la target (y) et les features (X) :&lt;br /&gt;
&lt;br /&gt;
   X = dataset.drop(['Machine failure','UDI','Product ID','Type','TWF','HDF','PWF','OSF','RNF'],axis=1).values&lt;br /&gt;
   y = dataset['Machine failure']&lt;br /&gt;
&lt;br /&gt;
Notre target sera seulement ‘Machine failure’ et nos features seront : la température de l’air, la température du processus, le couple, et l’usure des outils.&lt;br /&gt;
&lt;br /&gt;
Durant notre projet , nous avons implémenté la technique SMOTE pour traiter les ensembles de données déséquilibrées.&lt;br /&gt;
Le principe de SMOTE est de générer de nouveaux échantillons en combinant les données de la classe minoritaire avec celles de leurs voisins proches. Techniquement, on peut décomposer SMOTE en 5 étapes :&lt;br /&gt;
* 1 - Choix d’un vecteur caractéristique de notre classe minoritaire que nous appellerons vc &lt;br /&gt;
* 2 - Sélection des k-voisins les plus proches (k=5 par défaut) et choix de l’un d’eux au hasard que l’on appellera pv &lt;br /&gt;
* 3 - Calcul de la différence pour chaque valeur caractéristique (feature value) i, vc[i]-pv[i] et multiplication de celle-ci par un nombre aléatoire entre [0,1]&lt;br /&gt;
* 4 - Ajout du résultat précédent à la valeur de la caractéristique i du vecteur vc afin d’obtenir un nouveau point (une nouvelle donnée) dans l’espace des caractéristiques &lt;br /&gt;
* 5 - Répétition de ces opérations pour chaque point de données de la classe minoritaire &lt;br /&gt;
Nous remarquons que cette technique marche après smote (50% données saines, 50% données non-saines)&lt;br /&gt;
&lt;br /&gt;
Code : &lt;br /&gt;
&lt;br /&gt;
   oversample = SMOTE()&lt;br /&gt;
   Xsmote, ysmote = oversample.fit_resample(X,y)&lt;br /&gt;
   Xsmote = pd.DataFrame(Xsmote)&lt;br /&gt;
   ysmote = pd.DataFrame(ysmote)&lt;br /&gt;
   X=Xsmote&lt;br /&gt;
   y=ysmote&lt;br /&gt;
&lt;br /&gt;
On remarque que la technique smote a ajouté 9322 lignes sur notre base, Maintenant que nous avons un équilibre entre les données ‘sains’ et ‘malsains’, nous pouvons voir la répartitions des points sur 2 axes :&lt;br /&gt;
&lt;br /&gt;
(image)&lt;br /&gt;
&lt;br /&gt;
Nous pouvons alors procéder à la séparation de nos données en données d'entraînement et de test&lt;br /&gt;
&lt;br /&gt;
Nous devons séparer en deux nos données pour pouvoir appliquer les algorithmes de machine learning, ainsi : &lt;br /&gt;
Les données d'entraînement serviront de repères pour l’algorithme&lt;br /&gt;
Les données de test seront entraînées par celle d’entrainement pour créer une prédiction&lt;br /&gt;
&lt;br /&gt;
Nous allons utiliser la fonction train_test_split de la librairie sklearn pour séparer nos données : &lt;br /&gt;
&lt;br /&gt;
   X_train, X_test, y_train, y_test = train_test_split(X,y, test_size = 0.2, random_state = 100)&lt;br /&gt;
&lt;br /&gt;
Ici dans les paramètres :&lt;br /&gt;
X  correspond aux features&lt;br /&gt;
y correspond à la target&lt;br /&gt;
test_size correspond au pourcentage de séparation (soit 0.2 = 20% test et 80% d'entraînement)&lt;br /&gt;
random_state permet d’initialiser le choix aléatoire pour avoir la même répartition à chaque exécution&lt;br /&gt;
&lt;br /&gt;
Maintenant nous pouvons appliquer les algorithme à notre modèle&lt;br /&gt;
&lt;br /&gt;
==Application des algorithmes==&lt;br /&gt;
&lt;br /&gt;
En général, nous allons appliquer les algorithme en suivant cet ordre : &lt;br /&gt;
* Importation de la méthode sur la librairie sklearn&lt;br /&gt;
* Entraînement des données&lt;br /&gt;
* Prédiction&lt;br /&gt;
* Méthodes d’évaluations&lt;br /&gt;
&lt;br /&gt;
===Régression linéaire===&lt;br /&gt;
&lt;br /&gt;
Nous allons commencer par le plus simple : la régression linéaire, nous commençons par importer l’algorithme à partir de la librairie sklearn : &amp;lt;code&amp;gt; from sklearn.linear_model import LinearRegression &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis nous appelons l’algorithme avec les paramètres de base, puis nous entraînons notre dataset : &lt;br /&gt;
   #Méthode de régréssion linéaire&lt;br /&gt;
   lr = LinearRegression()&lt;br /&gt;
   #Training&lt;br /&gt;
   lr.fit(X_train,y_train)&lt;br /&gt;
&lt;br /&gt;
Ensuite la prédiction : &lt;br /&gt;
   #Prediction&lt;br /&gt;
   y_pred = lr.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
Et enfin l'évaluation, nous avons vu 2 méthodes pour évaluer notre modèle : &lt;br /&gt;
* Afficher le score de prédiction&lt;br /&gt;
* Afficher la matrice de confusion, une matrice de taille 2x2 qui donne ces informations : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatrixConfusion.png]]&lt;br /&gt;
&lt;br /&gt;
Le score de prédiction (accuracy) est également calculé à partir de cette matrice&lt;br /&gt;
Pour la régression linéaire, nous allons qu’afficher le score de prédiction, car cet algorithme nous donne en retour des valeurs non-binaire, la construction d’une matrice de confusion et impossible.&lt;br /&gt;
&lt;br /&gt;
   #Evaluation&lt;br /&gt;
   print(lr.score(X_test,y_test))&lt;br /&gt;
&lt;br /&gt;
Nous obtenons ainsi un score de 0.48, un score qui est plus élevé sans la méthode SMOTE (0.14), sauf que cette méthode n’est pas la plus optimisée pour cette base de données, car nous avons en target des valeurs binaires. Il vaut mieux appliquer la méthode de régression logistique ou la méthode de Naives-Bayes.&lt;br /&gt;
&lt;br /&gt;
===Régression logistique===&lt;br /&gt;
&lt;br /&gt;
Dans le même modèle que la régression linéaire, nous procédons à l’import de la méthode, l’appel de la méthode, l'entraînement des données et de la prédiction :&lt;br /&gt;
&lt;br /&gt;
   from sklearn import linear_model&lt;br /&gt;
&lt;br /&gt;
   #Modèle régression logistique&lt;br /&gt;
   modele_regLog = linear_model.LogisticRegression() &lt;br /&gt;
   #random_state = 100, solver = 'liblinear', multi_class = 'auto'&lt;br /&gt;
&lt;br /&gt;
   #training&lt;br /&gt;
   modele_regLog.fit(X_train,y_train)&lt;br /&gt;
&lt;br /&gt;
   #prediction&lt;br /&gt;
   y_pred = modele_regLog.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
   #précision du modèle&lt;br /&gt;
   precision = modele_regLog.score(X_test,y_test)&lt;br /&gt;
   print(precision)&lt;br /&gt;
&lt;br /&gt;
Pour la régression logistique, nous allons afficher la matrice de confusion et le score :&lt;br /&gt;
&lt;br /&gt;
   from sklearn.metrics import plot_confusion_matrix&lt;br /&gt;
   plot_confusion_matrix(modele_regLog, X_test, y_test)  &lt;br /&gt;
   plt.show() &lt;br /&gt;
&lt;br /&gt;
(images)&lt;br /&gt;
&lt;br /&gt;
Nous obtenons un score de 0.82, contre 0.97 sans la méthode de SMOTE, ce qui est cohérent car le score obtenu sans SMOTE n’est pas précis car il y avait peu de données où la machine a planté. Avec SMOTE, nous obtenons certes un score moins élevé mais plus précis.&lt;br /&gt;
Grâce à la matrice de confusion nous pouvons voir que : &lt;br /&gt;
* Il y a 2396 fois où l’algorithme a prédit Machine failure = 0 et a eu raison&lt;br /&gt;
* Il y a 2377 fois où l’algorithme a prédit Machine failure = 1 et a eu raison&lt;br /&gt;
* Il y a 546 fois où l’algorithme a prédit Machine failure = 1 et a eu faux&lt;br /&gt;
* Il y a 478 fois où l’algorithme a prédit Machine failure = 0 et a eu faux&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 0px; padding: 20px; font-weight: bold; text-align: center; font-size: 80%; background: #61798F; vertical-align: top; width: 100%;&amp;quot;&amp;gt; '''PARTIE II (S8)''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Développement du projet''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Durant les deux premiers semestres, nous avons découvert et étudié le Machine Learning, que ce soit la théorie de différents algorithmes connus ou l'application à pratique à des datasets que nous pouvons récupérer sur Internet ou bien les créer nous même. La création de notre dataset ayant été fastidieuse et peu concluante (voir résultats précédents), nous avons comme objectif pour ce semestre d'implémenter nos algorithmes (et principalement le réseau de neurones) à des machines dont nous avons accès à l'école.&lt;br /&gt;
Après discussion avec notre tuteur de projet Monsieur Lakhal, nous avons décidé d'utiliser des Robotino plutôt que d'utiliser la chaîne de production présente à l'école car il existe des logiciels simples permettant d'effectuer des simulations de réseaux industriels de Robotinos (Robotino View et Robotino Simulation) dont nous allons récupérer les données en temps réel et les traiter sur Matlab à l'aide de notre algorithme de réseaux de neurones.&lt;br /&gt;
&lt;br /&gt;
=Recherche bibliographique=&lt;br /&gt;
&lt;br /&gt;
* https://www.wikipedia.com&lt;br /&gt;
&lt;br /&gt;
* https://www.jybaudot.fr&lt;br /&gt;
&lt;br /&gt;
* https://datascientest.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.ipgirl.com&lt;br /&gt;
&lt;br /&gt;
* Cours de probabilités et statistiques de l’Université Jules Vernes&lt;br /&gt;
&lt;br /&gt;
* Chaine youtube Machine Learning : https://www.youtube.com/channel/UCmpptkXu8iIFe6kfDK5o7VQ&lt;br /&gt;
&lt;br /&gt;
* Machine Learning with scikit-learn Quick Start Guide écrit par Kevin Jolly&lt;br /&gt;
&lt;br /&gt;
* https://lucidar.me/&lt;br /&gt;
&lt;br /&gt;
* https://archive.ics.uci.edu/ml/datasets.php&lt;br /&gt;
&lt;br /&gt;
* https://www.kaggle.com/datasets&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com/&lt;br /&gt;
&lt;br /&gt;
* Machine Learning algorithms - Second Edition écrit par Giuseppe Bonaccorso&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com&lt;br /&gt;
&lt;br /&gt;
* https://towardsdatascience.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.learndatasci.com/&lt;br /&gt;
&lt;br /&gt;
==Rapports et présentation==&lt;br /&gt;
&lt;br /&gt;
===Librairies===&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1CQZ1s6fNY_6MsmbBa5TP1OzSedqFeaWI?usp=sharing/ Rapport Numpy]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1tdu_B2wRsUiqdnSeskQENdn_wX3pJMeT?usp=sharing/ Rapport Pandas]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1DPS4ZT91SIEhscwST8kfER7u21tKoM3a?usp=sharing/ Rapport Seaborn]&lt;br /&gt;
&lt;br /&gt;
===Rapports===&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/document/d/1yR0vLePV3hI1_HVtTZWwGIwy0Cb-oLOsOTK3Um5KAYE/edit?usp=sharing/ Rapport]&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/presentation/d/1Je_yF0dgc-s9gB7LLsfOg0b05xcwIFJbaqpVytxWv5A/edit?usp=sharing/ Présentation]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1y_NMo9XKJ0WzwE2zmcRblUyuIebwfoN8?usp=sharing/ Régression linéaire]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1bRyrnL1JM870cEcEvfGaS8ItrG16rchy?usp=sharing/ Google Colab]&lt;/div&gt;</summary>
		<author><name>Abrossas</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88024</id>
		<title>IMA3/IMA4 2020/2022 P5</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88024"/>
				<updated>2022-02-09T15:50:07Z</updated>
		
		<summary type="html">&lt;p&gt;Abrossas : /*  PARTIE II (S8)  */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 0px; padding: 20px; font-weight: bold; text-align: center; font-size: 80%; background: #61798F; vertical-align: top; width: 100%;&amp;quot;&amp;gt; '''PARTIE I (S6-S7)''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Introduction et cahier des charges''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce projet est la mise en place d’algorithmes de machine Learning afin de diagnostiquer l’état de machines industrielles. Nous travaillerons sur ce projet durant 2 semestres. &lt;br /&gt;
Durant le premier semestre, nous avions comme objectifs d’acquérir la maîtrise des différentes librairies primordiales pour traiter les données en machine Learning, ainsi que d’étudier et d’utiliser certains algorithmes basiques (régression linéaire, logistique, Bayes) sur des datasets que nous traiterons nous même. &lt;br /&gt;
Pour ce qui est du second semestre, notre objectif était de concrétiser les connaissances acquises durant le premier semestre. Nous avons donc essayé de créer notre propre dataset à l’aide des matériels mis à notre disposition, de la prétraiter et d’y appliquer différents algorithmes de Machine Learning en critiquant les résultats.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning pour la détection de défaut s'inscrit parfaitement dans le contexte scientifique actuel, notamment grâce à l’industrie 4.0.&lt;br /&gt;
En effet, cette nouvelle industrie fait apparaître des systèmes communicants (l’IOT : Internet Of Things) interconnectés les uns entre les autres. Ces différents systèmes peuvent êtres nécessaires les uns, les autres afin de réaliser une tâche complexe telle que l'usinage de pièces. Le système devient dès lors potentiellement extrêmement fragile aux pannes.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning a pour but de pouvoir détecter, et localiser les pannes, voir les futures pannes potentielles afin de pouvoir dans un premier temps prévenir un opérateur. Mais il peut aussi potentiellement permettre au système de continuer de tourner, en attendant un technicien. Le machine Learning peut donc aussi permettre à une chaîne de production de continuer de tourner par l’envoie d’un autre robot par exemple, le temps que la panne soit réparée.&lt;br /&gt;
&lt;br /&gt;
Dans le schéma ci-dessous nous avons un exemple de système de système.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Intro1.png|500px|thumb|center|Schéma d'un système de systèmes]]&lt;br /&gt;
&lt;br /&gt;
Il y a deux cas de figure:&lt;br /&gt;
* Un autre système peut être envoyé pour remplacer le système 4.&lt;br /&gt;
* Les systèmes 1 et 2 peuvent permettre à la chaîne de production de continuer de tourner&lt;br /&gt;
* La chaîne de production est hors service jusqu'à réparation.&lt;br /&gt;
&lt;br /&gt;
==Cahier de charges==&lt;br /&gt;
&lt;br /&gt;
'''Ressources disponibles :'''&lt;br /&gt;
&lt;br /&gt;
* Livres sur le machine learning &lt;br /&gt;
* Bases de données (afin d'appliquer divers algorithmes de machine learning) que nous prendrons sur ces sites : [https://www.kaggle.com/datasets] et [https://archive.ics.uci.edu/ml/datasets.php]&lt;br /&gt;
* Librairies Python (Scikit-learn, Pandas, Numpy, Seaborn, Matplotlib)&lt;br /&gt;
* Google Colab&lt;br /&gt;
* Matlab (version étudiante)&lt;br /&gt;
&lt;br /&gt;
'''Objectifs poursuivis :'''&lt;br /&gt;
&lt;br /&gt;
* Détecter les dysfonctionnements de systèmes mécatroniques (par exemple les robots Khepera, Robotino…), grâce au machine learning.&lt;br /&gt;
* Apprendre à implémenter différentes méthodes machine learning .&lt;br /&gt;
&lt;br /&gt;
'''Profil du public cible :'''&lt;br /&gt;
* Secteur mécatronique&lt;br /&gt;
* Entreprises disposant d'ingénieurs pour maintenir le système informatique opérationnel&lt;br /&gt;
* Entreprises utilisant des machines dans le secteur public.&lt;br /&gt;
&lt;br /&gt;
'''Analyse des besoins :'''&lt;br /&gt;
* L’industrie a de plus en plus besoin du machine learning pour détecter les erreurs des systèmes. En effet, cette technologie devient indispensable pour les industriels, notamment afin d'accroître la productivité et l’efficacité des systèmes industriels.&lt;br /&gt;
* Le programme peut ne pas être aussi rapide et optimisé en espace mémoire que d'autres programmes, nous visons l’efficacité de notre algorithme plutôt que la rapidité.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Librairies''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
En Machine Learning, il est très important, voire primordial, de savoir manipuler les différentes librairies mises à notre disposition afin de visualiser, traiter nos différentes dataset ou même appliquer les différents algorithmes de machine Learning.&lt;br /&gt;
Durant les premières semaines de notre projet, nous avons donc appris à utiliser ces différentes librairies nécessaires pour le machine Learning, telles que Numpy, Seaborn, Panda, Matplotlib, Scikit-learn... Nous allons dans un premier temps nous intéresser à l'importation des différentes bibliothèques puis résumer les commandes importantes de ces différentes librairies.&lt;br /&gt;
&lt;br /&gt;
Ces différentes librairies ne sont pas incluses de base dans Python, il est donc nécessaire de les ajouter à Python puis à notre programme.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc choisi d'utiliser google colab car ces librairies y sont déjà installées (et aussi pratique pour travailler à plusieurs sur un même code).&lt;br /&gt;
Puis nous devons importer ces bibliothèques au début de notre programme.&lt;br /&gt;
&lt;br /&gt;
Attention : Plusieurs bibliothèques peuvent avoir la même commande mais avec des significations différentes, comme par exemple la commande randint du module numpy et celle du module random et cela peut conduire à des erreurs. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de pallier à ces problèmes nous apporterons nos librairie au début de nos programmes comme suit :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:librairies1.png]]&lt;br /&gt;
&lt;br /&gt;
Ici le np permet de dire que lorsque nous utilisons np.array alors nous utilisons la commande array () contenu dans la bibliothèque Numpy.&lt;br /&gt;
&lt;br /&gt;
Ceci nous permettra d’utiliser en simultané différentes librairies, toutes les bibliothèques seront importées selon ce schéma.&lt;br /&gt;
Nous allons par la suite, nous intéresser à différentes commandes incluses dans ces librairies.&lt;br /&gt;
&lt;br /&gt;
==Numpy==&lt;br /&gt;
&lt;br /&gt;
Numpy est une bibliothèque dédiée aux calculs mathématiques et à la gestion des listes (telles que des matrices).&lt;br /&gt;
Matplotlib, quant à lui, est dédié aux affichages graphiques de données.&lt;br /&gt;
Nous allons dans cette partie nous intéresser aux commandes principales de ces deux bibliothèques de python.&lt;br /&gt;
&lt;br /&gt;
Sous numpy, les tableaux sont des types array, ils définissent l'équivalent des tableaux statiques en langage C. La taille d’un tableau numpy ne peut donc pas être changée après leur création. &lt;br /&gt;
&lt;br /&gt;
Néanmoins grâce a Numpy nous pouvons simplement effectuer des tâches sur les tableaux comme en extraire un sous tableaux, et d’effectuer simplement les produits entre matrice, vecteur.&lt;br /&gt;
&lt;br /&gt;
Dans notre projet, nous utiliserons plus courament les fonctions : &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.shape&amp;lt;/FONT&amp;gt; permet d’obtenir la taille de la matrice sous forme d’un tuple, suffit de choisir le bon numéro&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.zeros&amp;lt;/FONT&amp;gt; permet de créer une ligne de x zéro(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.ones&amp;lt;/FONT&amp;gt; permet de créer une ligne de x un(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.vstack&amp;lt;/FONT&amp;gt; permet de rajouter des lignes dans une matrice déjà créer en paramètre&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.transpose&amp;lt;/FONT&amp;gt; permet de transposer une matrice en paramètre&lt;br /&gt;
&lt;br /&gt;
==Seaborn==&lt;br /&gt;
&lt;br /&gt;
Seaborn est une bibliothèque de visualisation de données Python basée sur matplotlib. Il fournit une interface de haut niveau pour dessiner des graphiques statistiques attrayants et informatifs.&lt;br /&gt;
&lt;br /&gt;
'''Différences entre Matplotlib et Seaborn'''&lt;br /&gt;
&lt;br /&gt;
Les défauts de Matplotlib qui ne parlent généralement pas aux utilisateurs sont les couleurs, les marques de tiques sur les axes supérieur et droit, le style,...&lt;br /&gt;
Les exemples ci-dessus rendent également une autre frustration des utilisateurs plus apparente: le fait que travailler avec DataFrames ne va pas aussi bien avec Matplotlib, ce qui peut être ennuyeux si vous faites une analyse exploratoire avec Pandas. Et c’est exactement ce que Seaborn adresse : les fonctions de traçage fonctionnent sur dataframes et tableaux qui contiennent tout un ensemble de données.&lt;br /&gt;
[[Fichier:seaborn1.png|300px|thumb|right|Résultat du code python ci gauche]]&lt;br /&gt;
&lt;br /&gt;
   # Import necessary libraries&lt;br /&gt;
   import seaborn as sns&lt;br /&gt;
   import matplotlib.pyplot as plt&lt;br /&gt;
   &lt;br /&gt;
   # Load iris data&lt;br /&gt;
   iris = sns.load_dataset(&amp;quot;iris&amp;quot;) #DATASET ALREADY EXISTING&lt;br /&gt;
   &lt;br /&gt;
   # Construct iris plot&lt;br /&gt;
   sns.swarmplot(x=&amp;quot;species&amp;quot;, y=&amp;quot;petal_length&amp;quot;, data=iris)&lt;br /&gt;
   &lt;br /&gt;
   # Show plot&lt;br /&gt;
   plt.show()&lt;br /&gt;
&lt;br /&gt;
==Pandas==&lt;br /&gt;
&lt;br /&gt;
Pandas est une API d'analyse de données orientée colonnes. C'est un excellent outil pour manipuler et analyser des données d'entrée. Beaucoup de frameworks d'apprentissage automatique acceptent les structures de données Pandas en entrée.&lt;br /&gt;
&lt;br /&gt;
Comme évoqué précédemment, Pandas travaille avec des matrices colonnes communément appelées ‘Series’ mais aussi et surtout avec des tableaux de données appelés ‘DataFrames’.&lt;br /&gt;
Une Series est tout simplement une colonne et une DataFrame est un tableau à plusieurs dimensions constitué de Series.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Panda.JPG]]&lt;br /&gt;
&lt;br /&gt;
A l'aide de Pandas, on peut ainsi créer, importer, lire et manipuler des bases de données facilement.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Théories des algorithmes étudiés''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Il y a différents types d’algorithmes en machine learning, pour notre sujet qui consiste à classer des machines en défectueuse ou fonctionnelles (1 ou 0), nous aurons surtout besoin d’algorithmes de classification binaire. De manière générale, la conception de la plupart des algorithmes fonctionnent de cette manière : &lt;br /&gt;
&lt;br /&gt;
* Élaborer un modèle &lt;br /&gt;
* Établir une fonction coût pour celui-ci correspondant à l’erreur entre le modèle et les données réelles&lt;br /&gt;
* Trouver un algorithme de minimisation de cette fonction coût&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression linéaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression1.png|200px|thumb|right|Exemple de régression linéaire]]&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est un algorithme de prédiction et non un algorithme de classification, nous aurons surtout besoin de ce deuxième type d’algorithme pour notre projet mais nous tenons à présenter cet algorithme qui est le plus basique en machine learning et un bon début pour une formation pédagogique.&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est une méthode de modélisation qui cherche à établir une relation linéaire entre une ou des &amp;quot;features&amp;quot; (variables explicatives) et une &amp;quot;target&amp;quot; (variable expliquée qu'on cherche à prévoir à partir des variables explicatives). En machine learning, la régression linéaire est un modèle d'apprentissage supervisé, c'est-à-dire qu'on apprend à l'algorithme de prédiction à partir d'exemples dont on dispose dans une dataset. Nous nous intéresserons à la régression affine qui est la plus simple pour débuter.&lt;br /&gt;
&lt;br /&gt;
===Modèle et estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
La régression affine consiste donc à trouver un modèle de type&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt;y=ax+b&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
avec x une &amp;quot;feature&amp;quot;, y la target et avec a et b des paramètres qu'il nous faudra déterminer. Le but est donc de trouver les paramètres a et b tels que la distance entre chaque point du nuage et la droite du modèle soit la plus petite possible.&lt;br /&gt;
Mathématiquement, il suffit de résoudre cette formule:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression2.png|200px|thumb|right|Méthode des moindres carrés illustrée]]&lt;br /&gt;
[[Fichier:regression3.png]]&lt;br /&gt;
&lt;br /&gt;
On utilise donc la méthode des moindres carrés pour mesurer l'erreur entre le modèle de prédiction et les données et ainsi fabriquer notre fonction coût :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression4.png]]&lt;br /&gt;
&lt;br /&gt;
avec m le nombre de points du nuage.&lt;br /&gt;
&lt;br /&gt;
L'objectif de l'algorithme est donc de trouver les paramètres optimaux qui minimisent cette fonction J.&lt;br /&gt;
En machine learning, une des méthodes les plus populaires pour faire ceci est la descente de gradient, car c'est une méthode adaptée quand on fait du traitement de grosses dataset (&amp;quot;faible&amp;quot; temps de calcul). En effet, la fonction coût J est une parabole admettant un unique minimum dépendant des paramètres a et b. La descente de gradient consiste à chercher le point de celle-ci où la dérivée est nulle (donc le minimum)&lt;br /&gt;
&lt;br /&gt;
===Méthode de la descente du gradient===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression6.png|200px|thumb|right|Méthode gradient]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression7.png|200px|thumb|right|Généralisation gradient fct parabolique]]&lt;br /&gt;
&lt;br /&gt;
Soit une fonction parabolique ne dépendant que de x. On cherche à trouver le minimum de cette fonction en utilisant la méthode de la descente du gradient&lt;br /&gt;
Pour cela on choisit un point aléatoirement &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;et on va descendre à partir de celui-ci jusqu'à atteindre un minimum en utilisant&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression5.png]]&lt;br /&gt;
&lt;br /&gt;
avec un paramètre  qui influencera la taille du pas de la descente.&lt;br /&gt;
&lt;br /&gt;
Il faut faire attention à ne pas prendre un pas trop grand, ni trop petit, pour éviter de &amp;quot;tourner&amp;quot; autour du minimum ou de prendre trop de temps pour l'atteindre.&lt;br /&gt;
Note : On peut généraliser cela pour une fonction parabolique à n paramètres qui aurait donc une forme de bol.&lt;br /&gt;
&lt;br /&gt;
===Application sur notre fonction coût===&lt;br /&gt;
&lt;br /&gt;
Notre fonction coût dépend des 2 paramètres a et b :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression8.png]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression9.png]]&lt;br /&gt;
&lt;br /&gt;
On choisit &amp;lt;math&amp;gt;a_0&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; aléatoirement et on applique ceci pour un pas :&lt;br /&gt;
&lt;br /&gt;
Avec &lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression10.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d'un certain nombre d'itérations on trouve le couple &amp;lt;math&amp;gt;(a,b)&amp;lt;/math&amp;gt; qui minimise notre fonction coût.&lt;br /&gt;
&lt;br /&gt;
Note : Nous avons démontré la théorie de la régression linéaire affine mais on pourrait généraliser celle-ci pour un modèle polynomiale d’ordre n, la courbe de prédiction serait donc parabolique et il faudrait trouver le tuple &amp;lt;math&amp;gt;(a_1,a_2,...,a_n)&amp;lt;/math&amp;gt; qui minimise la fonction coût.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression logistique binaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo1.png|200px|thumb|right|Modèle régression logistique]]&lt;br /&gt;
&lt;br /&gt;
La régression logistique binaire est un algorithme de classification, contrairement à la régression linéaire qui est un algorithme de prédiction. De la même façon que la régression linéaire,  il s'agit de modéliser au mieux un modèle mathématique simple à des observations réelles nombreuses. Cette méthode se base sur de l’analyse mathématiques et statistique. Il faut donc associer à des “features” &amp;lt;math&amp;gt;(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; une variable Y valant 1 ou 0 (d’où le terme classification binaire).&lt;br /&gt;
&lt;br /&gt;
L’objectif de l’algorithme est donc de trouver la fonction F dépendant d’une loi de probabilité telle que :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo2.png]]&lt;br /&gt;
&lt;br /&gt;
avec S un certain seuil (fixé la plupart du temps à 0,5).&lt;br /&gt;
&lt;br /&gt;
===Modèle===&lt;br /&gt;
&lt;br /&gt;
Comme cette méthode repose principalement sur des statistiques, il est important d’adopter une notation explicite lors de l’explication théorique :&lt;br /&gt;
&lt;br /&gt;
* On notera Y la variable à prédire (qui vaudra 0 ou 1) et &amp;lt;math&amp;gt;X=(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; les variables permettant de prédire Y&lt;br /&gt;
* On travaillera dans un univers  de N échantillons (taille de la dataset)&lt;br /&gt;
* On notera &amp;lt;math&amp;gt;P(Y=1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;P(Y=0)&amp;lt;/math&amp;gt; les probabilités que Y valent respectivement 1 ou 0 &amp;lt;math&amp;gt;p(1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0)&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;p(X|1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(X|0)&amp;lt;/math&amp;gt; sont les distributions conditionnelles des caractéristiques X sachant la valeur prise par Y&lt;br /&gt;
* &amp;lt;math&amp;gt;p(1|X)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0|X)&amp;lt;/math&amp;gt; sont donc les probabilités d’obtenir la valeur de Y (1 ou 0) sachant les valeurs de X&lt;br /&gt;
&lt;br /&gt;
La régression logistique utilise l’hypothèse fondamentale (mesure de l’évidence) :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo3.png]]&lt;br /&gt;
&lt;br /&gt;
On en déduit donc (comme &amp;lt;math&amp;gt;p(0|X)=1-p(1|X))&amp;lt;/math&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo4.png]]&lt;br /&gt;
&lt;br /&gt;
Avec &amp;lt;math&amp;gt;(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; des variables à déterminer.&lt;br /&gt;
&lt;br /&gt;
''Note :'' ce modèle est appelé modèle LOGIT.&lt;br /&gt;
&lt;br /&gt;
===Estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
Contrairement à la régression linéaire affine, on ne peut pas utiliser la méthode des moindres carrés, on utilise alors la méthode de maximisation de la vraisemblance.&lt;br /&gt;
“La vraisemblance mesure une adéquation entre la distribution observée sur un échantillon aléatoire et une loi de probabilité supposée décrire une réalité sur la population dont l'échantillon est issu.” (source : [www.jybaudot.fr])&lt;br /&gt;
&lt;br /&gt;
Le calcul de la vraisemblance L dans un univers  de N échantillons est le suivant :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo5.png]]&lt;br /&gt;
&lt;br /&gt;
Plus la vraisemblance est élevée, alors plus la loi de probabilité est proche de la réalité. Le but est donc de maximiser cette valeur et de trouver les valeurs optimales de &amp;lt;math&amp;gt;A =(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; qui influent directement sur la loi de probabilité établie dans la partie modèle.&lt;br /&gt;
&lt;br /&gt;
===Algorithme d'optimisation===&lt;br /&gt;
&lt;br /&gt;
Afin de trouver la valeur optimale du vecteur A, nous utiliserons encore une fois la méthode de descente du gradient adaptée à notre cas.&lt;br /&gt;
&lt;br /&gt;
Celle-ci utilise la relation suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo6.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d’un certain nombre d’itérations, on trouvera la valeur optimale de A afin de maximiser la vraisemblance.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Mise en pratique''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Pour la mise en pratique, nous avons décidé d’appliquer les méthodes sur un dataset de prédiction de maintenance pour l’industrie, nous importons grâce à la librairie panda : &amp;lt;code&amp;gt; dataset = pd.read_csv('ai4i2020.csv') &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette dataset contient 14 colonnes de données, nous pouvons visualiser la proportion de données saines et non-saines par ce code seaborn : &amp;lt;code&amp;gt; sns.factorplot('Machine failure',data=dataset,kind='count') &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on traitera cette dataset pour la préparer sur l’intervention des modèles de machine learning, puis on appliquera ces méthodes.&lt;br /&gt;
&lt;br /&gt;
==Pré-traitement de la dataset==&lt;br /&gt;
&lt;br /&gt;
Avant d’appliquer les algorithme sur notre dataset, il faut la traiter, le traitement sera le même pour tous les algorithmes et suivra cet ordre :&lt;br /&gt;
* Traitement des valeurs manquantes&lt;br /&gt;
* Équilibrage des données&lt;br /&gt;
* Séparations des données en entrainement et test&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous devons regarder si notre base de données contient des valeurs manquante, pour cela nous implantons ce code : &lt;br /&gt;
&lt;br /&gt;
   import missingno as msno&lt;br /&gt;
   msno.matrix(dataset)&lt;br /&gt;
&lt;br /&gt;
Les lignes blanches dans le résultat correspond aux valeurs manquantes, ci-dessous nous voyons que nous avons aucune données manquantes dans la base que nous avons importer : [[Fichier:Miseenpratique.png]]&lt;br /&gt;
&lt;br /&gt;
Dans le cas, où nous avons des valeurs manquante, il y a plusieurs méthodes pour traiter les valeurs manquantes mais nous retenons 2 méthodes :&lt;br /&gt;
* Une méthode qui consiste à supprimer les lignes où des valeurs manquantes sont présentes : &amp;lt;code&amp;gt; data.dropna(inplace=True) &amp;lt;/code&amp;gt;&lt;br /&gt;
L’avantage de cette méthode est de créer un modèle robuste. L’inconvénient majeur est le fait qu’on peut perdre énormément de données, pour des données où les valeurs manquantes sont excessives, mieux vaut appliquer une autre méthode.&lt;br /&gt;
&lt;br /&gt;
* Une méthode qui consiste à remplacer les valeurs manquantes par la moyenne des données de la colonne : &amp;lt;code&amp;gt; data[0]=drop[0].replace(np.NaN,data[0].mean()) &amp;lt;/code&amp;gt; L’avantage de cette méthode permet d’éviter la suppression de lignes, ce qui permet de garder les autres données comparé à l’autre méthode. Cependant cette méthode n’est que applicable sur les données numériques&lt;br /&gt;
&lt;br /&gt;
Nous passons alors sur l'équilibrage des données. Avant d’appliquer la méthode SMOTE, nous devons mettre dans 2 variables, la target (y) et les features (X) :&lt;br /&gt;
&lt;br /&gt;
   X = dataset.drop(['Machine failure','UDI','Product ID','Type','TWF','HDF','PWF','OSF','RNF'],axis=1).values&lt;br /&gt;
   y = dataset['Machine failure']&lt;br /&gt;
&lt;br /&gt;
Notre target sera seulement ‘Machine failure’ et nos features seront : la température de l’air, la température du processus, le couple, et l’usure des outils.&lt;br /&gt;
&lt;br /&gt;
Durant notre projet , nous avons implémenté la technique SMOTE pour traiter les ensembles de données déséquilibrées.&lt;br /&gt;
Le principe de SMOTE est de générer de nouveaux échantillons en combinant les données de la classe minoritaire avec celles de leurs voisins proches. Techniquement, on peut décomposer SMOTE en 5 étapes :&lt;br /&gt;
* 1 - Choix d’un vecteur caractéristique de notre classe minoritaire que nous appellerons vc &lt;br /&gt;
* 2 - Sélection des k-voisins les plus proches (k=5 par défaut) et choix de l’un d’eux au hasard que l’on appellera pv &lt;br /&gt;
* 3 - Calcul de la différence pour chaque valeur caractéristique (feature value) i, vc[i]-pv[i] et multiplication de celle-ci par un nombre aléatoire entre [0,1]&lt;br /&gt;
* 4 - Ajout du résultat précédent à la valeur de la caractéristique i du vecteur vc afin d’obtenir un nouveau point (une nouvelle donnée) dans l’espace des caractéristiques &lt;br /&gt;
* 5 - Répétition de ces opérations pour chaque point de données de la classe minoritaire &lt;br /&gt;
Nous remarquons que cette technique marche après smote (50% données saines, 50% données non-saines)&lt;br /&gt;
&lt;br /&gt;
Code : &lt;br /&gt;
&lt;br /&gt;
   oversample = SMOTE()&lt;br /&gt;
   Xsmote, ysmote = oversample.fit_resample(X,y)&lt;br /&gt;
   Xsmote = pd.DataFrame(Xsmote)&lt;br /&gt;
   ysmote = pd.DataFrame(ysmote)&lt;br /&gt;
   X=Xsmote&lt;br /&gt;
   y=ysmote&lt;br /&gt;
&lt;br /&gt;
On remarque que la technique smote a ajouté 9322 lignes sur notre base, Maintenant que nous avons un équilibre entre les données ‘sains’ et ‘malsains’, nous pouvons voir la répartitions des points sur 2 axes :&lt;br /&gt;
&lt;br /&gt;
(image)&lt;br /&gt;
&lt;br /&gt;
Nous pouvons alors procéder à la séparation de nos données en données d'entraînement et de test&lt;br /&gt;
&lt;br /&gt;
Nous devons séparer en deux nos données pour pouvoir appliquer les algorithmes de machine learning, ainsi : &lt;br /&gt;
Les données d'entraînement serviront de repères pour l’algorithme&lt;br /&gt;
Les données de test seront entraînées par celle d’entrainement pour créer une prédiction&lt;br /&gt;
&lt;br /&gt;
Nous allons utiliser la fonction train_test_split de la librairie sklearn pour séparer nos données : &lt;br /&gt;
&lt;br /&gt;
   X_train, X_test, y_train, y_test = train_test_split(X,y, test_size = 0.2, random_state = 100)&lt;br /&gt;
&lt;br /&gt;
Ici dans les paramètres :&lt;br /&gt;
X  correspond aux features&lt;br /&gt;
y correspond à la target&lt;br /&gt;
test_size correspond au pourcentage de séparation (soit 0.2 = 20% test et 80% d'entraînement)&lt;br /&gt;
random_state permet d’initialiser le choix aléatoire pour avoir la même répartition à chaque exécution&lt;br /&gt;
&lt;br /&gt;
Maintenant nous pouvons appliquer les algorithme à notre modèle&lt;br /&gt;
&lt;br /&gt;
==Application des algorithmes==&lt;br /&gt;
&lt;br /&gt;
En général, nous allons appliquer les algorithme en suivant cet ordre : &lt;br /&gt;
* Importation de la méthode sur la librairie sklearn&lt;br /&gt;
* Entraînement des données&lt;br /&gt;
* Prédiction&lt;br /&gt;
* Méthodes d’évaluations&lt;br /&gt;
&lt;br /&gt;
===Régression linéaire===&lt;br /&gt;
&lt;br /&gt;
Nous allons commencer par le plus simple : la régression linéaire, nous commençons par importer l’algorithme à partir de la librairie sklearn : &amp;lt;code&amp;gt; from sklearn.linear_model import LinearRegression &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis nous appelons l’algorithme avec les paramètres de base, puis nous entraînons notre dataset : &lt;br /&gt;
   #Méthode de régréssion linéaire&lt;br /&gt;
   lr = LinearRegression()&lt;br /&gt;
   #Training&lt;br /&gt;
   lr.fit(X_train,y_train)&lt;br /&gt;
&lt;br /&gt;
Ensuite la prédiction : &lt;br /&gt;
   #Prediction&lt;br /&gt;
   y_pred = lr.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
Et enfin l'évaluation, nous avons vu 2 méthodes pour évaluer notre modèle : &lt;br /&gt;
* Afficher le score de prédiction&lt;br /&gt;
* Afficher la matrice de confusion, une matrice de taille 2x2 qui donne ces informations : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatrixConfusion.png]]&lt;br /&gt;
&lt;br /&gt;
Le score de prédiction (accuracy) est également calculé à partir de cette matrice&lt;br /&gt;
Pour la régression linéaire, nous allons qu’afficher le score de prédiction, car cet algorithme nous donne en retour des valeurs non-binaire, la construction d’une matrice de confusion et impossible.&lt;br /&gt;
&lt;br /&gt;
   #Evaluation&lt;br /&gt;
   print(lr.score(X_test,y_test))&lt;br /&gt;
&lt;br /&gt;
Nous obtenons ainsi un score de 0.48, un score qui est plus élevé sans la méthode SMOTE (0.14), sauf que cette méthode n’est pas la plus optimisée pour cette base de données, car nous avons en target des valeurs binaires. Il vaut mieux appliquer la méthode de régression logistique ou la méthode de Naives-Bayes.&lt;br /&gt;
&lt;br /&gt;
===Régression logistique===&lt;br /&gt;
&lt;br /&gt;
Dans le même modèle que la régression linéaire, nous procédons à l’import de la méthode, l’appel de la méthode, l'entraînement des données et de la prédiction :&lt;br /&gt;
&lt;br /&gt;
   from sklearn import linear_model&lt;br /&gt;
&lt;br /&gt;
   #Modèle régression logistique&lt;br /&gt;
   modele_regLog = linear_model.LogisticRegression() &lt;br /&gt;
   #random_state = 100, solver = 'liblinear', multi_class = 'auto'&lt;br /&gt;
&lt;br /&gt;
   #training&lt;br /&gt;
   modele_regLog.fit(X_train,y_train)&lt;br /&gt;
&lt;br /&gt;
   #prediction&lt;br /&gt;
   y_pred = modele_regLog.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
   #précision du modèle&lt;br /&gt;
   precision = modele_regLog.score(X_test,y_test)&lt;br /&gt;
   print(precision)&lt;br /&gt;
&lt;br /&gt;
Pour la régression logistique, nous allons afficher la matrice de confusion et le score :&lt;br /&gt;
&lt;br /&gt;
   from sklearn.metrics import plot_confusion_matrix&lt;br /&gt;
   plot_confusion_matrix(modele_regLog, X_test, y_test)  &lt;br /&gt;
   plt.show() &lt;br /&gt;
&lt;br /&gt;
(images)&lt;br /&gt;
&lt;br /&gt;
Nous obtenons un score de 0.82, contre 0.97 sans la méthode de SMOTE, ce qui est cohérent car le score obtenu sans SMOTE n’est pas précis car il y avait peu de données où la machine a planté. Avec SMOTE, nous obtenons certes un score moins élevé mais plus précis.&lt;br /&gt;
Grâce à la matrice de confusion nous pouvons voir que : &lt;br /&gt;
* Il y a 2396 fois où l’algorithme a prédit Machine failure = 0 et a eu raison&lt;br /&gt;
* Il y a 2377 fois où l’algorithme a prédit Machine failure = 1 et a eu raison&lt;br /&gt;
* Il y a 546 fois où l’algorithme a prédit Machine failure = 1 et a eu faux&lt;br /&gt;
* Il y a 478 fois où l’algorithme a prédit Machine failure = 0 et a eu faux&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 0px; padding: 20px; font-weight: bold; text-align: center; font-size: 80%; background: #61798F; vertical-align: top; width: 100%;&amp;quot;&amp;gt; '''PARTIE II (S8)''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Développement du projet''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
=Recherche bibliographique=&lt;br /&gt;
&lt;br /&gt;
* https://www.wikipedia.com&lt;br /&gt;
&lt;br /&gt;
* https://www.jybaudot.fr&lt;br /&gt;
&lt;br /&gt;
* https://datascientest.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.ipgirl.com&lt;br /&gt;
&lt;br /&gt;
* Cours de probabilités et statistiques de l’Université Jules Vernes&lt;br /&gt;
&lt;br /&gt;
* Chaine youtube Machine Learning : https://www.youtube.com/channel/UCmpptkXu8iIFe6kfDK5o7VQ&lt;br /&gt;
&lt;br /&gt;
* Machine Learning with scikit-learn Quick Start Guide écrit par Kevin Jolly&lt;br /&gt;
&lt;br /&gt;
* https://lucidar.me/&lt;br /&gt;
&lt;br /&gt;
* https://archive.ics.uci.edu/ml/datasets.php&lt;br /&gt;
&lt;br /&gt;
* https://www.kaggle.com/datasets&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com/&lt;br /&gt;
&lt;br /&gt;
* Machine Learning algorithms - Second Edition écrit par Giuseppe Bonaccorso&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com&lt;br /&gt;
&lt;br /&gt;
* https://towardsdatascience.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.learndatasci.com/&lt;br /&gt;
&lt;br /&gt;
==Rapports et présentation==&lt;br /&gt;
&lt;br /&gt;
===Librairies===&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1CQZ1s6fNY_6MsmbBa5TP1OzSedqFeaWI?usp=sharing/ Rapport Numpy]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1tdu_B2wRsUiqdnSeskQENdn_wX3pJMeT?usp=sharing/ Rapport Pandas]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1DPS4ZT91SIEhscwST8kfER7u21tKoM3a?usp=sharing/ Rapport Seaborn]&lt;br /&gt;
&lt;br /&gt;
===Rapports===&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/document/d/1yR0vLePV3hI1_HVtTZWwGIwy0Cb-oLOsOTK3Um5KAYE/edit?usp=sharing/ Rapport]&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/presentation/d/1Je_yF0dgc-s9gB7LLsfOg0b05xcwIFJbaqpVytxWv5A/edit?usp=sharing/ Présentation]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1y_NMo9XKJ0WzwE2zmcRblUyuIebwfoN8?usp=sharing/ Régression linéaire]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1bRyrnL1JM870cEcEvfGaS8ItrG16rchy?usp=sharing/ Google Colab]&lt;/div&gt;</summary>
		<author><name>Abrossas</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88023</id>
		<title>IMA3/IMA4 2020/2022 P5</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88023"/>
				<updated>2022-02-09T15:49:20Z</updated>
		
		<summary type="html">&lt;p&gt;Abrossas : /* Recherche bibliographique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 0px; padding: 20px; font-weight: bold; text-align: center; font-size: 80%; background: #61798F; vertical-align: top; width: 100%;&amp;quot;&amp;gt; '''PARTIE I (S6-S7)''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Introduction et cahier des charges''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce projet est la mise en place d’algorithmes de machine Learning afin de diagnostiquer l’état de machines industrielles. Nous travaillerons sur ce projet durant 2 semestres. &lt;br /&gt;
Durant le premier semestre, nous avions comme objectifs d’acquérir la maîtrise des différentes librairies primordiales pour traiter les données en machine Learning, ainsi que d’étudier et d’utiliser certains algorithmes basiques (régression linéaire, logistique, Bayes) sur des datasets que nous traiterons nous même. &lt;br /&gt;
Pour ce qui est du second semestre, notre objectif était de concrétiser les connaissances acquises durant le premier semestre. Nous avons donc essayé de créer notre propre dataset à l’aide des matériels mis à notre disposition, de la prétraiter et d’y appliquer différents algorithmes de Machine Learning en critiquant les résultats.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning pour la détection de défaut s'inscrit parfaitement dans le contexte scientifique actuel, notamment grâce à l’industrie 4.0.&lt;br /&gt;
En effet, cette nouvelle industrie fait apparaître des systèmes communicants (l’IOT : Internet Of Things) interconnectés les uns entre les autres. Ces différents systèmes peuvent êtres nécessaires les uns, les autres afin de réaliser une tâche complexe telle que l'usinage de pièces. Le système devient dès lors potentiellement extrêmement fragile aux pannes.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning a pour but de pouvoir détecter, et localiser les pannes, voir les futures pannes potentielles afin de pouvoir dans un premier temps prévenir un opérateur. Mais il peut aussi potentiellement permettre au système de continuer de tourner, en attendant un technicien. Le machine Learning peut donc aussi permettre à une chaîne de production de continuer de tourner par l’envoie d’un autre robot par exemple, le temps que la panne soit réparée.&lt;br /&gt;
&lt;br /&gt;
Dans le schéma ci-dessous nous avons un exemple de système de système.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Intro1.png|500px|thumb|center|Schéma d'un système de systèmes]]&lt;br /&gt;
&lt;br /&gt;
Il y a deux cas de figure:&lt;br /&gt;
* Un autre système peut être envoyé pour remplacer le système 4.&lt;br /&gt;
* Les systèmes 1 et 2 peuvent permettre à la chaîne de production de continuer de tourner&lt;br /&gt;
* La chaîne de production est hors service jusqu'à réparation.&lt;br /&gt;
&lt;br /&gt;
==Cahier de charges==&lt;br /&gt;
&lt;br /&gt;
'''Ressources disponibles :'''&lt;br /&gt;
&lt;br /&gt;
* Livres sur le machine learning &lt;br /&gt;
* Bases de données (afin d'appliquer divers algorithmes de machine learning) que nous prendrons sur ces sites : [https://www.kaggle.com/datasets] et [https://archive.ics.uci.edu/ml/datasets.php]&lt;br /&gt;
* Librairies Python (Scikit-learn, Pandas, Numpy, Seaborn, Matplotlib)&lt;br /&gt;
* Google Colab&lt;br /&gt;
* Matlab (version étudiante)&lt;br /&gt;
&lt;br /&gt;
'''Objectifs poursuivis :'''&lt;br /&gt;
&lt;br /&gt;
* Détecter les dysfonctionnements de systèmes mécatroniques (par exemple les robots Khepera, Robotino…), grâce au machine learning.&lt;br /&gt;
* Apprendre à implémenter différentes méthodes machine learning .&lt;br /&gt;
&lt;br /&gt;
'''Profil du public cible :'''&lt;br /&gt;
* Secteur mécatronique&lt;br /&gt;
* Entreprises disposant d'ingénieurs pour maintenir le système informatique opérationnel&lt;br /&gt;
* Entreprises utilisant des machines dans le secteur public.&lt;br /&gt;
&lt;br /&gt;
'''Analyse des besoins :'''&lt;br /&gt;
* L’industrie a de plus en plus besoin du machine learning pour détecter les erreurs des systèmes. En effet, cette technologie devient indispensable pour les industriels, notamment afin d'accroître la productivité et l’efficacité des systèmes industriels.&lt;br /&gt;
* Le programme peut ne pas être aussi rapide et optimisé en espace mémoire que d'autres programmes, nous visons l’efficacité de notre algorithme plutôt que la rapidité.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Librairies''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
En Machine Learning, il est très important, voire primordial, de savoir manipuler les différentes librairies mises à notre disposition afin de visualiser, traiter nos différentes dataset ou même appliquer les différents algorithmes de machine Learning.&lt;br /&gt;
Durant les premières semaines de notre projet, nous avons donc appris à utiliser ces différentes librairies nécessaires pour le machine Learning, telles que Numpy, Seaborn, Panda, Matplotlib, Scikit-learn... Nous allons dans un premier temps nous intéresser à l'importation des différentes bibliothèques puis résumer les commandes importantes de ces différentes librairies.&lt;br /&gt;
&lt;br /&gt;
Ces différentes librairies ne sont pas incluses de base dans Python, il est donc nécessaire de les ajouter à Python puis à notre programme.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc choisi d'utiliser google colab car ces librairies y sont déjà installées (et aussi pratique pour travailler à plusieurs sur un même code).&lt;br /&gt;
Puis nous devons importer ces bibliothèques au début de notre programme.&lt;br /&gt;
&lt;br /&gt;
Attention : Plusieurs bibliothèques peuvent avoir la même commande mais avec des significations différentes, comme par exemple la commande randint du module numpy et celle du module random et cela peut conduire à des erreurs. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de pallier à ces problèmes nous apporterons nos librairie au début de nos programmes comme suit :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:librairies1.png]]&lt;br /&gt;
&lt;br /&gt;
Ici le np permet de dire que lorsque nous utilisons np.array alors nous utilisons la commande array () contenu dans la bibliothèque Numpy.&lt;br /&gt;
&lt;br /&gt;
Ceci nous permettra d’utiliser en simultané différentes librairies, toutes les bibliothèques seront importées selon ce schéma.&lt;br /&gt;
Nous allons par la suite, nous intéresser à différentes commandes incluses dans ces librairies.&lt;br /&gt;
&lt;br /&gt;
==Numpy==&lt;br /&gt;
&lt;br /&gt;
Numpy est une bibliothèque dédiée aux calculs mathématiques et à la gestion des listes (telles que des matrices).&lt;br /&gt;
Matplotlib, quant à lui, est dédié aux affichages graphiques de données.&lt;br /&gt;
Nous allons dans cette partie nous intéresser aux commandes principales de ces deux bibliothèques de python.&lt;br /&gt;
&lt;br /&gt;
Sous numpy, les tableaux sont des types array, ils définissent l'équivalent des tableaux statiques en langage C. La taille d’un tableau numpy ne peut donc pas être changée après leur création. &lt;br /&gt;
&lt;br /&gt;
Néanmoins grâce a Numpy nous pouvons simplement effectuer des tâches sur les tableaux comme en extraire un sous tableaux, et d’effectuer simplement les produits entre matrice, vecteur.&lt;br /&gt;
&lt;br /&gt;
Dans notre projet, nous utiliserons plus courament les fonctions : &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.shape&amp;lt;/FONT&amp;gt; permet d’obtenir la taille de la matrice sous forme d’un tuple, suffit de choisir le bon numéro&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.zeros&amp;lt;/FONT&amp;gt; permet de créer une ligne de x zéro(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.ones&amp;lt;/FONT&amp;gt; permet de créer une ligne de x un(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.vstack&amp;lt;/FONT&amp;gt; permet de rajouter des lignes dans une matrice déjà créer en paramètre&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.transpose&amp;lt;/FONT&amp;gt; permet de transposer une matrice en paramètre&lt;br /&gt;
&lt;br /&gt;
==Seaborn==&lt;br /&gt;
&lt;br /&gt;
Seaborn est une bibliothèque de visualisation de données Python basée sur matplotlib. Il fournit une interface de haut niveau pour dessiner des graphiques statistiques attrayants et informatifs.&lt;br /&gt;
&lt;br /&gt;
'''Différences entre Matplotlib et Seaborn'''&lt;br /&gt;
&lt;br /&gt;
Les défauts de Matplotlib qui ne parlent généralement pas aux utilisateurs sont les couleurs, les marques de tiques sur les axes supérieur et droit, le style,...&lt;br /&gt;
Les exemples ci-dessus rendent également une autre frustration des utilisateurs plus apparente: le fait que travailler avec DataFrames ne va pas aussi bien avec Matplotlib, ce qui peut être ennuyeux si vous faites une analyse exploratoire avec Pandas. Et c’est exactement ce que Seaborn adresse : les fonctions de traçage fonctionnent sur dataframes et tableaux qui contiennent tout un ensemble de données.&lt;br /&gt;
[[Fichier:seaborn1.png|300px|thumb|right|Résultat du code python ci gauche]]&lt;br /&gt;
&lt;br /&gt;
   # Import necessary libraries&lt;br /&gt;
   import seaborn as sns&lt;br /&gt;
   import matplotlib.pyplot as plt&lt;br /&gt;
   &lt;br /&gt;
   # Load iris data&lt;br /&gt;
   iris = sns.load_dataset(&amp;quot;iris&amp;quot;) #DATASET ALREADY EXISTING&lt;br /&gt;
   &lt;br /&gt;
   # Construct iris plot&lt;br /&gt;
   sns.swarmplot(x=&amp;quot;species&amp;quot;, y=&amp;quot;petal_length&amp;quot;, data=iris)&lt;br /&gt;
   &lt;br /&gt;
   # Show plot&lt;br /&gt;
   plt.show()&lt;br /&gt;
&lt;br /&gt;
==Pandas==&lt;br /&gt;
&lt;br /&gt;
Pandas est une API d'analyse de données orientée colonnes. C'est un excellent outil pour manipuler et analyser des données d'entrée. Beaucoup de frameworks d'apprentissage automatique acceptent les structures de données Pandas en entrée.&lt;br /&gt;
&lt;br /&gt;
Comme évoqué précédemment, Pandas travaille avec des matrices colonnes communément appelées ‘Series’ mais aussi et surtout avec des tableaux de données appelés ‘DataFrames’.&lt;br /&gt;
Une Series est tout simplement une colonne et une DataFrame est un tableau à plusieurs dimensions constitué de Series.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Panda.JPG]]&lt;br /&gt;
&lt;br /&gt;
A l'aide de Pandas, on peut ainsi créer, importer, lire et manipuler des bases de données facilement.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Théories des algorithmes étudiés''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Il y a différents types d’algorithmes en machine learning, pour notre sujet qui consiste à classer des machines en défectueuse ou fonctionnelles (1 ou 0), nous aurons surtout besoin d’algorithmes de classification binaire. De manière générale, la conception de la plupart des algorithmes fonctionnent de cette manière : &lt;br /&gt;
&lt;br /&gt;
* Élaborer un modèle &lt;br /&gt;
* Établir une fonction coût pour celui-ci correspondant à l’erreur entre le modèle et les données réelles&lt;br /&gt;
* Trouver un algorithme de minimisation de cette fonction coût&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression linéaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression1.png|200px|thumb|right|Exemple de régression linéaire]]&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est un algorithme de prédiction et non un algorithme de classification, nous aurons surtout besoin de ce deuxième type d’algorithme pour notre projet mais nous tenons à présenter cet algorithme qui est le plus basique en machine learning et un bon début pour une formation pédagogique.&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est une méthode de modélisation qui cherche à établir une relation linéaire entre une ou des &amp;quot;features&amp;quot; (variables explicatives) et une &amp;quot;target&amp;quot; (variable expliquée qu'on cherche à prévoir à partir des variables explicatives). En machine learning, la régression linéaire est un modèle d'apprentissage supervisé, c'est-à-dire qu'on apprend à l'algorithme de prédiction à partir d'exemples dont on dispose dans une dataset. Nous nous intéresserons à la régression affine qui est la plus simple pour débuter.&lt;br /&gt;
&lt;br /&gt;
===Modèle et estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
La régression affine consiste donc à trouver un modèle de type&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt;y=ax+b&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
avec x une &amp;quot;feature&amp;quot;, y la target et avec a et b des paramètres qu'il nous faudra déterminer. Le but est donc de trouver les paramètres a et b tels que la distance entre chaque point du nuage et la droite du modèle soit la plus petite possible.&lt;br /&gt;
Mathématiquement, il suffit de résoudre cette formule:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression2.png|200px|thumb|right|Méthode des moindres carrés illustrée]]&lt;br /&gt;
[[Fichier:regression3.png]]&lt;br /&gt;
&lt;br /&gt;
On utilise donc la méthode des moindres carrés pour mesurer l'erreur entre le modèle de prédiction et les données et ainsi fabriquer notre fonction coût :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression4.png]]&lt;br /&gt;
&lt;br /&gt;
avec m le nombre de points du nuage.&lt;br /&gt;
&lt;br /&gt;
L'objectif de l'algorithme est donc de trouver les paramètres optimaux qui minimisent cette fonction J.&lt;br /&gt;
En machine learning, une des méthodes les plus populaires pour faire ceci est la descente de gradient, car c'est une méthode adaptée quand on fait du traitement de grosses dataset (&amp;quot;faible&amp;quot; temps de calcul). En effet, la fonction coût J est une parabole admettant un unique minimum dépendant des paramètres a et b. La descente de gradient consiste à chercher le point de celle-ci où la dérivée est nulle (donc le minimum)&lt;br /&gt;
&lt;br /&gt;
===Méthode de la descente du gradient===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression6.png|200px|thumb|right|Méthode gradient]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression7.png|200px|thumb|right|Généralisation gradient fct parabolique]]&lt;br /&gt;
&lt;br /&gt;
Soit une fonction parabolique ne dépendant que de x. On cherche à trouver le minimum de cette fonction en utilisant la méthode de la descente du gradient&lt;br /&gt;
Pour cela on choisit un point aléatoirement &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;et on va descendre à partir de celui-ci jusqu'à atteindre un minimum en utilisant&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression5.png]]&lt;br /&gt;
&lt;br /&gt;
avec un paramètre  qui influencera la taille du pas de la descente.&lt;br /&gt;
&lt;br /&gt;
Il faut faire attention à ne pas prendre un pas trop grand, ni trop petit, pour éviter de &amp;quot;tourner&amp;quot; autour du minimum ou de prendre trop de temps pour l'atteindre.&lt;br /&gt;
Note : On peut généraliser cela pour une fonction parabolique à n paramètres qui aurait donc une forme de bol.&lt;br /&gt;
&lt;br /&gt;
===Application sur notre fonction coût===&lt;br /&gt;
&lt;br /&gt;
Notre fonction coût dépend des 2 paramètres a et b :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression8.png]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression9.png]]&lt;br /&gt;
&lt;br /&gt;
On choisit &amp;lt;math&amp;gt;a_0&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; aléatoirement et on applique ceci pour un pas :&lt;br /&gt;
&lt;br /&gt;
Avec &lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression10.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d'un certain nombre d'itérations on trouve le couple &amp;lt;math&amp;gt;(a,b)&amp;lt;/math&amp;gt; qui minimise notre fonction coût.&lt;br /&gt;
&lt;br /&gt;
Note : Nous avons démontré la théorie de la régression linéaire affine mais on pourrait généraliser celle-ci pour un modèle polynomiale d’ordre n, la courbe de prédiction serait donc parabolique et il faudrait trouver le tuple &amp;lt;math&amp;gt;(a_1,a_2,...,a_n)&amp;lt;/math&amp;gt; qui minimise la fonction coût.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression logistique binaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo1.png|200px|thumb|right|Modèle régression logistique]]&lt;br /&gt;
&lt;br /&gt;
La régression logistique binaire est un algorithme de classification, contrairement à la régression linéaire qui est un algorithme de prédiction. De la même façon que la régression linéaire,  il s'agit de modéliser au mieux un modèle mathématique simple à des observations réelles nombreuses. Cette méthode se base sur de l’analyse mathématiques et statistique. Il faut donc associer à des “features” &amp;lt;math&amp;gt;(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; une variable Y valant 1 ou 0 (d’où le terme classification binaire).&lt;br /&gt;
&lt;br /&gt;
L’objectif de l’algorithme est donc de trouver la fonction F dépendant d’une loi de probabilité telle que :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo2.png]]&lt;br /&gt;
&lt;br /&gt;
avec S un certain seuil (fixé la plupart du temps à 0,5).&lt;br /&gt;
&lt;br /&gt;
===Modèle===&lt;br /&gt;
&lt;br /&gt;
Comme cette méthode repose principalement sur des statistiques, il est important d’adopter une notation explicite lors de l’explication théorique :&lt;br /&gt;
&lt;br /&gt;
* On notera Y la variable à prédire (qui vaudra 0 ou 1) et &amp;lt;math&amp;gt;X=(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; les variables permettant de prédire Y&lt;br /&gt;
* On travaillera dans un univers  de N échantillons (taille de la dataset)&lt;br /&gt;
* On notera &amp;lt;math&amp;gt;P(Y=1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;P(Y=0)&amp;lt;/math&amp;gt; les probabilités que Y valent respectivement 1 ou 0 &amp;lt;math&amp;gt;p(1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0)&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;p(X|1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(X|0)&amp;lt;/math&amp;gt; sont les distributions conditionnelles des caractéristiques X sachant la valeur prise par Y&lt;br /&gt;
* &amp;lt;math&amp;gt;p(1|X)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0|X)&amp;lt;/math&amp;gt; sont donc les probabilités d’obtenir la valeur de Y (1 ou 0) sachant les valeurs de X&lt;br /&gt;
&lt;br /&gt;
La régression logistique utilise l’hypothèse fondamentale (mesure de l’évidence) :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo3.png]]&lt;br /&gt;
&lt;br /&gt;
On en déduit donc (comme &amp;lt;math&amp;gt;p(0|X)=1-p(1|X))&amp;lt;/math&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo4.png]]&lt;br /&gt;
&lt;br /&gt;
Avec &amp;lt;math&amp;gt;(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; des variables à déterminer.&lt;br /&gt;
&lt;br /&gt;
''Note :'' ce modèle est appelé modèle LOGIT.&lt;br /&gt;
&lt;br /&gt;
===Estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
Contrairement à la régression linéaire affine, on ne peut pas utiliser la méthode des moindres carrés, on utilise alors la méthode de maximisation de la vraisemblance.&lt;br /&gt;
“La vraisemblance mesure une adéquation entre la distribution observée sur un échantillon aléatoire et une loi de probabilité supposée décrire une réalité sur la population dont l'échantillon est issu.” (source : [www.jybaudot.fr])&lt;br /&gt;
&lt;br /&gt;
Le calcul de la vraisemblance L dans un univers  de N échantillons est le suivant :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo5.png]]&lt;br /&gt;
&lt;br /&gt;
Plus la vraisemblance est élevée, alors plus la loi de probabilité est proche de la réalité. Le but est donc de maximiser cette valeur et de trouver les valeurs optimales de &amp;lt;math&amp;gt;A =(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; qui influent directement sur la loi de probabilité établie dans la partie modèle.&lt;br /&gt;
&lt;br /&gt;
===Algorithme d'optimisation===&lt;br /&gt;
&lt;br /&gt;
Afin de trouver la valeur optimale du vecteur A, nous utiliserons encore une fois la méthode de descente du gradient adaptée à notre cas.&lt;br /&gt;
&lt;br /&gt;
Celle-ci utilise la relation suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo6.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d’un certain nombre d’itérations, on trouvera la valeur optimale de A afin de maximiser la vraisemblance.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Mise en pratique''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Pour la mise en pratique, nous avons décidé d’appliquer les méthodes sur un dataset de prédiction de maintenance pour l’industrie, nous importons grâce à la librairie panda : &amp;lt;code&amp;gt; dataset = pd.read_csv('ai4i2020.csv') &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette dataset contient 14 colonnes de données, nous pouvons visualiser la proportion de données saines et non-saines par ce code seaborn : &amp;lt;code&amp;gt; sns.factorplot('Machine failure',data=dataset,kind='count') &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on traitera cette dataset pour la préparer sur l’intervention des modèles de machine learning, puis on appliquera ces méthodes.&lt;br /&gt;
&lt;br /&gt;
==Pré-traitement de la dataset==&lt;br /&gt;
&lt;br /&gt;
Avant d’appliquer les algorithme sur notre dataset, il faut la traiter, le traitement sera le même pour tous les algorithmes et suivra cet ordre :&lt;br /&gt;
* Traitement des valeurs manquantes&lt;br /&gt;
* Équilibrage des données&lt;br /&gt;
* Séparations des données en entrainement et test&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous devons regarder si notre base de données contient des valeurs manquante, pour cela nous implantons ce code : &lt;br /&gt;
&lt;br /&gt;
   import missingno as msno&lt;br /&gt;
   msno.matrix(dataset)&lt;br /&gt;
&lt;br /&gt;
Les lignes blanches dans le résultat correspond aux valeurs manquantes, ci-dessous nous voyons que nous avons aucune données manquantes dans la base que nous avons importer : [[Fichier:Miseenpratique.png]]&lt;br /&gt;
&lt;br /&gt;
Dans le cas, où nous avons des valeurs manquante, il y a plusieurs méthodes pour traiter les valeurs manquantes mais nous retenons 2 méthodes :&lt;br /&gt;
* Une méthode qui consiste à supprimer les lignes où des valeurs manquantes sont présentes : &amp;lt;code&amp;gt; data.dropna(inplace=True) &amp;lt;/code&amp;gt;&lt;br /&gt;
L’avantage de cette méthode est de créer un modèle robuste. L’inconvénient majeur est le fait qu’on peut perdre énormément de données, pour des données où les valeurs manquantes sont excessives, mieux vaut appliquer une autre méthode.&lt;br /&gt;
&lt;br /&gt;
* Une méthode qui consiste à remplacer les valeurs manquantes par la moyenne des données de la colonne : &amp;lt;code&amp;gt; data[0]=drop[0].replace(np.NaN,data[0].mean()) &amp;lt;/code&amp;gt; L’avantage de cette méthode permet d’éviter la suppression de lignes, ce qui permet de garder les autres données comparé à l’autre méthode. Cependant cette méthode n’est que applicable sur les données numériques&lt;br /&gt;
&lt;br /&gt;
Nous passons alors sur l'équilibrage des données. Avant d’appliquer la méthode SMOTE, nous devons mettre dans 2 variables, la target (y) et les features (X) :&lt;br /&gt;
&lt;br /&gt;
   X = dataset.drop(['Machine failure','UDI','Product ID','Type','TWF','HDF','PWF','OSF','RNF'],axis=1).values&lt;br /&gt;
   y = dataset['Machine failure']&lt;br /&gt;
&lt;br /&gt;
Notre target sera seulement ‘Machine failure’ et nos features seront : la température de l’air, la température du processus, le couple, et l’usure des outils.&lt;br /&gt;
&lt;br /&gt;
Durant notre projet , nous avons implémenté la technique SMOTE pour traiter les ensembles de données déséquilibrées.&lt;br /&gt;
Le principe de SMOTE est de générer de nouveaux échantillons en combinant les données de la classe minoritaire avec celles de leurs voisins proches. Techniquement, on peut décomposer SMOTE en 5 étapes :&lt;br /&gt;
* 1 - Choix d’un vecteur caractéristique de notre classe minoritaire que nous appellerons vc &lt;br /&gt;
* 2 - Sélection des k-voisins les plus proches (k=5 par défaut) et choix de l’un d’eux au hasard que l’on appellera pv &lt;br /&gt;
* 3 - Calcul de la différence pour chaque valeur caractéristique (feature value) i, vc[i]-pv[i] et multiplication de celle-ci par un nombre aléatoire entre [0,1]&lt;br /&gt;
* 4 - Ajout du résultat précédent à la valeur de la caractéristique i du vecteur vc afin d’obtenir un nouveau point (une nouvelle donnée) dans l’espace des caractéristiques &lt;br /&gt;
* 5 - Répétition de ces opérations pour chaque point de données de la classe minoritaire &lt;br /&gt;
Nous remarquons que cette technique marche après smote (50% données saines, 50% données non-saines)&lt;br /&gt;
&lt;br /&gt;
Code : &lt;br /&gt;
&lt;br /&gt;
   oversample = SMOTE()&lt;br /&gt;
   Xsmote, ysmote = oversample.fit_resample(X,y)&lt;br /&gt;
   Xsmote = pd.DataFrame(Xsmote)&lt;br /&gt;
   ysmote = pd.DataFrame(ysmote)&lt;br /&gt;
   X=Xsmote&lt;br /&gt;
   y=ysmote&lt;br /&gt;
&lt;br /&gt;
On remarque que la technique smote a ajouté 9322 lignes sur notre base, Maintenant que nous avons un équilibre entre les données ‘sains’ et ‘malsains’, nous pouvons voir la répartitions des points sur 2 axes :&lt;br /&gt;
&lt;br /&gt;
(image)&lt;br /&gt;
&lt;br /&gt;
Nous pouvons alors procéder à la séparation de nos données en données d'entraînement et de test&lt;br /&gt;
&lt;br /&gt;
Nous devons séparer en deux nos données pour pouvoir appliquer les algorithmes de machine learning, ainsi : &lt;br /&gt;
Les données d'entraînement serviront de repères pour l’algorithme&lt;br /&gt;
Les données de test seront entraînées par celle d’entrainement pour créer une prédiction&lt;br /&gt;
&lt;br /&gt;
Nous allons utiliser la fonction train_test_split de la librairie sklearn pour séparer nos données : &lt;br /&gt;
&lt;br /&gt;
   X_train, X_test, y_train, y_test = train_test_split(X,y, test_size = 0.2, random_state = 100)&lt;br /&gt;
&lt;br /&gt;
Ici dans les paramètres :&lt;br /&gt;
X  correspond aux features&lt;br /&gt;
y correspond à la target&lt;br /&gt;
test_size correspond au pourcentage de séparation (soit 0.2 = 20% test et 80% d'entraînement)&lt;br /&gt;
random_state permet d’initialiser le choix aléatoire pour avoir la même répartition à chaque exécution&lt;br /&gt;
&lt;br /&gt;
Maintenant nous pouvons appliquer les algorithme à notre modèle&lt;br /&gt;
&lt;br /&gt;
==Application des algorithmes==&lt;br /&gt;
&lt;br /&gt;
En général, nous allons appliquer les algorithme en suivant cet ordre : &lt;br /&gt;
* Importation de la méthode sur la librairie sklearn&lt;br /&gt;
* Entraînement des données&lt;br /&gt;
* Prédiction&lt;br /&gt;
* Méthodes d’évaluations&lt;br /&gt;
&lt;br /&gt;
===Régression linéaire===&lt;br /&gt;
&lt;br /&gt;
Nous allons commencer par le plus simple : la régression linéaire, nous commençons par importer l’algorithme à partir de la librairie sklearn : &amp;lt;code&amp;gt; from sklearn.linear_model import LinearRegression &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis nous appelons l’algorithme avec les paramètres de base, puis nous entraînons notre dataset : &lt;br /&gt;
   #Méthode de régréssion linéaire&lt;br /&gt;
   lr = LinearRegression()&lt;br /&gt;
   #Training&lt;br /&gt;
   lr.fit(X_train,y_train)&lt;br /&gt;
&lt;br /&gt;
Ensuite la prédiction : &lt;br /&gt;
   #Prediction&lt;br /&gt;
   y_pred = lr.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
Et enfin l'évaluation, nous avons vu 2 méthodes pour évaluer notre modèle : &lt;br /&gt;
* Afficher le score de prédiction&lt;br /&gt;
* Afficher la matrice de confusion, une matrice de taille 2x2 qui donne ces informations : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatrixConfusion.png]]&lt;br /&gt;
&lt;br /&gt;
Le score de prédiction (accuracy) est également calculé à partir de cette matrice&lt;br /&gt;
Pour la régression linéaire, nous allons qu’afficher le score de prédiction, car cet algorithme nous donne en retour des valeurs non-binaire, la construction d’une matrice de confusion et impossible.&lt;br /&gt;
&lt;br /&gt;
   #Evaluation&lt;br /&gt;
   print(lr.score(X_test,y_test))&lt;br /&gt;
&lt;br /&gt;
Nous obtenons ainsi un score de 0.48, un score qui est plus élevé sans la méthode SMOTE (0.14), sauf que cette méthode n’est pas la plus optimisée pour cette base de données, car nous avons en target des valeurs binaires. Il vaut mieux appliquer la méthode de régression logistique ou la méthode de Naives-Bayes.&lt;br /&gt;
&lt;br /&gt;
===Régression logistique===&lt;br /&gt;
&lt;br /&gt;
Dans le même modèle que la régression linéaire, nous procédons à l’import de la méthode, l’appel de la méthode, l'entraînement des données et de la prédiction :&lt;br /&gt;
&lt;br /&gt;
   from sklearn import linear_model&lt;br /&gt;
&lt;br /&gt;
   #Modèle régression logistique&lt;br /&gt;
   modele_regLog = linear_model.LogisticRegression() &lt;br /&gt;
   #random_state = 100, solver = 'liblinear', multi_class = 'auto'&lt;br /&gt;
&lt;br /&gt;
   #training&lt;br /&gt;
   modele_regLog.fit(X_train,y_train)&lt;br /&gt;
&lt;br /&gt;
   #prediction&lt;br /&gt;
   y_pred = modele_regLog.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
   #précision du modèle&lt;br /&gt;
   precision = modele_regLog.score(X_test,y_test)&lt;br /&gt;
   print(precision)&lt;br /&gt;
&lt;br /&gt;
Pour la régression logistique, nous allons afficher la matrice de confusion et le score :&lt;br /&gt;
&lt;br /&gt;
   from sklearn.metrics import plot_confusion_matrix&lt;br /&gt;
   plot_confusion_matrix(modele_regLog, X_test, y_test)  &lt;br /&gt;
   plt.show() &lt;br /&gt;
&lt;br /&gt;
(images)&lt;br /&gt;
&lt;br /&gt;
Nous obtenons un score de 0.82, contre 0.97 sans la méthode de SMOTE, ce qui est cohérent car le score obtenu sans SMOTE n’est pas précis car il y avait peu de données où la machine a planté. Avec SMOTE, nous obtenons certes un score moins élevé mais plus précis.&lt;br /&gt;
Grâce à la matrice de confusion nous pouvons voir que : &lt;br /&gt;
* Il y a 2396 fois où l’algorithme a prédit Machine failure = 0 et a eu raison&lt;br /&gt;
* Il y a 2377 fois où l’algorithme a prédit Machine failure = 1 et a eu raison&lt;br /&gt;
* Il y a 546 fois où l’algorithme a prédit Machine failure = 1 et a eu faux&lt;br /&gt;
* Il y a 478 fois où l’algorithme a prédit Machine failure = 0 et a eu faux&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 0px; padding: 20px; font-weight: bold; text-align: center; font-size: 80%; background: #61798F; vertical-align: top; width: 100%;&amp;quot;&amp;gt; '''PARTIE II (S8)''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
=Recherche bibliographique=&lt;br /&gt;
&lt;br /&gt;
* https://www.wikipedia.com&lt;br /&gt;
&lt;br /&gt;
* https://www.jybaudot.fr&lt;br /&gt;
&lt;br /&gt;
* https://datascientest.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.ipgirl.com&lt;br /&gt;
&lt;br /&gt;
* Cours de probabilités et statistiques de l’Université Jules Vernes&lt;br /&gt;
&lt;br /&gt;
* Chaine youtube Machine Learning : https://www.youtube.com/channel/UCmpptkXu8iIFe6kfDK5o7VQ&lt;br /&gt;
&lt;br /&gt;
* Machine Learning with scikit-learn Quick Start Guide écrit par Kevin Jolly&lt;br /&gt;
&lt;br /&gt;
* https://lucidar.me/&lt;br /&gt;
&lt;br /&gt;
* https://archive.ics.uci.edu/ml/datasets.php&lt;br /&gt;
&lt;br /&gt;
* https://www.kaggle.com/datasets&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com/&lt;br /&gt;
&lt;br /&gt;
* Machine Learning algorithms - Second Edition écrit par Giuseppe Bonaccorso&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com&lt;br /&gt;
&lt;br /&gt;
* https://towardsdatascience.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.learndatasci.com/&lt;br /&gt;
&lt;br /&gt;
==Rapports et présentation==&lt;br /&gt;
&lt;br /&gt;
===Librairies===&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1CQZ1s6fNY_6MsmbBa5TP1OzSedqFeaWI?usp=sharing/ Rapport Numpy]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1tdu_B2wRsUiqdnSeskQENdn_wX3pJMeT?usp=sharing/ Rapport Pandas]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1DPS4ZT91SIEhscwST8kfER7u21tKoM3a?usp=sharing/ Rapport Seaborn]&lt;br /&gt;
&lt;br /&gt;
===Rapports===&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/document/d/1yR0vLePV3hI1_HVtTZWwGIwy0Cb-oLOsOTK3Um5KAYE/edit?usp=sharing/ Rapport]&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/presentation/d/1Je_yF0dgc-s9gB7LLsfOg0b05xcwIFJbaqpVytxWv5A/edit?usp=sharing/ Présentation]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1y_NMo9XKJ0WzwE2zmcRblUyuIebwfoN8?usp=sharing/ Régression linéaire]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1bRyrnL1JM870cEcEvfGaS8ItrG16rchy?usp=sharing/ Google Colab]&lt;/div&gt;</summary>
		<author><name>Abrossas</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88022</id>
		<title>IMA3/IMA4 2020/2022 P5</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88022"/>
				<updated>2022-02-09T15:47:39Z</updated>
		
		<summary type="html">&lt;p&gt;Abrossas : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 0px; padding: 20px; font-weight: bold; text-align: center; font-size: 80%; background: #61798F; vertical-align: top; width: 100%;&amp;quot;&amp;gt; '''PARTIE I (S6-S7)''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Introduction et cahier des charges''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce projet est la mise en place d’algorithmes de machine Learning afin de diagnostiquer l’état de machines industrielles. Nous travaillerons sur ce projet durant 2 semestres. &lt;br /&gt;
Durant le premier semestre, nous avions comme objectifs d’acquérir la maîtrise des différentes librairies primordiales pour traiter les données en machine Learning, ainsi que d’étudier et d’utiliser certains algorithmes basiques (régression linéaire, logistique, Bayes) sur des datasets que nous traiterons nous même. &lt;br /&gt;
Pour ce qui est du second semestre, notre objectif était de concrétiser les connaissances acquises durant le premier semestre. Nous avons donc essayé de créer notre propre dataset à l’aide des matériels mis à notre disposition, de la prétraiter et d’y appliquer différents algorithmes de Machine Learning en critiquant les résultats.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning pour la détection de défaut s'inscrit parfaitement dans le contexte scientifique actuel, notamment grâce à l’industrie 4.0.&lt;br /&gt;
En effet, cette nouvelle industrie fait apparaître des systèmes communicants (l’IOT : Internet Of Things) interconnectés les uns entre les autres. Ces différents systèmes peuvent êtres nécessaires les uns, les autres afin de réaliser une tâche complexe telle que l'usinage de pièces. Le système devient dès lors potentiellement extrêmement fragile aux pannes.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning a pour but de pouvoir détecter, et localiser les pannes, voir les futures pannes potentielles afin de pouvoir dans un premier temps prévenir un opérateur. Mais il peut aussi potentiellement permettre au système de continuer de tourner, en attendant un technicien. Le machine Learning peut donc aussi permettre à une chaîne de production de continuer de tourner par l’envoie d’un autre robot par exemple, le temps que la panne soit réparée.&lt;br /&gt;
&lt;br /&gt;
Dans le schéma ci-dessous nous avons un exemple de système de système.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Intro1.png|500px|thumb|center|Schéma d'un système de systèmes]]&lt;br /&gt;
&lt;br /&gt;
Il y a deux cas de figure:&lt;br /&gt;
* Un autre système peut être envoyé pour remplacer le système 4.&lt;br /&gt;
* Les systèmes 1 et 2 peuvent permettre à la chaîne de production de continuer de tourner&lt;br /&gt;
* La chaîne de production est hors service jusqu'à réparation.&lt;br /&gt;
&lt;br /&gt;
==Cahier de charges==&lt;br /&gt;
&lt;br /&gt;
'''Ressources disponibles :'''&lt;br /&gt;
&lt;br /&gt;
* Livres sur le machine learning &lt;br /&gt;
* Bases de données (afin d'appliquer divers algorithmes de machine learning) que nous prendrons sur ces sites : [https://www.kaggle.com/datasets] et [https://archive.ics.uci.edu/ml/datasets.php]&lt;br /&gt;
* Librairies Python (Scikit-learn, Pandas, Numpy, Seaborn, Matplotlib)&lt;br /&gt;
* Google Colab&lt;br /&gt;
* Matlab (version étudiante)&lt;br /&gt;
&lt;br /&gt;
'''Objectifs poursuivis :'''&lt;br /&gt;
&lt;br /&gt;
* Détecter les dysfonctionnements de systèmes mécatroniques (par exemple les robots Khepera, Robotino…), grâce au machine learning.&lt;br /&gt;
* Apprendre à implémenter différentes méthodes machine learning .&lt;br /&gt;
&lt;br /&gt;
'''Profil du public cible :'''&lt;br /&gt;
* Secteur mécatronique&lt;br /&gt;
* Entreprises disposant d'ingénieurs pour maintenir le système informatique opérationnel&lt;br /&gt;
* Entreprises utilisant des machines dans le secteur public.&lt;br /&gt;
&lt;br /&gt;
'''Analyse des besoins :'''&lt;br /&gt;
* L’industrie a de plus en plus besoin du machine learning pour détecter les erreurs des systèmes. En effet, cette technologie devient indispensable pour les industriels, notamment afin d'accroître la productivité et l’efficacité des systèmes industriels.&lt;br /&gt;
* Le programme peut ne pas être aussi rapide et optimisé en espace mémoire que d'autres programmes, nous visons l’efficacité de notre algorithme plutôt que la rapidité.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Librairies''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
En Machine Learning, il est très important, voire primordial, de savoir manipuler les différentes librairies mises à notre disposition afin de visualiser, traiter nos différentes dataset ou même appliquer les différents algorithmes de machine Learning.&lt;br /&gt;
Durant les premières semaines de notre projet, nous avons donc appris à utiliser ces différentes librairies nécessaires pour le machine Learning, telles que Numpy, Seaborn, Panda, Matplotlib, Scikit-learn... Nous allons dans un premier temps nous intéresser à l'importation des différentes bibliothèques puis résumer les commandes importantes de ces différentes librairies.&lt;br /&gt;
&lt;br /&gt;
Ces différentes librairies ne sont pas incluses de base dans Python, il est donc nécessaire de les ajouter à Python puis à notre programme.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc choisi d'utiliser google colab car ces librairies y sont déjà installées (et aussi pratique pour travailler à plusieurs sur un même code).&lt;br /&gt;
Puis nous devons importer ces bibliothèques au début de notre programme.&lt;br /&gt;
&lt;br /&gt;
Attention : Plusieurs bibliothèques peuvent avoir la même commande mais avec des significations différentes, comme par exemple la commande randint du module numpy et celle du module random et cela peut conduire à des erreurs. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de pallier à ces problèmes nous apporterons nos librairie au début de nos programmes comme suit :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:librairies1.png]]&lt;br /&gt;
&lt;br /&gt;
Ici le np permet de dire que lorsque nous utilisons np.array alors nous utilisons la commande array () contenu dans la bibliothèque Numpy.&lt;br /&gt;
&lt;br /&gt;
Ceci nous permettra d’utiliser en simultané différentes librairies, toutes les bibliothèques seront importées selon ce schéma.&lt;br /&gt;
Nous allons par la suite, nous intéresser à différentes commandes incluses dans ces librairies.&lt;br /&gt;
&lt;br /&gt;
==Numpy==&lt;br /&gt;
&lt;br /&gt;
Numpy est une bibliothèque dédiée aux calculs mathématiques et à la gestion des listes (telles que des matrices).&lt;br /&gt;
Matplotlib, quant à lui, est dédié aux affichages graphiques de données.&lt;br /&gt;
Nous allons dans cette partie nous intéresser aux commandes principales de ces deux bibliothèques de python.&lt;br /&gt;
&lt;br /&gt;
Sous numpy, les tableaux sont des types array, ils définissent l'équivalent des tableaux statiques en langage C. La taille d’un tableau numpy ne peut donc pas être changée après leur création. &lt;br /&gt;
&lt;br /&gt;
Néanmoins grâce a Numpy nous pouvons simplement effectuer des tâches sur les tableaux comme en extraire un sous tableaux, et d’effectuer simplement les produits entre matrice, vecteur.&lt;br /&gt;
&lt;br /&gt;
Dans notre projet, nous utiliserons plus courament les fonctions : &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.shape&amp;lt;/FONT&amp;gt; permet d’obtenir la taille de la matrice sous forme d’un tuple, suffit de choisir le bon numéro&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.zeros&amp;lt;/FONT&amp;gt; permet de créer une ligne de x zéro(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.ones&amp;lt;/FONT&amp;gt; permet de créer une ligne de x un(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.vstack&amp;lt;/FONT&amp;gt; permet de rajouter des lignes dans une matrice déjà créer en paramètre&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.transpose&amp;lt;/FONT&amp;gt; permet de transposer une matrice en paramètre&lt;br /&gt;
&lt;br /&gt;
==Seaborn==&lt;br /&gt;
&lt;br /&gt;
Seaborn est une bibliothèque de visualisation de données Python basée sur matplotlib. Il fournit une interface de haut niveau pour dessiner des graphiques statistiques attrayants et informatifs.&lt;br /&gt;
&lt;br /&gt;
'''Différences entre Matplotlib et Seaborn'''&lt;br /&gt;
&lt;br /&gt;
Les défauts de Matplotlib qui ne parlent généralement pas aux utilisateurs sont les couleurs, les marques de tiques sur les axes supérieur et droit, le style,...&lt;br /&gt;
Les exemples ci-dessus rendent également une autre frustration des utilisateurs plus apparente: le fait que travailler avec DataFrames ne va pas aussi bien avec Matplotlib, ce qui peut être ennuyeux si vous faites une analyse exploratoire avec Pandas. Et c’est exactement ce que Seaborn adresse : les fonctions de traçage fonctionnent sur dataframes et tableaux qui contiennent tout un ensemble de données.&lt;br /&gt;
[[Fichier:seaborn1.png|300px|thumb|right|Résultat du code python ci gauche]]&lt;br /&gt;
&lt;br /&gt;
   # Import necessary libraries&lt;br /&gt;
   import seaborn as sns&lt;br /&gt;
   import matplotlib.pyplot as plt&lt;br /&gt;
   &lt;br /&gt;
   # Load iris data&lt;br /&gt;
   iris = sns.load_dataset(&amp;quot;iris&amp;quot;) #DATASET ALREADY EXISTING&lt;br /&gt;
   &lt;br /&gt;
   # Construct iris plot&lt;br /&gt;
   sns.swarmplot(x=&amp;quot;species&amp;quot;, y=&amp;quot;petal_length&amp;quot;, data=iris)&lt;br /&gt;
   &lt;br /&gt;
   # Show plot&lt;br /&gt;
   plt.show()&lt;br /&gt;
&lt;br /&gt;
==Pandas==&lt;br /&gt;
&lt;br /&gt;
Pandas est une API d'analyse de données orientée colonnes. C'est un excellent outil pour manipuler et analyser des données d'entrée. Beaucoup de frameworks d'apprentissage automatique acceptent les structures de données Pandas en entrée.&lt;br /&gt;
&lt;br /&gt;
Comme évoqué précédemment, Pandas travaille avec des matrices colonnes communément appelées ‘Series’ mais aussi et surtout avec des tableaux de données appelés ‘DataFrames’.&lt;br /&gt;
Une Series est tout simplement une colonne et une DataFrame est un tableau à plusieurs dimensions constitué de Series.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Panda.JPG]]&lt;br /&gt;
&lt;br /&gt;
A l'aide de Pandas, on peut ainsi créer, importer, lire et manipuler des bases de données facilement.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Théories des algorithmes étudiés''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Il y a différents types d’algorithmes en machine learning, pour notre sujet qui consiste à classer des machines en défectueuse ou fonctionnelles (1 ou 0), nous aurons surtout besoin d’algorithmes de classification binaire. De manière générale, la conception de la plupart des algorithmes fonctionnent de cette manière : &lt;br /&gt;
&lt;br /&gt;
* Élaborer un modèle &lt;br /&gt;
* Établir une fonction coût pour celui-ci correspondant à l’erreur entre le modèle et les données réelles&lt;br /&gt;
* Trouver un algorithme de minimisation de cette fonction coût&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression linéaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression1.png|200px|thumb|right|Exemple de régression linéaire]]&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est un algorithme de prédiction et non un algorithme de classification, nous aurons surtout besoin de ce deuxième type d’algorithme pour notre projet mais nous tenons à présenter cet algorithme qui est le plus basique en machine learning et un bon début pour une formation pédagogique.&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est une méthode de modélisation qui cherche à établir une relation linéaire entre une ou des &amp;quot;features&amp;quot; (variables explicatives) et une &amp;quot;target&amp;quot; (variable expliquée qu'on cherche à prévoir à partir des variables explicatives). En machine learning, la régression linéaire est un modèle d'apprentissage supervisé, c'est-à-dire qu'on apprend à l'algorithme de prédiction à partir d'exemples dont on dispose dans une dataset. Nous nous intéresserons à la régression affine qui est la plus simple pour débuter.&lt;br /&gt;
&lt;br /&gt;
===Modèle et estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
La régression affine consiste donc à trouver un modèle de type&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt;y=ax+b&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
avec x une &amp;quot;feature&amp;quot;, y la target et avec a et b des paramètres qu'il nous faudra déterminer. Le but est donc de trouver les paramètres a et b tels que la distance entre chaque point du nuage et la droite du modèle soit la plus petite possible.&lt;br /&gt;
Mathématiquement, il suffit de résoudre cette formule:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression2.png|200px|thumb|right|Méthode des moindres carrés illustrée]]&lt;br /&gt;
[[Fichier:regression3.png]]&lt;br /&gt;
&lt;br /&gt;
On utilise donc la méthode des moindres carrés pour mesurer l'erreur entre le modèle de prédiction et les données et ainsi fabriquer notre fonction coût :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression4.png]]&lt;br /&gt;
&lt;br /&gt;
avec m le nombre de points du nuage.&lt;br /&gt;
&lt;br /&gt;
L'objectif de l'algorithme est donc de trouver les paramètres optimaux qui minimisent cette fonction J.&lt;br /&gt;
En machine learning, une des méthodes les plus populaires pour faire ceci est la descente de gradient, car c'est une méthode adaptée quand on fait du traitement de grosses dataset (&amp;quot;faible&amp;quot; temps de calcul). En effet, la fonction coût J est une parabole admettant un unique minimum dépendant des paramètres a et b. La descente de gradient consiste à chercher le point de celle-ci où la dérivée est nulle (donc le minimum)&lt;br /&gt;
&lt;br /&gt;
===Méthode de la descente du gradient===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression6.png|200px|thumb|right|Méthode gradient]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression7.png|200px|thumb|right|Généralisation gradient fct parabolique]]&lt;br /&gt;
&lt;br /&gt;
Soit une fonction parabolique ne dépendant que de x. On cherche à trouver le minimum de cette fonction en utilisant la méthode de la descente du gradient&lt;br /&gt;
Pour cela on choisit un point aléatoirement &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;et on va descendre à partir de celui-ci jusqu'à atteindre un minimum en utilisant&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression5.png]]&lt;br /&gt;
&lt;br /&gt;
avec un paramètre  qui influencera la taille du pas de la descente.&lt;br /&gt;
&lt;br /&gt;
Il faut faire attention à ne pas prendre un pas trop grand, ni trop petit, pour éviter de &amp;quot;tourner&amp;quot; autour du minimum ou de prendre trop de temps pour l'atteindre.&lt;br /&gt;
Note : On peut généraliser cela pour une fonction parabolique à n paramètres qui aurait donc une forme de bol.&lt;br /&gt;
&lt;br /&gt;
===Application sur notre fonction coût===&lt;br /&gt;
&lt;br /&gt;
Notre fonction coût dépend des 2 paramètres a et b :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression8.png]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression9.png]]&lt;br /&gt;
&lt;br /&gt;
On choisit &amp;lt;math&amp;gt;a_0&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; aléatoirement et on applique ceci pour un pas :&lt;br /&gt;
&lt;br /&gt;
Avec &lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression10.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d'un certain nombre d'itérations on trouve le couple &amp;lt;math&amp;gt;(a,b)&amp;lt;/math&amp;gt; qui minimise notre fonction coût.&lt;br /&gt;
&lt;br /&gt;
Note : Nous avons démontré la théorie de la régression linéaire affine mais on pourrait généraliser celle-ci pour un modèle polynomiale d’ordre n, la courbe de prédiction serait donc parabolique et il faudrait trouver le tuple &amp;lt;math&amp;gt;(a_1,a_2,...,a_n)&amp;lt;/math&amp;gt; qui minimise la fonction coût.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression logistique binaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo1.png|200px|thumb|right|Modèle régression logistique]]&lt;br /&gt;
&lt;br /&gt;
La régression logistique binaire est un algorithme de classification, contrairement à la régression linéaire qui est un algorithme de prédiction. De la même façon que la régression linéaire,  il s'agit de modéliser au mieux un modèle mathématique simple à des observations réelles nombreuses. Cette méthode se base sur de l’analyse mathématiques et statistique. Il faut donc associer à des “features” &amp;lt;math&amp;gt;(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; une variable Y valant 1 ou 0 (d’où le terme classification binaire).&lt;br /&gt;
&lt;br /&gt;
L’objectif de l’algorithme est donc de trouver la fonction F dépendant d’une loi de probabilité telle que :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo2.png]]&lt;br /&gt;
&lt;br /&gt;
avec S un certain seuil (fixé la plupart du temps à 0,5).&lt;br /&gt;
&lt;br /&gt;
===Modèle===&lt;br /&gt;
&lt;br /&gt;
Comme cette méthode repose principalement sur des statistiques, il est important d’adopter une notation explicite lors de l’explication théorique :&lt;br /&gt;
&lt;br /&gt;
* On notera Y la variable à prédire (qui vaudra 0 ou 1) et &amp;lt;math&amp;gt;X=(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; les variables permettant de prédire Y&lt;br /&gt;
* On travaillera dans un univers  de N échantillons (taille de la dataset)&lt;br /&gt;
* On notera &amp;lt;math&amp;gt;P(Y=1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;P(Y=0)&amp;lt;/math&amp;gt; les probabilités que Y valent respectivement 1 ou 0 &amp;lt;math&amp;gt;p(1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0)&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;p(X|1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(X|0)&amp;lt;/math&amp;gt; sont les distributions conditionnelles des caractéristiques X sachant la valeur prise par Y&lt;br /&gt;
* &amp;lt;math&amp;gt;p(1|X)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0|X)&amp;lt;/math&amp;gt; sont donc les probabilités d’obtenir la valeur de Y (1 ou 0) sachant les valeurs de X&lt;br /&gt;
&lt;br /&gt;
La régression logistique utilise l’hypothèse fondamentale (mesure de l’évidence) :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo3.png]]&lt;br /&gt;
&lt;br /&gt;
On en déduit donc (comme &amp;lt;math&amp;gt;p(0|X)=1-p(1|X))&amp;lt;/math&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo4.png]]&lt;br /&gt;
&lt;br /&gt;
Avec &amp;lt;math&amp;gt;(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; des variables à déterminer.&lt;br /&gt;
&lt;br /&gt;
''Note :'' ce modèle est appelé modèle LOGIT.&lt;br /&gt;
&lt;br /&gt;
===Estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
Contrairement à la régression linéaire affine, on ne peut pas utiliser la méthode des moindres carrés, on utilise alors la méthode de maximisation de la vraisemblance.&lt;br /&gt;
“La vraisemblance mesure une adéquation entre la distribution observée sur un échantillon aléatoire et une loi de probabilité supposée décrire une réalité sur la population dont l'échantillon est issu.” (source : [www.jybaudot.fr])&lt;br /&gt;
&lt;br /&gt;
Le calcul de la vraisemblance L dans un univers  de N échantillons est le suivant :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo5.png]]&lt;br /&gt;
&lt;br /&gt;
Plus la vraisemblance est élevée, alors plus la loi de probabilité est proche de la réalité. Le but est donc de maximiser cette valeur et de trouver les valeurs optimales de &amp;lt;math&amp;gt;A =(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; qui influent directement sur la loi de probabilité établie dans la partie modèle.&lt;br /&gt;
&lt;br /&gt;
===Algorithme d'optimisation===&lt;br /&gt;
&lt;br /&gt;
Afin de trouver la valeur optimale du vecteur A, nous utiliserons encore une fois la méthode de descente du gradient adaptée à notre cas.&lt;br /&gt;
&lt;br /&gt;
Celle-ci utilise la relation suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo6.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d’un certain nombre d’itérations, on trouvera la valeur optimale de A afin de maximiser la vraisemblance.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Mise en pratique''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Pour la mise en pratique, nous avons décidé d’appliquer les méthodes sur un dataset de prédiction de maintenance pour l’industrie, nous importons grâce à la librairie panda : &amp;lt;code&amp;gt; dataset = pd.read_csv('ai4i2020.csv') &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette dataset contient 14 colonnes de données, nous pouvons visualiser la proportion de données saines et non-saines par ce code seaborn : &amp;lt;code&amp;gt; sns.factorplot('Machine failure',data=dataset,kind='count') &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on traitera cette dataset pour la préparer sur l’intervention des modèles de machine learning, puis on appliquera ces méthodes.&lt;br /&gt;
&lt;br /&gt;
==Pré-traitement de la dataset==&lt;br /&gt;
&lt;br /&gt;
Avant d’appliquer les algorithme sur notre dataset, il faut la traiter, le traitement sera le même pour tous les algorithmes et suivra cet ordre :&lt;br /&gt;
* Traitement des valeurs manquantes&lt;br /&gt;
* Équilibrage des données&lt;br /&gt;
* Séparations des données en entrainement et test&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous devons regarder si notre base de données contient des valeurs manquante, pour cela nous implantons ce code : &lt;br /&gt;
&lt;br /&gt;
   import missingno as msno&lt;br /&gt;
   msno.matrix(dataset)&lt;br /&gt;
&lt;br /&gt;
Les lignes blanches dans le résultat correspond aux valeurs manquantes, ci-dessous nous voyons que nous avons aucune données manquantes dans la base que nous avons importer : [[Fichier:Miseenpratique.png]]&lt;br /&gt;
&lt;br /&gt;
Dans le cas, où nous avons des valeurs manquante, il y a plusieurs méthodes pour traiter les valeurs manquantes mais nous retenons 2 méthodes :&lt;br /&gt;
* Une méthode qui consiste à supprimer les lignes où des valeurs manquantes sont présentes : &amp;lt;code&amp;gt; data.dropna(inplace=True) &amp;lt;/code&amp;gt;&lt;br /&gt;
L’avantage de cette méthode est de créer un modèle robuste. L’inconvénient majeur est le fait qu’on peut perdre énormément de données, pour des données où les valeurs manquantes sont excessives, mieux vaut appliquer une autre méthode.&lt;br /&gt;
&lt;br /&gt;
* Une méthode qui consiste à remplacer les valeurs manquantes par la moyenne des données de la colonne : &amp;lt;code&amp;gt; data[0]=drop[0].replace(np.NaN,data[0].mean()) &amp;lt;/code&amp;gt; L’avantage de cette méthode permet d’éviter la suppression de lignes, ce qui permet de garder les autres données comparé à l’autre méthode. Cependant cette méthode n’est que applicable sur les données numériques&lt;br /&gt;
&lt;br /&gt;
Nous passons alors sur l'équilibrage des données. Avant d’appliquer la méthode SMOTE, nous devons mettre dans 2 variables, la target (y) et les features (X) :&lt;br /&gt;
&lt;br /&gt;
   X = dataset.drop(['Machine failure','UDI','Product ID','Type','TWF','HDF','PWF','OSF','RNF'],axis=1).values&lt;br /&gt;
   y = dataset['Machine failure']&lt;br /&gt;
&lt;br /&gt;
Notre target sera seulement ‘Machine failure’ et nos features seront : la température de l’air, la température du processus, le couple, et l’usure des outils.&lt;br /&gt;
&lt;br /&gt;
Durant notre projet , nous avons implémenté la technique SMOTE pour traiter les ensembles de données déséquilibrées.&lt;br /&gt;
Le principe de SMOTE est de générer de nouveaux échantillons en combinant les données de la classe minoritaire avec celles de leurs voisins proches. Techniquement, on peut décomposer SMOTE en 5 étapes :&lt;br /&gt;
* 1 - Choix d’un vecteur caractéristique de notre classe minoritaire que nous appellerons vc &lt;br /&gt;
* 2 - Sélection des k-voisins les plus proches (k=5 par défaut) et choix de l’un d’eux au hasard que l’on appellera pv &lt;br /&gt;
* 3 - Calcul de la différence pour chaque valeur caractéristique (feature value) i, vc[i]-pv[i] et multiplication de celle-ci par un nombre aléatoire entre [0,1]&lt;br /&gt;
* 4 - Ajout du résultat précédent à la valeur de la caractéristique i du vecteur vc afin d’obtenir un nouveau point (une nouvelle donnée) dans l’espace des caractéristiques &lt;br /&gt;
* 5 - Répétition de ces opérations pour chaque point de données de la classe minoritaire &lt;br /&gt;
Nous remarquons que cette technique marche après smote (50% données saines, 50% données non-saines)&lt;br /&gt;
&lt;br /&gt;
Code : &lt;br /&gt;
&lt;br /&gt;
   oversample = SMOTE()&lt;br /&gt;
   Xsmote, ysmote = oversample.fit_resample(X,y)&lt;br /&gt;
   Xsmote = pd.DataFrame(Xsmote)&lt;br /&gt;
   ysmote = pd.DataFrame(ysmote)&lt;br /&gt;
   X=Xsmote&lt;br /&gt;
   y=ysmote&lt;br /&gt;
&lt;br /&gt;
On remarque que la technique smote a ajouté 9322 lignes sur notre base, Maintenant que nous avons un équilibre entre les données ‘sains’ et ‘malsains’, nous pouvons voir la répartitions des points sur 2 axes :&lt;br /&gt;
&lt;br /&gt;
(image)&lt;br /&gt;
&lt;br /&gt;
Nous pouvons alors procéder à la séparation de nos données en données d'entraînement et de test&lt;br /&gt;
&lt;br /&gt;
Nous devons séparer en deux nos données pour pouvoir appliquer les algorithmes de machine learning, ainsi : &lt;br /&gt;
Les données d'entraînement serviront de repères pour l’algorithme&lt;br /&gt;
Les données de test seront entraînées par celle d’entrainement pour créer une prédiction&lt;br /&gt;
&lt;br /&gt;
Nous allons utiliser la fonction train_test_split de la librairie sklearn pour séparer nos données : &lt;br /&gt;
&lt;br /&gt;
   X_train, X_test, y_train, y_test = train_test_split(X,y, test_size = 0.2, random_state = 100)&lt;br /&gt;
&lt;br /&gt;
Ici dans les paramètres :&lt;br /&gt;
X  correspond aux features&lt;br /&gt;
y correspond à la target&lt;br /&gt;
test_size correspond au pourcentage de séparation (soit 0.2 = 20% test et 80% d'entraînement)&lt;br /&gt;
random_state permet d’initialiser le choix aléatoire pour avoir la même répartition à chaque exécution&lt;br /&gt;
&lt;br /&gt;
Maintenant nous pouvons appliquer les algorithme à notre modèle&lt;br /&gt;
&lt;br /&gt;
==Application des algorithmes==&lt;br /&gt;
&lt;br /&gt;
En général, nous allons appliquer les algorithme en suivant cet ordre : &lt;br /&gt;
* Importation de la méthode sur la librairie sklearn&lt;br /&gt;
* Entraînement des données&lt;br /&gt;
* Prédiction&lt;br /&gt;
* Méthodes d’évaluations&lt;br /&gt;
&lt;br /&gt;
===Régression linéaire===&lt;br /&gt;
&lt;br /&gt;
Nous allons commencer par le plus simple : la régression linéaire, nous commençons par importer l’algorithme à partir de la librairie sklearn : &amp;lt;code&amp;gt; from sklearn.linear_model import LinearRegression &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis nous appelons l’algorithme avec les paramètres de base, puis nous entraînons notre dataset : &lt;br /&gt;
   #Méthode de régréssion linéaire&lt;br /&gt;
   lr = LinearRegression()&lt;br /&gt;
   #Training&lt;br /&gt;
   lr.fit(X_train,y_train)&lt;br /&gt;
&lt;br /&gt;
Ensuite la prédiction : &lt;br /&gt;
   #Prediction&lt;br /&gt;
   y_pred = lr.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
Et enfin l'évaluation, nous avons vu 2 méthodes pour évaluer notre modèle : &lt;br /&gt;
* Afficher le score de prédiction&lt;br /&gt;
* Afficher la matrice de confusion, une matrice de taille 2x2 qui donne ces informations : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatrixConfusion.png]]&lt;br /&gt;
&lt;br /&gt;
Le score de prédiction (accuracy) est également calculé à partir de cette matrice&lt;br /&gt;
Pour la régression linéaire, nous allons qu’afficher le score de prédiction, car cet algorithme nous donne en retour des valeurs non-binaire, la construction d’une matrice de confusion et impossible.&lt;br /&gt;
&lt;br /&gt;
   #Evaluation&lt;br /&gt;
   print(lr.score(X_test,y_test))&lt;br /&gt;
&lt;br /&gt;
Nous obtenons ainsi un score de 0.48, un score qui est plus élevé sans la méthode SMOTE (0.14), sauf que cette méthode n’est pas la plus optimisée pour cette base de données, car nous avons en target des valeurs binaires. Il vaut mieux appliquer la méthode de régression logistique ou la méthode de Naives-Bayes.&lt;br /&gt;
&lt;br /&gt;
===Régression logistique===&lt;br /&gt;
&lt;br /&gt;
Dans le même modèle que la régression linéaire, nous procédons à l’import de la méthode, l’appel de la méthode, l'entraînement des données et de la prédiction :&lt;br /&gt;
&lt;br /&gt;
   from sklearn import linear_model&lt;br /&gt;
&lt;br /&gt;
   #Modèle régression logistique&lt;br /&gt;
   modele_regLog = linear_model.LogisticRegression() &lt;br /&gt;
   #random_state = 100, solver = 'liblinear', multi_class = 'auto'&lt;br /&gt;
&lt;br /&gt;
   #training&lt;br /&gt;
   modele_regLog.fit(X_train,y_train)&lt;br /&gt;
&lt;br /&gt;
   #prediction&lt;br /&gt;
   y_pred = modele_regLog.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
   #précision du modèle&lt;br /&gt;
   precision = modele_regLog.score(X_test,y_test)&lt;br /&gt;
   print(precision)&lt;br /&gt;
&lt;br /&gt;
Pour la régression logistique, nous allons afficher la matrice de confusion et le score :&lt;br /&gt;
&lt;br /&gt;
   from sklearn.metrics import plot_confusion_matrix&lt;br /&gt;
   plot_confusion_matrix(modele_regLog, X_test, y_test)  &lt;br /&gt;
   plt.show() &lt;br /&gt;
&lt;br /&gt;
(images)&lt;br /&gt;
&lt;br /&gt;
Nous obtenons un score de 0.82, contre 0.97 sans la méthode de SMOTE, ce qui est cohérent car le score obtenu sans SMOTE n’est pas précis car il y avait peu de données où la machine a planté. Avec SMOTE, nous obtenons certes un score moins élevé mais plus précis.&lt;br /&gt;
Grâce à la matrice de confusion nous pouvons voir que : &lt;br /&gt;
* Il y a 2396 fois où l’algorithme a prédit Machine failure = 0 et a eu raison&lt;br /&gt;
* Il y a 2377 fois où l’algorithme a prédit Machine failure = 1 et a eu raison&lt;br /&gt;
* Il y a 546 fois où l’algorithme a prédit Machine failure = 1 et a eu faux&lt;br /&gt;
* Il y a 478 fois où l’algorithme a prédit Machine failure = 0 et a eu faux&lt;br /&gt;
&lt;br /&gt;
=Recherche bibliographique=&lt;br /&gt;
&lt;br /&gt;
* https://www.wikipedia.com&lt;br /&gt;
&lt;br /&gt;
* https://www.jybaudot.fr&lt;br /&gt;
&lt;br /&gt;
* https://datascientest.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.ipgirl.com&lt;br /&gt;
&lt;br /&gt;
* Cours de probabilités et statistiques de l’Université Jules Vernes&lt;br /&gt;
&lt;br /&gt;
* Chaine youtube Machine Learning : https://www.youtube.com/channel/UCmpptkXu8iIFe6kfDK5o7VQ&lt;br /&gt;
&lt;br /&gt;
* Machine Learning with scikit-learn Quick Start Guide écrit par Kevin Jolly&lt;br /&gt;
&lt;br /&gt;
* https://lucidar.me/&lt;br /&gt;
&lt;br /&gt;
* https://archive.ics.uci.edu/ml/datasets.php&lt;br /&gt;
&lt;br /&gt;
* https://www.kaggle.com/datasets&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com/&lt;br /&gt;
&lt;br /&gt;
* Machine Learning algorithms - Second Edition écrit par Giuseppe Bonaccorso&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com&lt;br /&gt;
&lt;br /&gt;
* https://towardsdatascience.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.learndatasci.com/&lt;br /&gt;
&lt;br /&gt;
==Rapports et présentation==&lt;br /&gt;
&lt;br /&gt;
===Librairies===&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1CQZ1s6fNY_6MsmbBa5TP1OzSedqFeaWI?usp=sharing/ Rapport Numpy]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1tdu_B2wRsUiqdnSeskQENdn_wX3pJMeT?usp=sharing/ Rapport Pandas]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1DPS4ZT91SIEhscwST8kfER7u21tKoM3a?usp=sharing/ Rapport Seaborn]&lt;br /&gt;
&lt;br /&gt;
===Rapports===&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/document/d/1yR0vLePV3hI1_HVtTZWwGIwy0Cb-oLOsOTK3Um5KAYE/edit?usp=sharing/ Rapport]&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/presentation/d/1Je_yF0dgc-s9gB7LLsfOg0b05xcwIFJbaqpVytxWv5A/edit?usp=sharing/ Présentation]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1y_NMo9XKJ0WzwE2zmcRblUyuIebwfoN8?usp=sharing/ Régression linéaire]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1bRyrnL1JM870cEcEvfGaS8ItrG16rchy?usp=sharing/ Google Colab]&lt;/div&gt;</summary>
		<author><name>Abrossas</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88021</id>
		<title>IMA3/IMA4 2020/2022 P5</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88021"/>
				<updated>2022-02-09T15:47:07Z</updated>
		
		<summary type="html">&lt;p&gt;Abrossas : /*  PARTIE I (S6-S7)  */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 0px; padding: 20px; font-weight: bold; text-align: center; font-size: 80%; background: #61798F; vertical-align: top; width: 100%;&amp;quot;&amp;gt; '''PARTIE I (S6-S7)''' &amp;lt;/div&amp;gt;&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Introduction et cahier des charges''' &amp;lt;/div&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce projet est la mise en place d’algorithmes de machine Learning afin de diagnostiquer l’état de machines industrielles. Nous travaillerons sur ce projet durant 2 semestres. &lt;br /&gt;
Durant le premier semestre, nous avions comme objectifs d’acquérir la maîtrise des différentes librairies primordiales pour traiter les données en machine Learning, ainsi que d’étudier et d’utiliser certains algorithmes basiques (régression linéaire, logistique, Bayes) sur des datasets que nous traiterons nous même. &lt;br /&gt;
Pour ce qui est du second semestre, notre objectif était de concrétiser les connaissances acquises durant le premier semestre. Nous avons donc essayé de créer notre propre dataset à l’aide des matériels mis à notre disposition, de la prétraiter et d’y appliquer différents algorithmes de Machine Learning en critiquant les résultats.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning pour la détection de défaut s'inscrit parfaitement dans le contexte scientifique actuel, notamment grâce à l’industrie 4.0.&lt;br /&gt;
En effet, cette nouvelle industrie fait apparaître des systèmes communicants (l’IOT : Internet Of Things) interconnectés les uns entre les autres. Ces différents systèmes peuvent êtres nécessaires les uns, les autres afin de réaliser une tâche complexe telle que l'usinage de pièces. Le système devient dès lors potentiellement extrêmement fragile aux pannes.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning a pour but de pouvoir détecter, et localiser les pannes, voir les futures pannes potentielles afin de pouvoir dans un premier temps prévenir un opérateur. Mais il peut aussi potentiellement permettre au système de continuer de tourner, en attendant un technicien. Le machine Learning peut donc aussi permettre à une chaîne de production de continuer de tourner par l’envoie d’un autre robot par exemple, le temps que la panne soit réparée.&lt;br /&gt;
&lt;br /&gt;
Dans le schéma ci-dessous nous avons un exemple de système de système.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Intro1.png|500px|thumb|center|Schéma d'un système de systèmes]]&lt;br /&gt;
&lt;br /&gt;
Il y a deux cas de figure:&lt;br /&gt;
* Un autre système peut être envoyé pour remplacer le système 4.&lt;br /&gt;
* Les systèmes 1 et 2 peuvent permettre à la chaîne de production de continuer de tourner&lt;br /&gt;
* La chaîne de production est hors service jusqu'à réparation.&lt;br /&gt;
&lt;br /&gt;
==Cahier de charges==&lt;br /&gt;
&lt;br /&gt;
'''Ressources disponibles :'''&lt;br /&gt;
&lt;br /&gt;
* Livres sur le machine learning &lt;br /&gt;
* Bases de données (afin d'appliquer divers algorithmes de machine learning) que nous prendrons sur ces sites : [https://www.kaggle.com/datasets] et [https://archive.ics.uci.edu/ml/datasets.php]&lt;br /&gt;
* Librairies Python (Scikit-learn, Pandas, Numpy, Seaborn, Matplotlib)&lt;br /&gt;
* Google Colab&lt;br /&gt;
* Matlab (version étudiante)&lt;br /&gt;
&lt;br /&gt;
'''Objectifs poursuivis :'''&lt;br /&gt;
&lt;br /&gt;
* Détecter les dysfonctionnements de systèmes mécatroniques (par exemple les robots Khepera, Robotino…), grâce au machine learning.&lt;br /&gt;
* Apprendre à implémenter différentes méthodes machine learning .&lt;br /&gt;
&lt;br /&gt;
'''Profil du public cible :'''&lt;br /&gt;
* Secteur mécatronique&lt;br /&gt;
* Entreprises disposant d'ingénieurs pour maintenir le système informatique opérationnel&lt;br /&gt;
* Entreprises utilisant des machines dans le secteur public.&lt;br /&gt;
&lt;br /&gt;
'''Analyse des besoins :'''&lt;br /&gt;
* L’industrie a de plus en plus besoin du machine learning pour détecter les erreurs des systèmes. En effet, cette technologie devient indispensable pour les industriels, notamment afin d'accroître la productivité et l’efficacité des systèmes industriels.&lt;br /&gt;
* Le programme peut ne pas être aussi rapide et optimisé en espace mémoire que d'autres programmes, nous visons l’efficacité de notre algorithme plutôt que la rapidité.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Librairies''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
En Machine Learning, il est très important, voire primordial, de savoir manipuler les différentes librairies mises à notre disposition afin de visualiser, traiter nos différentes dataset ou même appliquer les différents algorithmes de machine Learning.&lt;br /&gt;
Durant les premières semaines de notre projet, nous avons donc appris à utiliser ces différentes librairies nécessaires pour le machine Learning, telles que Numpy, Seaborn, Panda, Matplotlib, Scikit-learn... Nous allons dans un premier temps nous intéresser à l'importation des différentes bibliothèques puis résumer les commandes importantes de ces différentes librairies.&lt;br /&gt;
&lt;br /&gt;
Ces différentes librairies ne sont pas incluses de base dans Python, il est donc nécessaire de les ajouter à Python puis à notre programme.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc choisi d'utiliser google colab car ces librairies y sont déjà installées (et aussi pratique pour travailler à plusieurs sur un même code).&lt;br /&gt;
Puis nous devons importer ces bibliothèques au début de notre programme.&lt;br /&gt;
&lt;br /&gt;
Attention : Plusieurs bibliothèques peuvent avoir la même commande mais avec des significations différentes, comme par exemple la commande randint du module numpy et celle du module random et cela peut conduire à des erreurs. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de pallier à ces problèmes nous apporterons nos librairie au début de nos programmes comme suit :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:librairies1.png]]&lt;br /&gt;
&lt;br /&gt;
Ici le np permet de dire que lorsque nous utilisons np.array alors nous utilisons la commande array () contenu dans la bibliothèque Numpy.&lt;br /&gt;
&lt;br /&gt;
Ceci nous permettra d’utiliser en simultané différentes librairies, toutes les bibliothèques seront importées selon ce schéma.&lt;br /&gt;
Nous allons par la suite, nous intéresser à différentes commandes incluses dans ces librairies.&lt;br /&gt;
&lt;br /&gt;
==Numpy==&lt;br /&gt;
&lt;br /&gt;
Numpy est une bibliothèque dédiée aux calculs mathématiques et à la gestion des listes (telles que des matrices).&lt;br /&gt;
Matplotlib, quant à lui, est dédié aux affichages graphiques de données.&lt;br /&gt;
Nous allons dans cette partie nous intéresser aux commandes principales de ces deux bibliothèques de python.&lt;br /&gt;
&lt;br /&gt;
Sous numpy, les tableaux sont des types array, ils définissent l'équivalent des tableaux statiques en langage C. La taille d’un tableau numpy ne peut donc pas être changée après leur création. &lt;br /&gt;
&lt;br /&gt;
Néanmoins grâce a Numpy nous pouvons simplement effectuer des tâches sur les tableaux comme en extraire un sous tableaux, et d’effectuer simplement les produits entre matrice, vecteur.&lt;br /&gt;
&lt;br /&gt;
Dans notre projet, nous utiliserons plus courament les fonctions : &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.shape&amp;lt;/FONT&amp;gt; permet d’obtenir la taille de la matrice sous forme d’un tuple, suffit de choisir le bon numéro&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.zeros&amp;lt;/FONT&amp;gt; permet de créer une ligne de x zéro(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.ones&amp;lt;/FONT&amp;gt; permet de créer une ligne de x un(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.vstack&amp;lt;/FONT&amp;gt; permet de rajouter des lignes dans une matrice déjà créer en paramètre&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.transpose&amp;lt;/FONT&amp;gt; permet de transposer une matrice en paramètre&lt;br /&gt;
&lt;br /&gt;
==Seaborn==&lt;br /&gt;
&lt;br /&gt;
Seaborn est une bibliothèque de visualisation de données Python basée sur matplotlib. Il fournit une interface de haut niveau pour dessiner des graphiques statistiques attrayants et informatifs.&lt;br /&gt;
&lt;br /&gt;
'''Différences entre Matplotlib et Seaborn'''&lt;br /&gt;
&lt;br /&gt;
Les défauts de Matplotlib qui ne parlent généralement pas aux utilisateurs sont les couleurs, les marques de tiques sur les axes supérieur et droit, le style,...&lt;br /&gt;
Les exemples ci-dessus rendent également une autre frustration des utilisateurs plus apparente: le fait que travailler avec DataFrames ne va pas aussi bien avec Matplotlib, ce qui peut être ennuyeux si vous faites une analyse exploratoire avec Pandas. Et c’est exactement ce que Seaborn adresse : les fonctions de traçage fonctionnent sur dataframes et tableaux qui contiennent tout un ensemble de données.&lt;br /&gt;
[[Fichier:seaborn1.png|300px|thumb|right|Résultat du code python ci gauche]]&lt;br /&gt;
&lt;br /&gt;
   # Import necessary libraries&lt;br /&gt;
   import seaborn as sns&lt;br /&gt;
   import matplotlib.pyplot as plt&lt;br /&gt;
   &lt;br /&gt;
   # Load iris data&lt;br /&gt;
   iris = sns.load_dataset(&amp;quot;iris&amp;quot;) #DATASET ALREADY EXISTING&lt;br /&gt;
   &lt;br /&gt;
   # Construct iris plot&lt;br /&gt;
   sns.swarmplot(x=&amp;quot;species&amp;quot;, y=&amp;quot;petal_length&amp;quot;, data=iris)&lt;br /&gt;
   &lt;br /&gt;
   # Show plot&lt;br /&gt;
   plt.show()&lt;br /&gt;
&lt;br /&gt;
==Pandas==&lt;br /&gt;
&lt;br /&gt;
Pandas est une API d'analyse de données orientée colonnes. C'est un excellent outil pour manipuler et analyser des données d'entrée. Beaucoup de frameworks d'apprentissage automatique acceptent les structures de données Pandas en entrée.&lt;br /&gt;
&lt;br /&gt;
Comme évoqué précédemment, Pandas travaille avec des matrices colonnes communément appelées ‘Series’ mais aussi et surtout avec des tableaux de données appelés ‘DataFrames’.&lt;br /&gt;
Une Series est tout simplement une colonne et une DataFrame est un tableau à plusieurs dimensions constitué de Series.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Panda.JPG]]&lt;br /&gt;
&lt;br /&gt;
A l'aide de Pandas, on peut ainsi créer, importer, lire et manipuler des bases de données facilement.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Théories des algorithmes étudiés''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Il y a différents types d’algorithmes en machine learning, pour notre sujet qui consiste à classer des machines en défectueuse ou fonctionnelles (1 ou 0), nous aurons surtout besoin d’algorithmes de classification binaire. De manière générale, la conception de la plupart des algorithmes fonctionnent de cette manière : &lt;br /&gt;
&lt;br /&gt;
* Élaborer un modèle &lt;br /&gt;
* Établir une fonction coût pour celui-ci correspondant à l’erreur entre le modèle et les données réelles&lt;br /&gt;
* Trouver un algorithme de minimisation de cette fonction coût&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression linéaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression1.png|200px|thumb|right|Exemple de régression linéaire]]&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est un algorithme de prédiction et non un algorithme de classification, nous aurons surtout besoin de ce deuxième type d’algorithme pour notre projet mais nous tenons à présenter cet algorithme qui est le plus basique en machine learning et un bon début pour une formation pédagogique.&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est une méthode de modélisation qui cherche à établir une relation linéaire entre une ou des &amp;quot;features&amp;quot; (variables explicatives) et une &amp;quot;target&amp;quot; (variable expliquée qu'on cherche à prévoir à partir des variables explicatives). En machine learning, la régression linéaire est un modèle d'apprentissage supervisé, c'est-à-dire qu'on apprend à l'algorithme de prédiction à partir d'exemples dont on dispose dans une dataset. Nous nous intéresserons à la régression affine qui est la plus simple pour débuter.&lt;br /&gt;
&lt;br /&gt;
===Modèle et estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
La régression affine consiste donc à trouver un modèle de type&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt;y=ax+b&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
avec x une &amp;quot;feature&amp;quot;, y la target et avec a et b des paramètres qu'il nous faudra déterminer. Le but est donc de trouver les paramètres a et b tels que la distance entre chaque point du nuage et la droite du modèle soit la plus petite possible.&lt;br /&gt;
Mathématiquement, il suffit de résoudre cette formule:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression2.png|200px|thumb|right|Méthode des moindres carrés illustrée]]&lt;br /&gt;
[[Fichier:regression3.png]]&lt;br /&gt;
&lt;br /&gt;
On utilise donc la méthode des moindres carrés pour mesurer l'erreur entre le modèle de prédiction et les données et ainsi fabriquer notre fonction coût :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression4.png]]&lt;br /&gt;
&lt;br /&gt;
avec m le nombre de points du nuage.&lt;br /&gt;
&lt;br /&gt;
L'objectif de l'algorithme est donc de trouver les paramètres optimaux qui minimisent cette fonction J.&lt;br /&gt;
En machine learning, une des méthodes les plus populaires pour faire ceci est la descente de gradient, car c'est une méthode adaptée quand on fait du traitement de grosses dataset (&amp;quot;faible&amp;quot; temps de calcul). En effet, la fonction coût J est une parabole admettant un unique minimum dépendant des paramètres a et b. La descente de gradient consiste à chercher le point de celle-ci où la dérivée est nulle (donc le minimum)&lt;br /&gt;
&lt;br /&gt;
===Méthode de la descente du gradient===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression6.png|200px|thumb|right|Méthode gradient]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression7.png|200px|thumb|right|Généralisation gradient fct parabolique]]&lt;br /&gt;
&lt;br /&gt;
Soit une fonction parabolique ne dépendant que de x. On cherche à trouver le minimum de cette fonction en utilisant la méthode de la descente du gradient&lt;br /&gt;
Pour cela on choisit un point aléatoirement &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;et on va descendre à partir de celui-ci jusqu'à atteindre un minimum en utilisant&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression5.png]]&lt;br /&gt;
&lt;br /&gt;
avec un paramètre  qui influencera la taille du pas de la descente.&lt;br /&gt;
&lt;br /&gt;
Il faut faire attention à ne pas prendre un pas trop grand, ni trop petit, pour éviter de &amp;quot;tourner&amp;quot; autour du minimum ou de prendre trop de temps pour l'atteindre.&lt;br /&gt;
Note : On peut généraliser cela pour une fonction parabolique à n paramètres qui aurait donc une forme de bol.&lt;br /&gt;
&lt;br /&gt;
===Application sur notre fonction coût===&lt;br /&gt;
&lt;br /&gt;
Notre fonction coût dépend des 2 paramètres a et b :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression8.png]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression9.png]]&lt;br /&gt;
&lt;br /&gt;
On choisit &amp;lt;math&amp;gt;a_0&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; aléatoirement et on applique ceci pour un pas :&lt;br /&gt;
&lt;br /&gt;
Avec &lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression10.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d'un certain nombre d'itérations on trouve le couple &amp;lt;math&amp;gt;(a,b)&amp;lt;/math&amp;gt; qui minimise notre fonction coût.&lt;br /&gt;
&lt;br /&gt;
Note : Nous avons démontré la théorie de la régression linéaire affine mais on pourrait généraliser celle-ci pour un modèle polynomiale d’ordre n, la courbe de prédiction serait donc parabolique et il faudrait trouver le tuple &amp;lt;math&amp;gt;(a_1,a_2,...,a_n)&amp;lt;/math&amp;gt; qui minimise la fonction coût.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression logistique binaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo1.png|200px|thumb|right|Modèle régression logistique]]&lt;br /&gt;
&lt;br /&gt;
La régression logistique binaire est un algorithme de classification, contrairement à la régression linéaire qui est un algorithme de prédiction. De la même façon que la régression linéaire,  il s'agit de modéliser au mieux un modèle mathématique simple à des observations réelles nombreuses. Cette méthode se base sur de l’analyse mathématiques et statistique. Il faut donc associer à des “features” &amp;lt;math&amp;gt;(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; une variable Y valant 1 ou 0 (d’où le terme classification binaire).&lt;br /&gt;
&lt;br /&gt;
L’objectif de l’algorithme est donc de trouver la fonction F dépendant d’une loi de probabilité telle que :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo2.png]]&lt;br /&gt;
&lt;br /&gt;
avec S un certain seuil (fixé la plupart du temps à 0,5).&lt;br /&gt;
&lt;br /&gt;
===Modèle===&lt;br /&gt;
&lt;br /&gt;
Comme cette méthode repose principalement sur des statistiques, il est important d’adopter une notation explicite lors de l’explication théorique :&lt;br /&gt;
&lt;br /&gt;
* On notera Y la variable à prédire (qui vaudra 0 ou 1) et &amp;lt;math&amp;gt;X=(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; les variables permettant de prédire Y&lt;br /&gt;
* On travaillera dans un univers  de N échantillons (taille de la dataset)&lt;br /&gt;
* On notera &amp;lt;math&amp;gt;P(Y=1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;P(Y=0)&amp;lt;/math&amp;gt; les probabilités que Y valent respectivement 1 ou 0 &amp;lt;math&amp;gt;p(1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0)&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;p(X|1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(X|0)&amp;lt;/math&amp;gt; sont les distributions conditionnelles des caractéristiques X sachant la valeur prise par Y&lt;br /&gt;
* &amp;lt;math&amp;gt;p(1|X)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0|X)&amp;lt;/math&amp;gt; sont donc les probabilités d’obtenir la valeur de Y (1 ou 0) sachant les valeurs de X&lt;br /&gt;
&lt;br /&gt;
La régression logistique utilise l’hypothèse fondamentale (mesure de l’évidence) :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo3.png]]&lt;br /&gt;
&lt;br /&gt;
On en déduit donc (comme &amp;lt;math&amp;gt;p(0|X)=1-p(1|X))&amp;lt;/math&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo4.png]]&lt;br /&gt;
&lt;br /&gt;
Avec &amp;lt;math&amp;gt;(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; des variables à déterminer.&lt;br /&gt;
&lt;br /&gt;
''Note :'' ce modèle est appelé modèle LOGIT.&lt;br /&gt;
&lt;br /&gt;
===Estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
Contrairement à la régression linéaire affine, on ne peut pas utiliser la méthode des moindres carrés, on utilise alors la méthode de maximisation de la vraisemblance.&lt;br /&gt;
“La vraisemblance mesure une adéquation entre la distribution observée sur un échantillon aléatoire et une loi de probabilité supposée décrire une réalité sur la population dont l'échantillon est issu.” (source : [www.jybaudot.fr])&lt;br /&gt;
&lt;br /&gt;
Le calcul de la vraisemblance L dans un univers  de N échantillons est le suivant :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo5.png]]&lt;br /&gt;
&lt;br /&gt;
Plus la vraisemblance est élevée, alors plus la loi de probabilité est proche de la réalité. Le but est donc de maximiser cette valeur et de trouver les valeurs optimales de &amp;lt;math&amp;gt;A =(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; qui influent directement sur la loi de probabilité établie dans la partie modèle.&lt;br /&gt;
&lt;br /&gt;
===Algorithme d'optimisation===&lt;br /&gt;
&lt;br /&gt;
Afin de trouver la valeur optimale du vecteur A, nous utiliserons encore une fois la méthode de descente du gradient adaptée à notre cas.&lt;br /&gt;
&lt;br /&gt;
Celle-ci utilise la relation suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo6.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d’un certain nombre d’itérations, on trouvera la valeur optimale de A afin de maximiser la vraisemblance.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Mise en pratique''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Pour la mise en pratique, nous avons décidé d’appliquer les méthodes sur un dataset de prédiction de maintenance pour l’industrie, nous importons grâce à la librairie panda : &amp;lt;code&amp;gt; dataset = pd.read_csv('ai4i2020.csv') &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette dataset contient 14 colonnes de données, nous pouvons visualiser la proportion de données saines et non-saines par ce code seaborn : &amp;lt;code&amp;gt; sns.factorplot('Machine failure',data=dataset,kind='count') &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on traitera cette dataset pour la préparer sur l’intervention des modèles de machine learning, puis on appliquera ces méthodes.&lt;br /&gt;
&lt;br /&gt;
==Pré-traitement de la dataset==&lt;br /&gt;
&lt;br /&gt;
Avant d’appliquer les algorithme sur notre dataset, il faut la traiter, le traitement sera le même pour tous les algorithmes et suivra cet ordre :&lt;br /&gt;
* Traitement des valeurs manquantes&lt;br /&gt;
* Équilibrage des données&lt;br /&gt;
* Séparations des données en entrainement et test&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous devons regarder si notre base de données contient des valeurs manquante, pour cela nous implantons ce code : &lt;br /&gt;
&lt;br /&gt;
   import missingno as msno&lt;br /&gt;
   msno.matrix(dataset)&lt;br /&gt;
&lt;br /&gt;
Les lignes blanches dans le résultat correspond aux valeurs manquantes, ci-dessous nous voyons que nous avons aucune données manquantes dans la base que nous avons importer : [[Fichier:Miseenpratique.png]]&lt;br /&gt;
&lt;br /&gt;
Dans le cas, où nous avons des valeurs manquante, il y a plusieurs méthodes pour traiter les valeurs manquantes mais nous retenons 2 méthodes :&lt;br /&gt;
* Une méthode qui consiste à supprimer les lignes où des valeurs manquantes sont présentes : &amp;lt;code&amp;gt; data.dropna(inplace=True) &amp;lt;/code&amp;gt;&lt;br /&gt;
L’avantage de cette méthode est de créer un modèle robuste. L’inconvénient majeur est le fait qu’on peut perdre énormément de données, pour des données où les valeurs manquantes sont excessives, mieux vaut appliquer une autre méthode.&lt;br /&gt;
&lt;br /&gt;
* Une méthode qui consiste à remplacer les valeurs manquantes par la moyenne des données de la colonne : &amp;lt;code&amp;gt; data[0]=drop[0].replace(np.NaN,data[0].mean()) &amp;lt;/code&amp;gt; L’avantage de cette méthode permet d’éviter la suppression de lignes, ce qui permet de garder les autres données comparé à l’autre méthode. Cependant cette méthode n’est que applicable sur les données numériques&lt;br /&gt;
&lt;br /&gt;
Nous passons alors sur l'équilibrage des données. Avant d’appliquer la méthode SMOTE, nous devons mettre dans 2 variables, la target (y) et les features (X) :&lt;br /&gt;
&lt;br /&gt;
   X = dataset.drop(['Machine failure','UDI','Product ID','Type','TWF','HDF','PWF','OSF','RNF'],axis=1).values&lt;br /&gt;
   y = dataset['Machine failure']&lt;br /&gt;
&lt;br /&gt;
Notre target sera seulement ‘Machine failure’ et nos features seront : la température de l’air, la température du processus, le couple, et l’usure des outils.&lt;br /&gt;
&lt;br /&gt;
Durant notre projet , nous avons implémenté la technique SMOTE pour traiter les ensembles de données déséquilibrées.&lt;br /&gt;
Le principe de SMOTE est de générer de nouveaux échantillons en combinant les données de la classe minoritaire avec celles de leurs voisins proches. Techniquement, on peut décomposer SMOTE en 5 étapes :&lt;br /&gt;
* 1 - Choix d’un vecteur caractéristique de notre classe minoritaire que nous appellerons vc &lt;br /&gt;
* 2 - Sélection des k-voisins les plus proches (k=5 par défaut) et choix de l’un d’eux au hasard que l’on appellera pv &lt;br /&gt;
* 3 - Calcul de la différence pour chaque valeur caractéristique (feature value) i, vc[i]-pv[i] et multiplication de celle-ci par un nombre aléatoire entre [0,1]&lt;br /&gt;
* 4 - Ajout du résultat précédent à la valeur de la caractéristique i du vecteur vc afin d’obtenir un nouveau point (une nouvelle donnée) dans l’espace des caractéristiques &lt;br /&gt;
* 5 - Répétition de ces opérations pour chaque point de données de la classe minoritaire &lt;br /&gt;
Nous remarquons que cette technique marche après smote (50% données saines, 50% données non-saines)&lt;br /&gt;
&lt;br /&gt;
Code : &lt;br /&gt;
&lt;br /&gt;
   oversample = SMOTE()&lt;br /&gt;
   Xsmote, ysmote = oversample.fit_resample(X,y)&lt;br /&gt;
   Xsmote = pd.DataFrame(Xsmote)&lt;br /&gt;
   ysmote = pd.DataFrame(ysmote)&lt;br /&gt;
   X=Xsmote&lt;br /&gt;
   y=ysmote&lt;br /&gt;
&lt;br /&gt;
On remarque que la technique smote a ajouté 9322 lignes sur notre base, Maintenant que nous avons un équilibre entre les données ‘sains’ et ‘malsains’, nous pouvons voir la répartitions des points sur 2 axes :&lt;br /&gt;
&lt;br /&gt;
(image)&lt;br /&gt;
&lt;br /&gt;
Nous pouvons alors procéder à la séparation de nos données en données d'entraînement et de test&lt;br /&gt;
&lt;br /&gt;
Nous devons séparer en deux nos données pour pouvoir appliquer les algorithmes de machine learning, ainsi : &lt;br /&gt;
Les données d'entraînement serviront de repères pour l’algorithme&lt;br /&gt;
Les données de test seront entraînées par celle d’entrainement pour créer une prédiction&lt;br /&gt;
&lt;br /&gt;
Nous allons utiliser la fonction train_test_split de la librairie sklearn pour séparer nos données : &lt;br /&gt;
&lt;br /&gt;
   X_train, X_test, y_train, y_test = train_test_split(X,y, test_size = 0.2, random_state = 100)&lt;br /&gt;
&lt;br /&gt;
Ici dans les paramètres :&lt;br /&gt;
X  correspond aux features&lt;br /&gt;
y correspond à la target&lt;br /&gt;
test_size correspond au pourcentage de séparation (soit 0.2 = 20% test et 80% d'entraînement)&lt;br /&gt;
random_state permet d’initialiser le choix aléatoire pour avoir la même répartition à chaque exécution&lt;br /&gt;
&lt;br /&gt;
Maintenant nous pouvons appliquer les algorithme à notre modèle&lt;br /&gt;
&lt;br /&gt;
==Application des algorithmes==&lt;br /&gt;
&lt;br /&gt;
En général, nous allons appliquer les algorithme en suivant cet ordre : &lt;br /&gt;
* Importation de la méthode sur la librairie sklearn&lt;br /&gt;
* Entraînement des données&lt;br /&gt;
* Prédiction&lt;br /&gt;
* Méthodes d’évaluations&lt;br /&gt;
&lt;br /&gt;
===Régression linéaire===&lt;br /&gt;
&lt;br /&gt;
Nous allons commencer par le plus simple : la régression linéaire, nous commençons par importer l’algorithme à partir de la librairie sklearn : &amp;lt;code&amp;gt; from sklearn.linear_model import LinearRegression &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis nous appelons l’algorithme avec les paramètres de base, puis nous entraînons notre dataset : &lt;br /&gt;
   #Méthode de régréssion linéaire&lt;br /&gt;
   lr = LinearRegression()&lt;br /&gt;
   #Training&lt;br /&gt;
   lr.fit(X_train,y_train)&lt;br /&gt;
&lt;br /&gt;
Ensuite la prédiction : &lt;br /&gt;
   #Prediction&lt;br /&gt;
   y_pred = lr.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
Et enfin l'évaluation, nous avons vu 2 méthodes pour évaluer notre modèle : &lt;br /&gt;
* Afficher le score de prédiction&lt;br /&gt;
* Afficher la matrice de confusion, une matrice de taille 2x2 qui donne ces informations : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatrixConfusion.png]]&lt;br /&gt;
&lt;br /&gt;
Le score de prédiction (accuracy) est également calculé à partir de cette matrice&lt;br /&gt;
Pour la régression linéaire, nous allons qu’afficher le score de prédiction, car cet algorithme nous donne en retour des valeurs non-binaire, la construction d’une matrice de confusion et impossible.&lt;br /&gt;
&lt;br /&gt;
   #Evaluation&lt;br /&gt;
   print(lr.score(X_test,y_test))&lt;br /&gt;
&lt;br /&gt;
Nous obtenons ainsi un score de 0.48, un score qui est plus élevé sans la méthode SMOTE (0.14), sauf que cette méthode n’est pas la plus optimisée pour cette base de données, car nous avons en target des valeurs binaires. Il vaut mieux appliquer la méthode de régression logistique ou la méthode de Naives-Bayes.&lt;br /&gt;
&lt;br /&gt;
===Régression logistique===&lt;br /&gt;
&lt;br /&gt;
Dans le même modèle que la régression linéaire, nous procédons à l’import de la méthode, l’appel de la méthode, l'entraînement des données et de la prédiction :&lt;br /&gt;
&lt;br /&gt;
   from sklearn import linear_model&lt;br /&gt;
&lt;br /&gt;
   #Modèle régression logistique&lt;br /&gt;
   modele_regLog = linear_model.LogisticRegression() &lt;br /&gt;
   #random_state = 100, solver = 'liblinear', multi_class = 'auto'&lt;br /&gt;
&lt;br /&gt;
   #training&lt;br /&gt;
   modele_regLog.fit(X_train,y_train)&lt;br /&gt;
&lt;br /&gt;
   #prediction&lt;br /&gt;
   y_pred = modele_regLog.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
   #précision du modèle&lt;br /&gt;
   precision = modele_regLog.score(X_test,y_test)&lt;br /&gt;
   print(precision)&lt;br /&gt;
&lt;br /&gt;
Pour la régression logistique, nous allons afficher la matrice de confusion et le score :&lt;br /&gt;
&lt;br /&gt;
   from sklearn.metrics import plot_confusion_matrix&lt;br /&gt;
   plot_confusion_matrix(modele_regLog, X_test, y_test)  &lt;br /&gt;
   plt.show() &lt;br /&gt;
&lt;br /&gt;
(images)&lt;br /&gt;
&lt;br /&gt;
Nous obtenons un score de 0.82, contre 0.97 sans la méthode de SMOTE, ce qui est cohérent car le score obtenu sans SMOTE n’est pas précis car il y avait peu de données où la machine a planté. Avec SMOTE, nous obtenons certes un score moins élevé mais plus précis.&lt;br /&gt;
Grâce à la matrice de confusion nous pouvons voir que : &lt;br /&gt;
* Il y a 2396 fois où l’algorithme a prédit Machine failure = 0 et a eu raison&lt;br /&gt;
* Il y a 2377 fois où l’algorithme a prédit Machine failure = 1 et a eu raison&lt;br /&gt;
* Il y a 546 fois où l’algorithme a prédit Machine failure = 1 et a eu faux&lt;br /&gt;
* Il y a 478 fois où l’algorithme a prédit Machine failure = 0 et a eu faux&lt;br /&gt;
&lt;br /&gt;
=Recherche bibliographique=&lt;br /&gt;
&lt;br /&gt;
* https://www.wikipedia.com&lt;br /&gt;
&lt;br /&gt;
* https://www.jybaudot.fr&lt;br /&gt;
&lt;br /&gt;
* https://datascientest.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.ipgirl.com&lt;br /&gt;
&lt;br /&gt;
* Cours de probabilités et statistiques de l’Université Jules Vernes&lt;br /&gt;
&lt;br /&gt;
* Chaine youtube Machine Learning : https://www.youtube.com/channel/UCmpptkXu8iIFe6kfDK5o7VQ&lt;br /&gt;
&lt;br /&gt;
* Machine Learning with scikit-learn Quick Start Guide écrit par Kevin Jolly&lt;br /&gt;
&lt;br /&gt;
* https://lucidar.me/&lt;br /&gt;
&lt;br /&gt;
* https://archive.ics.uci.edu/ml/datasets.php&lt;br /&gt;
&lt;br /&gt;
* https://www.kaggle.com/datasets&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com/&lt;br /&gt;
&lt;br /&gt;
* Machine Learning algorithms - Second Edition écrit par Giuseppe Bonaccorso&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com&lt;br /&gt;
&lt;br /&gt;
* https://towardsdatascience.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.learndatasci.com/&lt;br /&gt;
&lt;br /&gt;
==Rapports et présentation==&lt;br /&gt;
&lt;br /&gt;
===Librairies===&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1CQZ1s6fNY_6MsmbBa5TP1OzSedqFeaWI?usp=sharing/ Rapport Numpy]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1tdu_B2wRsUiqdnSeskQENdn_wX3pJMeT?usp=sharing/ Rapport Pandas]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1DPS4ZT91SIEhscwST8kfER7u21tKoM3a?usp=sharing/ Rapport Seaborn]&lt;br /&gt;
&lt;br /&gt;
===Rapports===&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/document/d/1yR0vLePV3hI1_HVtTZWwGIwy0Cb-oLOsOTK3Um5KAYE/edit?usp=sharing/ Rapport]&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/presentation/d/1Je_yF0dgc-s9gB7LLsfOg0b05xcwIFJbaqpVytxWv5A/edit?usp=sharing/ Présentation]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1y_NMo9XKJ0WzwE2zmcRblUyuIebwfoN8?usp=sharing/ Régression linéaire]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1bRyrnL1JM870cEcEvfGaS8ItrG16rchy?usp=sharing/ Google Colab]&lt;/div&gt;</summary>
		<author><name>Abrossas</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88020</id>
		<title>IMA3/IMA4 2020/2022 P5</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88020"/>
				<updated>2022-02-09T15:46:49Z</updated>
		
		<summary type="html">&lt;p&gt;Abrossas : /*  Introduction et cahier des charges  */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 0px; padding: 20px; font-weight: bold; text-align: center; font-size: 80%; background: #61798F; vertical-align: top; width: 100%;&amp;quot;&amp;gt; '''PARTIE I (S6-S7)''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Introduction et cahier des charges''' &amp;lt;/div&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce projet est la mise en place d’algorithmes de machine Learning afin de diagnostiquer l’état de machines industrielles. Nous travaillerons sur ce projet durant 2 semestres. &lt;br /&gt;
Durant le premier semestre, nous avions comme objectifs d’acquérir la maîtrise des différentes librairies primordiales pour traiter les données en machine Learning, ainsi que d’étudier et d’utiliser certains algorithmes basiques (régression linéaire, logistique, Bayes) sur des datasets que nous traiterons nous même. &lt;br /&gt;
Pour ce qui est du second semestre, notre objectif était de concrétiser les connaissances acquises durant le premier semestre. Nous avons donc essayé de créer notre propre dataset à l’aide des matériels mis à notre disposition, de la prétraiter et d’y appliquer différents algorithmes de Machine Learning en critiquant les résultats.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning pour la détection de défaut s'inscrit parfaitement dans le contexte scientifique actuel, notamment grâce à l’industrie 4.0.&lt;br /&gt;
En effet, cette nouvelle industrie fait apparaître des systèmes communicants (l’IOT : Internet Of Things) interconnectés les uns entre les autres. Ces différents systèmes peuvent êtres nécessaires les uns, les autres afin de réaliser une tâche complexe telle que l'usinage de pièces. Le système devient dès lors potentiellement extrêmement fragile aux pannes.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning a pour but de pouvoir détecter, et localiser les pannes, voir les futures pannes potentielles afin de pouvoir dans un premier temps prévenir un opérateur. Mais il peut aussi potentiellement permettre au système de continuer de tourner, en attendant un technicien. Le machine Learning peut donc aussi permettre à une chaîne de production de continuer de tourner par l’envoie d’un autre robot par exemple, le temps que la panne soit réparée.&lt;br /&gt;
&lt;br /&gt;
Dans le schéma ci-dessous nous avons un exemple de système de système.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Intro1.png|500px|thumb|center|Schéma d'un système de systèmes]]&lt;br /&gt;
&lt;br /&gt;
Il y a deux cas de figure:&lt;br /&gt;
* Un autre système peut être envoyé pour remplacer le système 4.&lt;br /&gt;
* Les systèmes 1 et 2 peuvent permettre à la chaîne de production de continuer de tourner&lt;br /&gt;
* La chaîne de production est hors service jusqu'à réparation.&lt;br /&gt;
&lt;br /&gt;
==Cahier de charges==&lt;br /&gt;
&lt;br /&gt;
'''Ressources disponibles :'''&lt;br /&gt;
&lt;br /&gt;
* Livres sur le machine learning &lt;br /&gt;
* Bases de données (afin d'appliquer divers algorithmes de machine learning) que nous prendrons sur ces sites : [https://www.kaggle.com/datasets] et [https://archive.ics.uci.edu/ml/datasets.php]&lt;br /&gt;
* Librairies Python (Scikit-learn, Pandas, Numpy, Seaborn, Matplotlib)&lt;br /&gt;
* Google Colab&lt;br /&gt;
* Matlab (version étudiante)&lt;br /&gt;
&lt;br /&gt;
'''Objectifs poursuivis :'''&lt;br /&gt;
&lt;br /&gt;
* Détecter les dysfonctionnements de systèmes mécatroniques (par exemple les robots Khepera, Robotino…), grâce au machine learning.&lt;br /&gt;
* Apprendre à implémenter différentes méthodes machine learning .&lt;br /&gt;
&lt;br /&gt;
'''Profil du public cible :'''&lt;br /&gt;
* Secteur mécatronique&lt;br /&gt;
* Entreprises disposant d'ingénieurs pour maintenir le système informatique opérationnel&lt;br /&gt;
* Entreprises utilisant des machines dans le secteur public.&lt;br /&gt;
&lt;br /&gt;
'''Analyse des besoins :'''&lt;br /&gt;
* L’industrie a de plus en plus besoin du machine learning pour détecter les erreurs des systèmes. En effet, cette technologie devient indispensable pour les industriels, notamment afin d'accroître la productivité et l’efficacité des systèmes industriels.&lt;br /&gt;
* Le programme peut ne pas être aussi rapide et optimisé en espace mémoire que d'autres programmes, nous visons l’efficacité de notre algorithme plutôt que la rapidité.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Librairies''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
En Machine Learning, il est très important, voire primordial, de savoir manipuler les différentes librairies mises à notre disposition afin de visualiser, traiter nos différentes dataset ou même appliquer les différents algorithmes de machine Learning.&lt;br /&gt;
Durant les premières semaines de notre projet, nous avons donc appris à utiliser ces différentes librairies nécessaires pour le machine Learning, telles que Numpy, Seaborn, Panda, Matplotlib, Scikit-learn... Nous allons dans un premier temps nous intéresser à l'importation des différentes bibliothèques puis résumer les commandes importantes de ces différentes librairies.&lt;br /&gt;
&lt;br /&gt;
Ces différentes librairies ne sont pas incluses de base dans Python, il est donc nécessaire de les ajouter à Python puis à notre programme.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc choisi d'utiliser google colab car ces librairies y sont déjà installées (et aussi pratique pour travailler à plusieurs sur un même code).&lt;br /&gt;
Puis nous devons importer ces bibliothèques au début de notre programme.&lt;br /&gt;
&lt;br /&gt;
Attention : Plusieurs bibliothèques peuvent avoir la même commande mais avec des significations différentes, comme par exemple la commande randint du module numpy et celle du module random et cela peut conduire à des erreurs. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de pallier à ces problèmes nous apporterons nos librairie au début de nos programmes comme suit :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:librairies1.png]]&lt;br /&gt;
&lt;br /&gt;
Ici le np permet de dire que lorsque nous utilisons np.array alors nous utilisons la commande array () contenu dans la bibliothèque Numpy.&lt;br /&gt;
&lt;br /&gt;
Ceci nous permettra d’utiliser en simultané différentes librairies, toutes les bibliothèques seront importées selon ce schéma.&lt;br /&gt;
Nous allons par la suite, nous intéresser à différentes commandes incluses dans ces librairies.&lt;br /&gt;
&lt;br /&gt;
==Numpy==&lt;br /&gt;
&lt;br /&gt;
Numpy est une bibliothèque dédiée aux calculs mathématiques et à la gestion des listes (telles que des matrices).&lt;br /&gt;
Matplotlib, quant à lui, est dédié aux affichages graphiques de données.&lt;br /&gt;
Nous allons dans cette partie nous intéresser aux commandes principales de ces deux bibliothèques de python.&lt;br /&gt;
&lt;br /&gt;
Sous numpy, les tableaux sont des types array, ils définissent l'équivalent des tableaux statiques en langage C. La taille d’un tableau numpy ne peut donc pas être changée après leur création. &lt;br /&gt;
&lt;br /&gt;
Néanmoins grâce a Numpy nous pouvons simplement effectuer des tâches sur les tableaux comme en extraire un sous tableaux, et d’effectuer simplement les produits entre matrice, vecteur.&lt;br /&gt;
&lt;br /&gt;
Dans notre projet, nous utiliserons plus courament les fonctions : &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.shape&amp;lt;/FONT&amp;gt; permet d’obtenir la taille de la matrice sous forme d’un tuple, suffit de choisir le bon numéro&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.zeros&amp;lt;/FONT&amp;gt; permet de créer une ligne de x zéro(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.ones&amp;lt;/FONT&amp;gt; permet de créer une ligne de x un(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.vstack&amp;lt;/FONT&amp;gt; permet de rajouter des lignes dans une matrice déjà créer en paramètre&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.transpose&amp;lt;/FONT&amp;gt; permet de transposer une matrice en paramètre&lt;br /&gt;
&lt;br /&gt;
==Seaborn==&lt;br /&gt;
&lt;br /&gt;
Seaborn est une bibliothèque de visualisation de données Python basée sur matplotlib. Il fournit une interface de haut niveau pour dessiner des graphiques statistiques attrayants et informatifs.&lt;br /&gt;
&lt;br /&gt;
'''Différences entre Matplotlib et Seaborn'''&lt;br /&gt;
&lt;br /&gt;
Les défauts de Matplotlib qui ne parlent généralement pas aux utilisateurs sont les couleurs, les marques de tiques sur les axes supérieur et droit, le style,...&lt;br /&gt;
Les exemples ci-dessus rendent également une autre frustration des utilisateurs plus apparente: le fait que travailler avec DataFrames ne va pas aussi bien avec Matplotlib, ce qui peut être ennuyeux si vous faites une analyse exploratoire avec Pandas. Et c’est exactement ce que Seaborn adresse : les fonctions de traçage fonctionnent sur dataframes et tableaux qui contiennent tout un ensemble de données.&lt;br /&gt;
[[Fichier:seaborn1.png|300px|thumb|right|Résultat du code python ci gauche]]&lt;br /&gt;
&lt;br /&gt;
   # Import necessary libraries&lt;br /&gt;
   import seaborn as sns&lt;br /&gt;
   import matplotlib.pyplot as plt&lt;br /&gt;
   &lt;br /&gt;
   # Load iris data&lt;br /&gt;
   iris = sns.load_dataset(&amp;quot;iris&amp;quot;) #DATASET ALREADY EXISTING&lt;br /&gt;
   &lt;br /&gt;
   # Construct iris plot&lt;br /&gt;
   sns.swarmplot(x=&amp;quot;species&amp;quot;, y=&amp;quot;petal_length&amp;quot;, data=iris)&lt;br /&gt;
   &lt;br /&gt;
   # Show plot&lt;br /&gt;
   plt.show()&lt;br /&gt;
&lt;br /&gt;
==Pandas==&lt;br /&gt;
&lt;br /&gt;
Pandas est une API d'analyse de données orientée colonnes. C'est un excellent outil pour manipuler et analyser des données d'entrée. Beaucoup de frameworks d'apprentissage automatique acceptent les structures de données Pandas en entrée.&lt;br /&gt;
&lt;br /&gt;
Comme évoqué précédemment, Pandas travaille avec des matrices colonnes communément appelées ‘Series’ mais aussi et surtout avec des tableaux de données appelés ‘DataFrames’.&lt;br /&gt;
Une Series est tout simplement une colonne et une DataFrame est un tableau à plusieurs dimensions constitué de Series.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Panda.JPG]]&lt;br /&gt;
&lt;br /&gt;
A l'aide de Pandas, on peut ainsi créer, importer, lire et manipuler des bases de données facilement.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Théories des algorithmes étudiés''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Il y a différents types d’algorithmes en machine learning, pour notre sujet qui consiste à classer des machines en défectueuse ou fonctionnelles (1 ou 0), nous aurons surtout besoin d’algorithmes de classification binaire. De manière générale, la conception de la plupart des algorithmes fonctionnent de cette manière : &lt;br /&gt;
&lt;br /&gt;
* Élaborer un modèle &lt;br /&gt;
* Établir une fonction coût pour celui-ci correspondant à l’erreur entre le modèle et les données réelles&lt;br /&gt;
* Trouver un algorithme de minimisation de cette fonction coût&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression linéaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression1.png|200px|thumb|right|Exemple de régression linéaire]]&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est un algorithme de prédiction et non un algorithme de classification, nous aurons surtout besoin de ce deuxième type d’algorithme pour notre projet mais nous tenons à présenter cet algorithme qui est le plus basique en machine learning et un bon début pour une formation pédagogique.&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est une méthode de modélisation qui cherche à établir une relation linéaire entre une ou des &amp;quot;features&amp;quot; (variables explicatives) et une &amp;quot;target&amp;quot; (variable expliquée qu'on cherche à prévoir à partir des variables explicatives). En machine learning, la régression linéaire est un modèle d'apprentissage supervisé, c'est-à-dire qu'on apprend à l'algorithme de prédiction à partir d'exemples dont on dispose dans une dataset. Nous nous intéresserons à la régression affine qui est la plus simple pour débuter.&lt;br /&gt;
&lt;br /&gt;
===Modèle et estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
La régression affine consiste donc à trouver un modèle de type&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt;y=ax+b&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
avec x une &amp;quot;feature&amp;quot;, y la target et avec a et b des paramètres qu'il nous faudra déterminer. Le but est donc de trouver les paramètres a et b tels que la distance entre chaque point du nuage et la droite du modèle soit la plus petite possible.&lt;br /&gt;
Mathématiquement, il suffit de résoudre cette formule:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression2.png|200px|thumb|right|Méthode des moindres carrés illustrée]]&lt;br /&gt;
[[Fichier:regression3.png]]&lt;br /&gt;
&lt;br /&gt;
On utilise donc la méthode des moindres carrés pour mesurer l'erreur entre le modèle de prédiction et les données et ainsi fabriquer notre fonction coût :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression4.png]]&lt;br /&gt;
&lt;br /&gt;
avec m le nombre de points du nuage.&lt;br /&gt;
&lt;br /&gt;
L'objectif de l'algorithme est donc de trouver les paramètres optimaux qui minimisent cette fonction J.&lt;br /&gt;
En machine learning, une des méthodes les plus populaires pour faire ceci est la descente de gradient, car c'est une méthode adaptée quand on fait du traitement de grosses dataset (&amp;quot;faible&amp;quot; temps de calcul). En effet, la fonction coût J est une parabole admettant un unique minimum dépendant des paramètres a et b. La descente de gradient consiste à chercher le point de celle-ci où la dérivée est nulle (donc le minimum)&lt;br /&gt;
&lt;br /&gt;
===Méthode de la descente du gradient===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression6.png|200px|thumb|right|Méthode gradient]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression7.png|200px|thumb|right|Généralisation gradient fct parabolique]]&lt;br /&gt;
&lt;br /&gt;
Soit une fonction parabolique ne dépendant que de x. On cherche à trouver le minimum de cette fonction en utilisant la méthode de la descente du gradient&lt;br /&gt;
Pour cela on choisit un point aléatoirement &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;et on va descendre à partir de celui-ci jusqu'à atteindre un minimum en utilisant&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression5.png]]&lt;br /&gt;
&lt;br /&gt;
avec un paramètre  qui influencera la taille du pas de la descente.&lt;br /&gt;
&lt;br /&gt;
Il faut faire attention à ne pas prendre un pas trop grand, ni trop petit, pour éviter de &amp;quot;tourner&amp;quot; autour du minimum ou de prendre trop de temps pour l'atteindre.&lt;br /&gt;
Note : On peut généraliser cela pour une fonction parabolique à n paramètres qui aurait donc une forme de bol.&lt;br /&gt;
&lt;br /&gt;
===Application sur notre fonction coût===&lt;br /&gt;
&lt;br /&gt;
Notre fonction coût dépend des 2 paramètres a et b :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression8.png]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression9.png]]&lt;br /&gt;
&lt;br /&gt;
On choisit &amp;lt;math&amp;gt;a_0&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; aléatoirement et on applique ceci pour un pas :&lt;br /&gt;
&lt;br /&gt;
Avec &lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression10.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d'un certain nombre d'itérations on trouve le couple &amp;lt;math&amp;gt;(a,b)&amp;lt;/math&amp;gt; qui minimise notre fonction coût.&lt;br /&gt;
&lt;br /&gt;
Note : Nous avons démontré la théorie de la régression linéaire affine mais on pourrait généraliser celle-ci pour un modèle polynomiale d’ordre n, la courbe de prédiction serait donc parabolique et il faudrait trouver le tuple &amp;lt;math&amp;gt;(a_1,a_2,...,a_n)&amp;lt;/math&amp;gt; qui minimise la fonction coût.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression logistique binaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo1.png|200px|thumb|right|Modèle régression logistique]]&lt;br /&gt;
&lt;br /&gt;
La régression logistique binaire est un algorithme de classification, contrairement à la régression linéaire qui est un algorithme de prédiction. De la même façon que la régression linéaire,  il s'agit de modéliser au mieux un modèle mathématique simple à des observations réelles nombreuses. Cette méthode se base sur de l’analyse mathématiques et statistique. Il faut donc associer à des “features” &amp;lt;math&amp;gt;(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; une variable Y valant 1 ou 0 (d’où le terme classification binaire).&lt;br /&gt;
&lt;br /&gt;
L’objectif de l’algorithme est donc de trouver la fonction F dépendant d’une loi de probabilité telle que :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo2.png]]&lt;br /&gt;
&lt;br /&gt;
avec S un certain seuil (fixé la plupart du temps à 0,5).&lt;br /&gt;
&lt;br /&gt;
===Modèle===&lt;br /&gt;
&lt;br /&gt;
Comme cette méthode repose principalement sur des statistiques, il est important d’adopter une notation explicite lors de l’explication théorique :&lt;br /&gt;
&lt;br /&gt;
* On notera Y la variable à prédire (qui vaudra 0 ou 1) et &amp;lt;math&amp;gt;X=(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; les variables permettant de prédire Y&lt;br /&gt;
* On travaillera dans un univers  de N échantillons (taille de la dataset)&lt;br /&gt;
* On notera &amp;lt;math&amp;gt;P(Y=1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;P(Y=0)&amp;lt;/math&amp;gt; les probabilités que Y valent respectivement 1 ou 0 &amp;lt;math&amp;gt;p(1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0)&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;p(X|1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(X|0)&amp;lt;/math&amp;gt; sont les distributions conditionnelles des caractéristiques X sachant la valeur prise par Y&lt;br /&gt;
* &amp;lt;math&amp;gt;p(1|X)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0|X)&amp;lt;/math&amp;gt; sont donc les probabilités d’obtenir la valeur de Y (1 ou 0) sachant les valeurs de X&lt;br /&gt;
&lt;br /&gt;
La régression logistique utilise l’hypothèse fondamentale (mesure de l’évidence) :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo3.png]]&lt;br /&gt;
&lt;br /&gt;
On en déduit donc (comme &amp;lt;math&amp;gt;p(0|X)=1-p(1|X))&amp;lt;/math&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo4.png]]&lt;br /&gt;
&lt;br /&gt;
Avec &amp;lt;math&amp;gt;(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; des variables à déterminer.&lt;br /&gt;
&lt;br /&gt;
''Note :'' ce modèle est appelé modèle LOGIT.&lt;br /&gt;
&lt;br /&gt;
===Estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
Contrairement à la régression linéaire affine, on ne peut pas utiliser la méthode des moindres carrés, on utilise alors la méthode de maximisation de la vraisemblance.&lt;br /&gt;
“La vraisemblance mesure une adéquation entre la distribution observée sur un échantillon aléatoire et une loi de probabilité supposée décrire une réalité sur la population dont l'échantillon est issu.” (source : [www.jybaudot.fr])&lt;br /&gt;
&lt;br /&gt;
Le calcul de la vraisemblance L dans un univers  de N échantillons est le suivant :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo5.png]]&lt;br /&gt;
&lt;br /&gt;
Plus la vraisemblance est élevée, alors plus la loi de probabilité est proche de la réalité. Le but est donc de maximiser cette valeur et de trouver les valeurs optimales de &amp;lt;math&amp;gt;A =(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; qui influent directement sur la loi de probabilité établie dans la partie modèle.&lt;br /&gt;
&lt;br /&gt;
===Algorithme d'optimisation===&lt;br /&gt;
&lt;br /&gt;
Afin de trouver la valeur optimale du vecteur A, nous utiliserons encore une fois la méthode de descente du gradient adaptée à notre cas.&lt;br /&gt;
&lt;br /&gt;
Celle-ci utilise la relation suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo6.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d’un certain nombre d’itérations, on trouvera la valeur optimale de A afin de maximiser la vraisemblance.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #ffd700; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Mise en pratique''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Pour la mise en pratique, nous avons décidé d’appliquer les méthodes sur un dataset de prédiction de maintenance pour l’industrie, nous importons grâce à la librairie panda : &amp;lt;code&amp;gt; dataset = pd.read_csv('ai4i2020.csv') &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette dataset contient 14 colonnes de données, nous pouvons visualiser la proportion de données saines et non-saines par ce code seaborn : &amp;lt;code&amp;gt; sns.factorplot('Machine failure',data=dataset,kind='count') &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on traitera cette dataset pour la préparer sur l’intervention des modèles de machine learning, puis on appliquera ces méthodes.&lt;br /&gt;
&lt;br /&gt;
==Pré-traitement de la dataset==&lt;br /&gt;
&lt;br /&gt;
Avant d’appliquer les algorithme sur notre dataset, il faut la traiter, le traitement sera le même pour tous les algorithmes et suivra cet ordre :&lt;br /&gt;
* Traitement des valeurs manquantes&lt;br /&gt;
* Équilibrage des données&lt;br /&gt;
* Séparations des données en entrainement et test&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous devons regarder si notre base de données contient des valeurs manquante, pour cela nous implantons ce code : &lt;br /&gt;
&lt;br /&gt;
   import missingno as msno&lt;br /&gt;
   msno.matrix(dataset)&lt;br /&gt;
&lt;br /&gt;
Les lignes blanches dans le résultat correspond aux valeurs manquantes, ci-dessous nous voyons que nous avons aucune données manquantes dans la base que nous avons importer : [[Fichier:Miseenpratique.png]]&lt;br /&gt;
&lt;br /&gt;
Dans le cas, où nous avons des valeurs manquante, il y a plusieurs méthodes pour traiter les valeurs manquantes mais nous retenons 2 méthodes :&lt;br /&gt;
* Une méthode qui consiste à supprimer les lignes où des valeurs manquantes sont présentes : &amp;lt;code&amp;gt; data.dropna(inplace=True) &amp;lt;/code&amp;gt;&lt;br /&gt;
L’avantage de cette méthode est de créer un modèle robuste. L’inconvénient majeur est le fait qu’on peut perdre énormément de données, pour des données où les valeurs manquantes sont excessives, mieux vaut appliquer une autre méthode.&lt;br /&gt;
&lt;br /&gt;
* Une méthode qui consiste à remplacer les valeurs manquantes par la moyenne des données de la colonne : &amp;lt;code&amp;gt; data[0]=drop[0].replace(np.NaN,data[0].mean()) &amp;lt;/code&amp;gt; L’avantage de cette méthode permet d’éviter la suppression de lignes, ce qui permet de garder les autres données comparé à l’autre méthode. Cependant cette méthode n’est que applicable sur les données numériques&lt;br /&gt;
&lt;br /&gt;
Nous passons alors sur l'équilibrage des données. Avant d’appliquer la méthode SMOTE, nous devons mettre dans 2 variables, la target (y) et les features (X) :&lt;br /&gt;
&lt;br /&gt;
   X = dataset.drop(['Machine failure','UDI','Product ID','Type','TWF','HDF','PWF','OSF','RNF'],axis=1).values&lt;br /&gt;
   y = dataset['Machine failure']&lt;br /&gt;
&lt;br /&gt;
Notre target sera seulement ‘Machine failure’ et nos features seront : la température de l’air, la température du processus, le couple, et l’usure des outils.&lt;br /&gt;
&lt;br /&gt;
Durant notre projet , nous avons implémenté la technique SMOTE pour traiter les ensembles de données déséquilibrées.&lt;br /&gt;
Le principe de SMOTE est de générer de nouveaux échantillons en combinant les données de la classe minoritaire avec celles de leurs voisins proches. Techniquement, on peut décomposer SMOTE en 5 étapes :&lt;br /&gt;
* 1 - Choix d’un vecteur caractéristique de notre classe minoritaire que nous appellerons vc &lt;br /&gt;
* 2 - Sélection des k-voisins les plus proches (k=5 par défaut) et choix de l’un d’eux au hasard que l’on appellera pv &lt;br /&gt;
* 3 - Calcul de la différence pour chaque valeur caractéristique (feature value) i, vc[i]-pv[i] et multiplication de celle-ci par un nombre aléatoire entre [0,1]&lt;br /&gt;
* 4 - Ajout du résultat précédent à la valeur de la caractéristique i du vecteur vc afin d’obtenir un nouveau point (une nouvelle donnée) dans l’espace des caractéristiques &lt;br /&gt;
* 5 - Répétition de ces opérations pour chaque point de données de la classe minoritaire &lt;br /&gt;
Nous remarquons que cette technique marche après smote (50% données saines, 50% données non-saines)&lt;br /&gt;
&lt;br /&gt;
Code : &lt;br /&gt;
&lt;br /&gt;
   oversample = SMOTE()&lt;br /&gt;
   Xsmote, ysmote = oversample.fit_resample(X,y)&lt;br /&gt;
   Xsmote = pd.DataFrame(Xsmote)&lt;br /&gt;
   ysmote = pd.DataFrame(ysmote)&lt;br /&gt;
   X=Xsmote&lt;br /&gt;
   y=ysmote&lt;br /&gt;
&lt;br /&gt;
On remarque que la technique smote a ajouté 9322 lignes sur notre base, Maintenant que nous avons un équilibre entre les données ‘sains’ et ‘malsains’, nous pouvons voir la répartitions des points sur 2 axes :&lt;br /&gt;
&lt;br /&gt;
(image)&lt;br /&gt;
&lt;br /&gt;
Nous pouvons alors procéder à la séparation de nos données en données d'entraînement et de test&lt;br /&gt;
&lt;br /&gt;
Nous devons séparer en deux nos données pour pouvoir appliquer les algorithmes de machine learning, ainsi : &lt;br /&gt;
Les données d'entraînement serviront de repères pour l’algorithme&lt;br /&gt;
Les données de test seront entraînées par celle d’entrainement pour créer une prédiction&lt;br /&gt;
&lt;br /&gt;
Nous allons utiliser la fonction train_test_split de la librairie sklearn pour séparer nos données : &lt;br /&gt;
&lt;br /&gt;
   X_train, X_test, y_train, y_test = train_test_split(X,y, test_size = 0.2, random_state = 100)&lt;br /&gt;
&lt;br /&gt;
Ici dans les paramètres :&lt;br /&gt;
X  correspond aux features&lt;br /&gt;
y correspond à la target&lt;br /&gt;
test_size correspond au pourcentage de séparation (soit 0.2 = 20% test et 80% d'entraînement)&lt;br /&gt;
random_state permet d’initialiser le choix aléatoire pour avoir la même répartition à chaque exécution&lt;br /&gt;
&lt;br /&gt;
Maintenant nous pouvons appliquer les algorithme à notre modèle&lt;br /&gt;
&lt;br /&gt;
==Application des algorithmes==&lt;br /&gt;
&lt;br /&gt;
En général, nous allons appliquer les algorithme en suivant cet ordre : &lt;br /&gt;
* Importation de la méthode sur la librairie sklearn&lt;br /&gt;
* Entraînement des données&lt;br /&gt;
* Prédiction&lt;br /&gt;
* Méthodes d’évaluations&lt;br /&gt;
&lt;br /&gt;
===Régression linéaire===&lt;br /&gt;
&lt;br /&gt;
Nous allons commencer par le plus simple : la régression linéaire, nous commençons par importer l’algorithme à partir de la librairie sklearn : &amp;lt;code&amp;gt; from sklearn.linear_model import LinearRegression &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis nous appelons l’algorithme avec les paramètres de base, puis nous entraînons notre dataset : &lt;br /&gt;
   #Méthode de régréssion linéaire&lt;br /&gt;
   lr = LinearRegression()&lt;br /&gt;
   #Training&lt;br /&gt;
   lr.fit(X_train,y_train)&lt;br /&gt;
&lt;br /&gt;
Ensuite la prédiction : &lt;br /&gt;
   #Prediction&lt;br /&gt;
   y_pred = lr.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
Et enfin l'évaluation, nous avons vu 2 méthodes pour évaluer notre modèle : &lt;br /&gt;
* Afficher le score de prédiction&lt;br /&gt;
* Afficher la matrice de confusion, une matrice de taille 2x2 qui donne ces informations : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:MatrixConfusion.png]]&lt;br /&gt;
&lt;br /&gt;
Le score de prédiction (accuracy) est également calculé à partir de cette matrice&lt;br /&gt;
Pour la régression linéaire, nous allons qu’afficher le score de prédiction, car cet algorithme nous donne en retour des valeurs non-binaire, la construction d’une matrice de confusion et impossible.&lt;br /&gt;
&lt;br /&gt;
   #Evaluation&lt;br /&gt;
   print(lr.score(X_test,y_test))&lt;br /&gt;
&lt;br /&gt;
Nous obtenons ainsi un score de 0.48, un score qui est plus élevé sans la méthode SMOTE (0.14), sauf que cette méthode n’est pas la plus optimisée pour cette base de données, car nous avons en target des valeurs binaires. Il vaut mieux appliquer la méthode de régression logistique ou la méthode de Naives-Bayes.&lt;br /&gt;
&lt;br /&gt;
===Régression logistique===&lt;br /&gt;
&lt;br /&gt;
Dans le même modèle que la régression linéaire, nous procédons à l’import de la méthode, l’appel de la méthode, l'entraînement des données et de la prédiction :&lt;br /&gt;
&lt;br /&gt;
   from sklearn import linear_model&lt;br /&gt;
&lt;br /&gt;
   #Modèle régression logistique&lt;br /&gt;
   modele_regLog = linear_model.LogisticRegression() &lt;br /&gt;
   #random_state = 100, solver = 'liblinear', multi_class = 'auto'&lt;br /&gt;
&lt;br /&gt;
   #training&lt;br /&gt;
   modele_regLog.fit(X_train,y_train)&lt;br /&gt;
&lt;br /&gt;
   #prediction&lt;br /&gt;
   y_pred = modele_regLog.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
   #précision du modèle&lt;br /&gt;
   precision = modele_regLog.score(X_test,y_test)&lt;br /&gt;
   print(precision)&lt;br /&gt;
&lt;br /&gt;
Pour la régression logistique, nous allons afficher la matrice de confusion et le score :&lt;br /&gt;
&lt;br /&gt;
   from sklearn.metrics import plot_confusion_matrix&lt;br /&gt;
   plot_confusion_matrix(modele_regLog, X_test, y_test)  &lt;br /&gt;
   plt.show() &lt;br /&gt;
&lt;br /&gt;
(images)&lt;br /&gt;
&lt;br /&gt;
Nous obtenons un score de 0.82, contre 0.97 sans la méthode de SMOTE, ce qui est cohérent car le score obtenu sans SMOTE n’est pas précis car il y avait peu de données où la machine a planté. Avec SMOTE, nous obtenons certes un score moins élevé mais plus précis.&lt;br /&gt;
Grâce à la matrice de confusion nous pouvons voir que : &lt;br /&gt;
* Il y a 2396 fois où l’algorithme a prédit Machine failure = 0 et a eu raison&lt;br /&gt;
* Il y a 2377 fois où l’algorithme a prédit Machine failure = 1 et a eu raison&lt;br /&gt;
* Il y a 546 fois où l’algorithme a prédit Machine failure = 1 et a eu faux&lt;br /&gt;
* Il y a 478 fois où l’algorithme a prédit Machine failure = 0 et a eu faux&lt;br /&gt;
&lt;br /&gt;
=Recherche bibliographique=&lt;br /&gt;
&lt;br /&gt;
* https://www.wikipedia.com&lt;br /&gt;
&lt;br /&gt;
* https://www.jybaudot.fr&lt;br /&gt;
&lt;br /&gt;
* https://datascientest.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.ipgirl.com&lt;br /&gt;
&lt;br /&gt;
* Cours de probabilités et statistiques de l’Université Jules Vernes&lt;br /&gt;
&lt;br /&gt;
* Chaine youtube Machine Learning : https://www.youtube.com/channel/UCmpptkXu8iIFe6kfDK5o7VQ&lt;br /&gt;
&lt;br /&gt;
* Machine Learning with scikit-learn Quick Start Guide écrit par Kevin Jolly&lt;br /&gt;
&lt;br /&gt;
* https://lucidar.me/&lt;br /&gt;
&lt;br /&gt;
* https://archive.ics.uci.edu/ml/datasets.php&lt;br /&gt;
&lt;br /&gt;
* https://www.kaggle.com/datasets&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com/&lt;br /&gt;
&lt;br /&gt;
* Machine Learning algorithms - Second Edition écrit par Giuseppe Bonaccorso&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com&lt;br /&gt;
&lt;br /&gt;
* https://towardsdatascience.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.learndatasci.com/&lt;br /&gt;
&lt;br /&gt;
==Rapports et présentation==&lt;br /&gt;
&lt;br /&gt;
===Librairies===&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1CQZ1s6fNY_6MsmbBa5TP1OzSedqFeaWI?usp=sharing/ Rapport Numpy]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1tdu_B2wRsUiqdnSeskQENdn_wX3pJMeT?usp=sharing/ Rapport Pandas]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1DPS4ZT91SIEhscwST8kfER7u21tKoM3a?usp=sharing/ Rapport Seaborn]&lt;br /&gt;
&lt;br /&gt;
===Rapports===&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/document/d/1yR0vLePV3hI1_HVtTZWwGIwy0Cb-oLOsOTK3Um5KAYE/edit?usp=sharing/ Rapport]&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/presentation/d/1Je_yF0dgc-s9gB7LLsfOg0b05xcwIFJbaqpVytxWv5A/edit?usp=sharing/ Présentation]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1y_NMo9XKJ0WzwE2zmcRblUyuIebwfoN8?usp=sharing/ Régression linéaire]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1bRyrnL1JM870cEcEvfGaS8ItrG16rchy?usp=sharing/ Google Colab]&lt;/div&gt;</summary>
		<author><name>Abrossas</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88009</id>
		<title>IMA3/IMA4 2020/2022 P5</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88009"/>
				<updated>2022-02-02T14:56:03Z</updated>
		
		<summary type="html">&lt;p&gt;Abrossas : /* Pandas */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #C2E5FF; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Introduction et cahier des charges''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce projet est la mise en place d’algorithmes de machine Learning afin de diagnostiquer l’état de machines industrielles. Nous travaillerons sur ce projet durant 2 semestres. &lt;br /&gt;
Durant le premier semestre, nous avions comme objectifs d’acquérir la maîtrise des différentes librairies primordiales pour traiter les données en machine Learning, ainsi que d’étudier et d’utiliser certains algorithmes basiques (régression linéaire, logistique, Bayes) sur des datasets que nous traiterons nous même. &lt;br /&gt;
Pour ce qui est du second semestre, notre objectif était de concrétiser les connaissances acquises durant le premier semestre. Nous avons donc essayé de créer notre propre dataset à l’aide des matériels mis à notre disposition, de la prétraiter et d’y appliquer différents algorithmes de Machine Learning en critiquant les résultats.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning pour la détection de défaut s'inscrit parfaitement dans le contexte scientifique actuel, notamment grâce à l’industrie 4.0.&lt;br /&gt;
En effet, cette nouvelle industrie fait apparaître des systèmes communicants (l’IOT : Internet Of Things) interconnectés les uns entre les autres. Ces différents systèmes peuvent êtres nécessaires les uns, les autres afin de réaliser une tâche complexe telle que l'usinage de pièces. Le système devient dès lors potentiellement extrêmement fragile aux pannes.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning a pour but de pouvoir détecter, et localiser les pannes, voir les futures pannes potentielles afin de pouvoir dans un premier temps prévenir un opérateur. Mais il peut aussi potentiellement permettre au système de continuer de tourner, en attendant un technicien. Le machine Learning peut donc aussi permettre à une chaîne de production de continuer de tourner par l’envoie d’un autre robot par exemple, le temps que la panne soit réparée.&lt;br /&gt;
&lt;br /&gt;
Dans le schéma ci-dessous nous avons un exemple de système de système.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Intro1.png|500px|thumb|center|Schéma d'un système de systèmes]]&lt;br /&gt;
&lt;br /&gt;
Il y a deux cas de figure:&lt;br /&gt;
* Un autre système peut être envoyé pour remplacer le système 4.&lt;br /&gt;
* Les systèmes 1 et 2 peuvent permettre à la chaîne de production de continuer de tourner&lt;br /&gt;
* La chaîne de production est hors service jusqu'à réparation.&lt;br /&gt;
&lt;br /&gt;
==Cahier de charges==&lt;br /&gt;
&lt;br /&gt;
'''Ressources disponibles :'''&lt;br /&gt;
&lt;br /&gt;
* Livres sur le machine learning &lt;br /&gt;
* Bases de données (afin d'appliquer divers algorithmes de machine learning) que nous prendrons sur ces sites : [https://www.kaggle.com/datasets] et [https://archive.ics.uci.edu/ml/datasets.php]&lt;br /&gt;
* Librairies Python (Scikit-learn, Pandas, Numpy, Seaborn, Matplotlib)&lt;br /&gt;
* Google Colab&lt;br /&gt;
* Matlab (version étudiante)&lt;br /&gt;
&lt;br /&gt;
'''Objectifs poursuivis :'''&lt;br /&gt;
&lt;br /&gt;
* Détecter les dysfonctionnements de systèmes mécatroniques (par exemple les robots Khepera, Robotino…), grâce au machine learning.&lt;br /&gt;
* Apprendre à implémenter différentes méthodes machine learning .&lt;br /&gt;
&lt;br /&gt;
'''Profil du public cible :'''&lt;br /&gt;
* Secteur mécatronique&lt;br /&gt;
* Entreprises disposant d'ingénieurs pour maintenir le système informatique opérationnel&lt;br /&gt;
* Entreprises utilisant des machines dans le secteur public.&lt;br /&gt;
&lt;br /&gt;
'''Analyse des besoins :'''&lt;br /&gt;
* L’industrie a de plus en plus besoin du machine learning pour détecter les erreurs des systèmes. En effet, cette technologie devient indispensable pour les industriels, notamment afin d'accroître la productivité et l’efficacité des systèmes industriels.&lt;br /&gt;
* Le programme peut ne pas être aussi rapide et optimisé en espace mémoire que d'autres programmes, nous visons l’efficacité de notre algorithme plutôt que la rapidité.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #C2E5FF; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Librairies''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
En Machine Learning, il est très important, voire primordial, de savoir manipuler les différentes librairies mises à notre disposition afin de visualiser, traiter nos différentes dataset ou même appliquer les différents algorithmes de machine Learning.&lt;br /&gt;
Durant les premières semaines de notre projet, nous avons donc appris à utiliser ces différentes librairies nécessaires pour le machine Learning, telles que Numpy, Seaborn, Panda, Matplotlib, Scikit-learn... Nous allons dans un premier temps nous intéresser à l'importation des différentes bibliothèques puis résumer les commandes importantes de ces différentes librairies.&lt;br /&gt;
&lt;br /&gt;
Ces différentes librairies ne sont pas incluses de base dans Python, il est donc nécessaire de les ajouter à Python puis à notre programme.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc choisi d'utiliser google colab car ces librairies y sont déjà installées (et aussi pratique pour travailler à plusieurs sur un même code).&lt;br /&gt;
Puis nous devons importer ces bibliothèques au début de notre programme.&lt;br /&gt;
&lt;br /&gt;
Attention : Plusieurs bibliothèques peuvent avoir la même commande mais avec des significations différentes, comme par exemple la commande randint du module numpy et celle du module random et cela peut conduire à des erreurs. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de pallier à ces problèmes nous apporterons nos librairie au début de nos programmes comme suit :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:librairies1.png]]&lt;br /&gt;
&lt;br /&gt;
Ici le np permet de dire que lorsque nous utilisons np.array alors nous utilisons la commande array () contenu dans la bibliothèque Numpy.&lt;br /&gt;
&lt;br /&gt;
Ceci nous permettra d’utiliser en simultané différentes librairies, toutes les bibliothèques seront importées selon ce schéma.&lt;br /&gt;
Nous allons par la suite, nous intéresser à différentes commandes incluses dans ces librairies.&lt;br /&gt;
&lt;br /&gt;
==Numpy==&lt;br /&gt;
&lt;br /&gt;
Numpy est une bibliothèque dédiée aux calculs mathématiques et à la gestion des listes (telles que des matrices).&lt;br /&gt;
Matplotlib, quant à lui, est dédié aux affichages graphiques de données.&lt;br /&gt;
Nous allons dans cette partie nous intéresser aux commandes principales de ces deux bibliothèques de python.&lt;br /&gt;
&lt;br /&gt;
Sous numpy, les tableaux sont des types array, ils définissent l'équivalent des tableaux statiques en langage C. La taille d’un tableau numpy ne peut donc pas être changée après leur création. &lt;br /&gt;
&lt;br /&gt;
Néanmoins grâce a Numpy nous pouvons simplement effectuer des tâches sur les tableaux comme en extraire un sous tableaux, et d’effectuer simplement les produits entre matrice, vecteur.&lt;br /&gt;
&lt;br /&gt;
Dans notre projet, nous utiliserons plus courament les fonctions : &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.shape&amp;lt;/FONT&amp;gt; permet d’obtenir la taille de la matrice sous forme d’un tuple, suffit de choisir le bon numéro&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.zeros&amp;lt;/FONT&amp;gt; permet de créer une ligne de x zéro(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.ones&amp;lt;/FONT&amp;gt; permet de créer une ligne de x un(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.vstack&amp;lt;/FONT&amp;gt; permet de rajouter des lignes dans une matrice déjà créer en paramètre&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.transpose&amp;lt;/FONT&amp;gt; permet de transposer une matrice en paramètre&lt;br /&gt;
&lt;br /&gt;
==Seaborn==&lt;br /&gt;
&lt;br /&gt;
Seaborn est une bibliothèque de visualisation de données Python basée sur matplotlib. Il fournit une interface de haut niveau pour dessiner des graphiques statistiques attrayants et informatifs.&lt;br /&gt;
&lt;br /&gt;
'''Différences entre Matplotlib et Seaborn'''&lt;br /&gt;
&lt;br /&gt;
Les défauts de Matplotlib qui ne parlent généralement pas aux utilisateurs sont les couleurs, les marques de tiques sur les axes supérieur et droit, le style,...&lt;br /&gt;
Les exemples ci-dessus rendent également une autre frustration des utilisateurs plus apparente: le fait que travailler avec DataFrames ne va pas aussi bien avec Matplotlib, ce qui peut être ennuyeux si vous faites une analyse exploratoire avec Pandas. Et c’est exactement ce que Seaborn adresse : les fonctions de traçage fonctionnent sur dataframes et tableaux qui contiennent tout un ensemble de données.&lt;br /&gt;
[[Fichier:seaborn1.png|300px|thumb|right|Résultat du code python ci gauche]]&lt;br /&gt;
&lt;br /&gt;
   # Import necessary libraries&lt;br /&gt;
   import seaborn as sns&lt;br /&gt;
   import matplotlib.pyplot as plt&lt;br /&gt;
   &lt;br /&gt;
   # Load iris data&lt;br /&gt;
   iris = sns.load_dataset(&amp;quot;iris&amp;quot;) #DATASET ALREADY EXISTING&lt;br /&gt;
   &lt;br /&gt;
   # Construct iris plot&lt;br /&gt;
   sns.swarmplot(x=&amp;quot;species&amp;quot;, y=&amp;quot;petal_length&amp;quot;, data=iris)&lt;br /&gt;
   &lt;br /&gt;
   # Show plot&lt;br /&gt;
   plt.show()&lt;br /&gt;
&lt;br /&gt;
==Pandas==&lt;br /&gt;
&lt;br /&gt;
Pandas est une API d'analyse de données orientée colonnes. C'est un excellent outil pour manipuler et analyser des données d'entrée. Beaucoup de frameworks d'apprentissage automatique acceptent les structures de données Pandas en entrée.&lt;br /&gt;
&lt;br /&gt;
Comme évoqué précédemment, Pandas travaille avec des matrices colonnes communément appelées ‘Series’ mais aussi et surtout avec des tableaux de données appelés ‘DataFrames’.&lt;br /&gt;
Une Series est tout simplement une colonne et une DataFrame est un tableau à plusieurs dimensions constitué de Series.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Panda.JPG]]&lt;br /&gt;
&lt;br /&gt;
A l'aide de Pandas, on peut ainsi créer, importer, lire et manipuler des bases de données facilement.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #C2E5FF; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Théories des algorithmes étudiés''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Il y a différents types d’algorithmes en machine learning, pour notre sujet qui consiste à classer des machines en défectueuse ou fonctionnelles (1 ou 0), nous aurons surtout besoin d’algorithmes de classification binaire. De manière générale, la conception de la plupart des algorithmes fonctionnent de cette manière : &lt;br /&gt;
&lt;br /&gt;
* Élaborer un modèle &lt;br /&gt;
* Établir une fonction coût pour celui-ci correspondant à l’erreur entre le modèle et les données réelles&lt;br /&gt;
* Trouver un algorithme de minimisation de cette fonction coût&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression linéaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression1.png|200px|thumb|right|Exemple de régression linéaire]]&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est un algorithme de prédiction et non un algorithme de classification, nous aurons surtout besoin de ce deuxième type d’algorithme pour notre projet mais nous tenons à présenter cet algorithme qui est le plus basique en machine learning et un bon début pour une formation pédagogique.&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est une méthode de modélisation qui cherche à établir une relation linéaire entre une ou des &amp;quot;features&amp;quot; (variables explicatives) et une &amp;quot;target&amp;quot; (variable expliquée qu'on cherche à prévoir à partir des variables explicatives). En machine learning, la régression linéaire est un modèle d'apprentissage supervisé, c'est-à-dire qu'on apprend à l'algorithme de prédiction à partir d'exemples dont on dispose dans une dataset. Nous nous intéresserons à la régression affine qui est la plus simple pour débuter.&lt;br /&gt;
&lt;br /&gt;
===Modèle et estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
La régression affine consiste donc à trouver un modèle de type&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt;y=ax+b&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
avec x une &amp;quot;feature&amp;quot;, y la target et avec a et b des paramètres qu'il nous faudra déterminer. Le but est donc de trouver les paramètres a et b tels que la distance entre chaque point du nuage et la droite du modèle soit la plus petite possible.&lt;br /&gt;
Mathématiquement, il suffit de résoudre cette formule:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression2.png|200px|thumb|right|Méthode des moindres carrés illustrée]]&lt;br /&gt;
[[Fichier:regression3.png]]&lt;br /&gt;
&lt;br /&gt;
On utilise donc la méthode des moindres carrés pour mesurer l'erreur entre le modèle de prédiction et les données et ainsi fabriquer notre fonction coût :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression4.png]]&lt;br /&gt;
&lt;br /&gt;
avec m le nombre de points du nuage.&lt;br /&gt;
&lt;br /&gt;
L'objectif de l'algorithme est donc de trouver les paramètres optimaux qui minimisent cette fonction J.&lt;br /&gt;
En machine learning, une des méthodes les plus populaires pour faire ceci est la descente de gradient, car c'est une méthode adaptée quand on fait du traitement de grosses dataset (&amp;quot;faible&amp;quot; temps de calcul). En effet, la fonction coût J est une parabole admettant un unique minimum dépendant des paramètres a et b. La descente de gradient consiste à chercher le point de celle-ci où la dérivée est nulle (donc le minimum)&lt;br /&gt;
&lt;br /&gt;
===Méthode de la descente du gradient===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression6.png|200px|thumb|right|Méthode gradient]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression7.png|200px|thumb|right|Généralisation gradient fct parabolique]]&lt;br /&gt;
&lt;br /&gt;
Soit une fonction parabolique ne dépendant que de x. On cherche à trouver le minimum de cette fonction en utilisant la méthode de la descente du gradient&lt;br /&gt;
Pour cela on choisit un point aléatoirement &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;et on va descendre à partir de celui-ci jusqu'à atteindre un minimum en utilisant&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression5.png]]&lt;br /&gt;
&lt;br /&gt;
avec un paramètre  qui influencera la taille du pas de la descente.&lt;br /&gt;
&lt;br /&gt;
Il faut faire attention à ne pas prendre un pas trop grand, ni trop petit, pour éviter de &amp;quot;tourner&amp;quot; autour du minimum ou de prendre trop de temps pour l'atteindre.&lt;br /&gt;
Note : On peut généraliser cela pour une fonction parabolique à n paramètres qui aurait donc une forme de bol.&lt;br /&gt;
&lt;br /&gt;
===Application sur notre fonction coût===&lt;br /&gt;
&lt;br /&gt;
Notre fonction coût dépend des 2 paramètres a et b :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression8.png]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression9.png]]&lt;br /&gt;
&lt;br /&gt;
On choisit &amp;lt;math&amp;gt;a_0&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; aléatoirement et on applique ceci pour un pas :&lt;br /&gt;
&lt;br /&gt;
Avec &lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression10.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d'un certain nombre d'itérations on trouve le couple &amp;lt;math&amp;gt;(a,b)&amp;lt;/math&amp;gt; qui minimise notre fonction coût.&lt;br /&gt;
&lt;br /&gt;
Note : Nous avons démontré la théorie de la régression linéaire affine mais on pourrait généraliser celle-ci pour un modèle polynomiale d’ordre n, la courbe de prédiction serait donc parabolique et il faudrait trouver le tuple &amp;lt;math&amp;gt;(a_1,a_2,...,a_n)&amp;lt;/math&amp;gt; qui minimise la fonction coût.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression logistique binaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo1.png|200px|thumb|right|Modèle régression logistique]]&lt;br /&gt;
&lt;br /&gt;
La régression logistique binaire est un algorithme de classification, contrairement à la régression linéaire qui est un algorithme de prédiction. De la même façon que la régression linéaire,  il s'agit de modéliser au mieux un modèle mathématique simple à des observations réelles nombreuses. Cette méthode se base sur de l’analyse mathématiques et statistique. Il faut donc associer à des “features” &amp;lt;math&amp;gt;(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; une variable Y valant 1 ou 0 (d’où le terme classification binaire).&lt;br /&gt;
&lt;br /&gt;
L’objectif de l’algorithme est donc de trouver la fonction F dépendant d’une loi de probabilité telle que :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo2.png]]&lt;br /&gt;
&lt;br /&gt;
avec S un certain seuil (fixé la plupart du temps à 0,5).&lt;br /&gt;
&lt;br /&gt;
===Modèle===&lt;br /&gt;
&lt;br /&gt;
Comme cette méthode repose principalement sur des statistiques, il est important d’adopter une notation explicite lors de l’explication théorique :&lt;br /&gt;
&lt;br /&gt;
* On notera Y la variable à prédire (qui vaudra 0 ou 1) et &amp;lt;math&amp;gt;X=(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; les variables permettant de prédire Y&lt;br /&gt;
* On travaillera dans un univers  de N échantillons (taille de la dataset)&lt;br /&gt;
* On notera &amp;lt;math&amp;gt;P(Y=1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;P(Y=0)&amp;lt;/math&amp;gt; les probabilités que Y valent respectivement 1 ou 0 &amp;lt;math&amp;gt;p(1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0)&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;p(X|1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(X|0)&amp;lt;/math&amp;gt; sont les distributions conditionnelles des caractéristiques X sachant la valeur prise par Y&lt;br /&gt;
* &amp;lt;math&amp;gt;p(1|X)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0|X)&amp;lt;/math&amp;gt; sont donc les probabilités d’obtenir la valeur de Y (1 ou 0) sachant les valeurs de X&lt;br /&gt;
&lt;br /&gt;
La régression logistique utilise l’hypothèse fondamentale (mesure de l’évidence) :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo3.png]]&lt;br /&gt;
&lt;br /&gt;
On en déduit donc (comme &amp;lt;math&amp;gt;p(0|X)=1-p(1|X))&amp;lt;/math&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo4.png]]&lt;br /&gt;
&lt;br /&gt;
Avec &amp;lt;math&amp;gt;(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; des variables à déterminer.&lt;br /&gt;
&lt;br /&gt;
''Note :'' ce modèle est appelé modèle LOGIT.&lt;br /&gt;
&lt;br /&gt;
===Estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
Contrairement à la régression linéaire affine, on ne peut pas utiliser la méthode des moindres carrés, on utilise alors la méthode de maximisation de la vraisemblance.&lt;br /&gt;
“La vraisemblance mesure une adéquation entre la distribution observée sur un échantillon aléatoire et une loi de probabilité supposée décrire une réalité sur la population dont l'échantillon est issu.” (source : [www.jybaudot.fr])&lt;br /&gt;
&lt;br /&gt;
Le calcul de la vraisemblance L dans un univers  de N échantillons est le suivant :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo5.png]]&lt;br /&gt;
&lt;br /&gt;
Plus la vraisemblance est élevée, alors plus la loi de probabilité est proche de la réalité. Le but est donc de maximiser cette valeur et de trouver les valeurs optimales de &amp;lt;math&amp;gt;A =(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; qui influent directement sur la loi de probabilité établie dans la partie modèle.&lt;br /&gt;
&lt;br /&gt;
===Algorithme d'optimisation===&lt;br /&gt;
&lt;br /&gt;
Afin de trouver la valeur optimale du vecteur A, nous utiliserons encore une fois la méthode de descente du gradient adaptée à notre cas.&lt;br /&gt;
&lt;br /&gt;
Celle-ci utilise la relation suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo6.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d’un certain nombre d’itérations, on trouvera la valeur optimale de A afin de maximiser la vraisemblance.&lt;br /&gt;
&lt;br /&gt;
=Recherche bibliographique=&lt;br /&gt;
&lt;br /&gt;
* https://www.wikipedia.com&lt;br /&gt;
&lt;br /&gt;
* https://www.jybaudot.fr&lt;br /&gt;
&lt;br /&gt;
* https://datascientest.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.ipgirl.com&lt;br /&gt;
&lt;br /&gt;
* Cours de probabilités et statistiques de l’Université Jules Vernes&lt;br /&gt;
&lt;br /&gt;
* Chaine youtube Machine Learning : https://www.youtube.com/channel/UCmpptkXu8iIFe6kfDK5o7VQ&lt;br /&gt;
&lt;br /&gt;
* Machine Learning with scikit-learn Quick Start Guide écrit par Kevin Jolly&lt;br /&gt;
&lt;br /&gt;
* https://lucidar.me/&lt;br /&gt;
&lt;br /&gt;
* https://archive.ics.uci.edu/ml/datasets.php&lt;br /&gt;
&lt;br /&gt;
* https://www.kaggle.com/datasets&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com/&lt;br /&gt;
&lt;br /&gt;
* Machine Learning algorithms - Second Edition écrit par Giuseppe Bonaccorso&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com&lt;br /&gt;
&lt;br /&gt;
* https://towardsdatascience.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.learndatasci.com/&lt;br /&gt;
&lt;br /&gt;
==Rapports et présentation==&lt;br /&gt;
&lt;br /&gt;
===Librairies===&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1CQZ1s6fNY_6MsmbBa5TP1OzSedqFeaWI?usp=sharing/ Rapport Numpy]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1tdu_B2wRsUiqdnSeskQENdn_wX3pJMeT?usp=sharing/ Rapport Pandas]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1DPS4ZT91SIEhscwST8kfER7u21tKoM3a?usp=sharing/ Rapport Seaborn]&lt;br /&gt;
&lt;br /&gt;
===Rapports===&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/document/d/1yR0vLePV3hI1_HVtTZWwGIwy0Cb-oLOsOTK3Um5KAYE/edit?usp=sharing/ Rapport]&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/presentation/d/1Je_yF0dgc-s9gB7LLsfOg0b05xcwIFJbaqpVytxWv5A/edit?usp=sharing/ Présentation]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1y_NMo9XKJ0WzwE2zmcRblUyuIebwfoN8?usp=sharing/ Régression linéaire]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1bRyrnL1JM870cEcEvfGaS8ItrG16rchy?usp=sharing/ Google Colab]&lt;/div&gt;</summary>
		<author><name>Abrossas</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88008</id>
		<title>IMA3/IMA4 2020/2022 P5</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88008"/>
				<updated>2022-02-02T14:53:55Z</updated>
		
		<summary type="html">&lt;p&gt;Abrossas : /* Pandas */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #C2E5FF; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Introduction et cahier des charges''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce projet est la mise en place d’algorithmes de machine Learning afin de diagnostiquer l’état de machines industrielles. Nous travaillerons sur ce projet durant 2 semestres. &lt;br /&gt;
Durant le premier semestre, nous avions comme objectifs d’acquérir la maîtrise des différentes librairies primordiales pour traiter les données en machine Learning, ainsi que d’étudier et d’utiliser certains algorithmes basiques (régression linéaire, logistique, Bayes) sur des datasets que nous traiterons nous même. &lt;br /&gt;
Pour ce qui est du second semestre, notre objectif était de concrétiser les connaissances acquises durant le premier semestre. Nous avons donc essayé de créer notre propre dataset à l’aide des matériels mis à notre disposition, de la prétraiter et d’y appliquer différents algorithmes de Machine Learning en critiquant les résultats.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning pour la détection de défaut s'inscrit parfaitement dans le contexte scientifique actuel, notamment grâce à l’industrie 4.0.&lt;br /&gt;
En effet, cette nouvelle industrie fait apparaître des systèmes communicants (l’IOT : Internet Of Things) interconnectés les uns entre les autres. Ces différents systèmes peuvent êtres nécessaires les uns, les autres afin de réaliser une tâche complexe telle que l'usinage de pièces. Le système devient dès lors potentiellement extrêmement fragile aux pannes.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning a pour but de pouvoir détecter, et localiser les pannes, voir les futures pannes potentielles afin de pouvoir dans un premier temps prévenir un opérateur. Mais il peut aussi potentiellement permettre au système de continuer de tourner, en attendant un technicien. Le machine Learning peut donc aussi permettre à une chaîne de production de continuer de tourner par l’envoie d’un autre robot par exemple, le temps que la panne soit réparée.&lt;br /&gt;
&lt;br /&gt;
Dans le schéma ci-dessous nous avons un exemple de système de système.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Intro1.png|500px|thumb|center|Schéma d'un système de systèmes]]&lt;br /&gt;
&lt;br /&gt;
Il y a deux cas de figure:&lt;br /&gt;
* Un autre système peut être envoyé pour remplacer le système 4.&lt;br /&gt;
* Les systèmes 1 et 2 peuvent permettre à la chaîne de production de continuer de tourner&lt;br /&gt;
* La chaîne de production est hors service jusqu'à réparation.&lt;br /&gt;
&lt;br /&gt;
==Cahier de charges==&lt;br /&gt;
&lt;br /&gt;
'''Ressources disponibles :'''&lt;br /&gt;
&lt;br /&gt;
* Livres sur le machine learning &lt;br /&gt;
* Bases de données (afin d'appliquer divers algorithmes de machine learning) que nous prendrons sur ces sites : [https://www.kaggle.com/datasets] et [https://archive.ics.uci.edu/ml/datasets.php]&lt;br /&gt;
* Librairies Python (Scikit-learn, Pandas, Numpy, Seaborn, Matplotlib)&lt;br /&gt;
* Google Colab&lt;br /&gt;
* Matlab (version étudiante)&lt;br /&gt;
&lt;br /&gt;
'''Objectifs poursuivis :'''&lt;br /&gt;
&lt;br /&gt;
* Détecter les dysfonctionnements de systèmes mécatroniques (par exemple les robots Khepera, Robotino…), grâce au machine learning.&lt;br /&gt;
* Apprendre à implémenter différentes méthodes machine learning .&lt;br /&gt;
&lt;br /&gt;
'''Profil du public cible :'''&lt;br /&gt;
* Secteur mécatronique&lt;br /&gt;
* Entreprises disposant d'ingénieurs pour maintenir le système informatique opérationnel&lt;br /&gt;
* Entreprises utilisant des machines dans le secteur public.&lt;br /&gt;
&lt;br /&gt;
'''Analyse des besoins :'''&lt;br /&gt;
* L’industrie a de plus en plus besoin du machine learning pour détecter les erreurs des systèmes. En effet, cette technologie devient indispensable pour les industriels, notamment afin d'accroître la productivité et l’efficacité des systèmes industriels.&lt;br /&gt;
* Le programme peut ne pas être aussi rapide et optimisé en espace mémoire que d'autres programmes, nous visons l’efficacité de notre algorithme plutôt que la rapidité.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #C2E5FF; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Librairies''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
En Machine Learning, il est très important, voire primordial, de savoir manipuler les différentes librairies mises à notre disposition afin de visualiser, traiter nos différentes dataset ou même appliquer les différents algorithmes de machine Learning.&lt;br /&gt;
Durant les premières semaines de notre projet, nous avons donc appris à utiliser ces différentes librairies nécessaires pour le machine Learning, telles que Numpy, Seaborn, Panda, Matplotlib, Scikit-learn... Nous allons dans un premier temps nous intéresser à l'importation des différentes bibliothèques puis résumer les commandes importantes de ces différentes librairies.&lt;br /&gt;
&lt;br /&gt;
Ces différentes librairies ne sont pas incluses de base dans Python, il est donc nécessaire de les ajouter à Python puis à notre programme.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc choisi d'utiliser google colab car ces librairies y sont déjà installées (et aussi pratique pour travailler à plusieurs sur un même code).&lt;br /&gt;
Puis nous devons importer ces bibliothèques au début de notre programme.&lt;br /&gt;
&lt;br /&gt;
Attention : Plusieurs bibliothèques peuvent avoir la même commande mais avec des significations différentes, comme par exemple la commande randint du module numpy et celle du module random et cela peut conduire à des erreurs. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de pallier à ces problèmes nous apporterons nos librairie au début de nos programmes comme suit :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:librairies1.png]]&lt;br /&gt;
&lt;br /&gt;
Ici le np permet de dire que lorsque nous utilisons np.array alors nous utilisons la commande array () contenu dans la bibliothèque Numpy.&lt;br /&gt;
&lt;br /&gt;
Ceci nous permettra d’utiliser en simultané différentes librairies, toutes les bibliothèques seront importées selon ce schéma.&lt;br /&gt;
Nous allons par la suite, nous intéresser à différentes commandes incluses dans ces librairies.&lt;br /&gt;
&lt;br /&gt;
==Numpy==&lt;br /&gt;
&lt;br /&gt;
Numpy est une bibliothèque dédiée aux calculs mathématiques et à la gestion des listes (telles que des matrices).&lt;br /&gt;
Matplotlib, quant à lui, est dédié aux affichages graphiques de données.&lt;br /&gt;
Nous allons dans cette partie nous intéresser aux commandes principales de ces deux bibliothèques de python.&lt;br /&gt;
&lt;br /&gt;
Sous numpy, les tableaux sont des types array, ils définissent l'équivalent des tableaux statiques en langage C. La taille d’un tableau numpy ne peut donc pas être changée après leur création. &lt;br /&gt;
&lt;br /&gt;
Néanmoins grâce a Numpy nous pouvons simplement effectuer des tâches sur les tableaux comme en extraire un sous tableaux, et d’effectuer simplement les produits entre matrice, vecteur.&lt;br /&gt;
&lt;br /&gt;
Dans notre projet, nous utiliserons plus courament les fonctions : &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.shape&amp;lt;/FONT&amp;gt; permet d’obtenir la taille de la matrice sous forme d’un tuple, suffit de choisir le bon numéro&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.zeros&amp;lt;/FONT&amp;gt; permet de créer une ligne de x zéro(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.ones&amp;lt;/FONT&amp;gt; permet de créer une ligne de x un(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.vstack&amp;lt;/FONT&amp;gt; permet de rajouter des lignes dans une matrice déjà créer en paramètre&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.transpose&amp;lt;/FONT&amp;gt; permet de transposer une matrice en paramètre&lt;br /&gt;
&lt;br /&gt;
==Seaborn==&lt;br /&gt;
&lt;br /&gt;
Seaborn est une bibliothèque de visualisation de données Python basée sur matplotlib. Il fournit une interface de haut niveau pour dessiner des graphiques statistiques attrayants et informatifs.&lt;br /&gt;
&lt;br /&gt;
'''Différences entre Matplotlib et Seaborn'''&lt;br /&gt;
&lt;br /&gt;
Les défauts de Matplotlib qui ne parlent généralement pas aux utilisateurs sont les couleurs, les marques de tiques sur les axes supérieur et droit, le style,...&lt;br /&gt;
Les exemples ci-dessus rendent également une autre frustration des utilisateurs plus apparente: le fait que travailler avec DataFrames ne va pas aussi bien avec Matplotlib, ce qui peut être ennuyeux si vous faites une analyse exploratoire avec Pandas. Et c’est exactement ce que Seaborn adresse : les fonctions de traçage fonctionnent sur dataframes et tableaux qui contiennent tout un ensemble de données.&lt;br /&gt;
[[Fichier:seaborn1.png|300px|thumb|right|Résultat du code python ci gauche]]&lt;br /&gt;
&lt;br /&gt;
   # Import necessary libraries&lt;br /&gt;
   import seaborn as sns&lt;br /&gt;
   import matplotlib.pyplot as plt&lt;br /&gt;
   &lt;br /&gt;
   # Load iris data&lt;br /&gt;
   iris = sns.load_dataset(&amp;quot;iris&amp;quot;) #DATASET ALREADY EXISTING&lt;br /&gt;
   &lt;br /&gt;
   # Construct iris plot&lt;br /&gt;
   sns.swarmplot(x=&amp;quot;species&amp;quot;, y=&amp;quot;petal_length&amp;quot;, data=iris)&lt;br /&gt;
   &lt;br /&gt;
   # Show plot&lt;br /&gt;
   plt.show()&lt;br /&gt;
&lt;br /&gt;
==Pandas==&lt;br /&gt;
&lt;br /&gt;
Pandas est une API d'analyse de données orientée colonnes. C'est un excellent outil pour manipuler et analyser des données d'entrée. Beaucoup de frameworks d'apprentissage automatique acceptent les structures de données Pandas en entrée.&lt;br /&gt;
&lt;br /&gt;
Comme évoqué précédemment, Pandas travaille avec des matrices colonnes communément appelées ‘Series’ mais aussi et surtout avec des tableaux de données appelés ‘DataFrames’.&lt;br /&gt;
Une Series est tout simplement une colonne et une DataFrame est un tableau à plusieurs dimensions constitué de Series.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Panda.JPG]]&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #C2E5FF; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Théories des algorithmes étudiés''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Il y a différents types d’algorithmes en machine learning, pour notre sujet qui consiste à classer des machines en défectueuse ou fonctionnelles (1 ou 0), nous aurons surtout besoin d’algorithmes de classification binaire. De manière générale, la conception de la plupart des algorithmes fonctionnent de cette manière : &lt;br /&gt;
&lt;br /&gt;
* Élaborer un modèle &lt;br /&gt;
* Établir une fonction coût pour celui-ci correspondant à l’erreur entre le modèle et les données réelles&lt;br /&gt;
* Trouver un algorithme de minimisation de cette fonction coût&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression linéaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression1.png|200px|thumb|right|Exemple de régression linéaire]]&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est un algorithme de prédiction et non un algorithme de classification, nous aurons surtout besoin de ce deuxième type d’algorithme pour notre projet mais nous tenons à présenter cet algorithme qui est le plus basique en machine learning et un bon début pour une formation pédagogique.&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est une méthode de modélisation qui cherche à établir une relation linéaire entre une ou des &amp;quot;features&amp;quot; (variables explicatives) et une &amp;quot;target&amp;quot; (variable expliquée qu'on cherche à prévoir à partir des variables explicatives). En machine learning, la régression linéaire est un modèle d'apprentissage supervisé, c'est-à-dire qu'on apprend à l'algorithme de prédiction à partir d'exemples dont on dispose dans une dataset. Nous nous intéresserons à la régression affine qui est la plus simple pour débuter.&lt;br /&gt;
&lt;br /&gt;
===Modèle et estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
La régression affine consiste donc à trouver un modèle de type&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt;y=ax+b&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
avec x une &amp;quot;feature&amp;quot;, y la target et avec a et b des paramètres qu'il nous faudra déterminer. Le but est donc de trouver les paramètres a et b tels que la distance entre chaque point du nuage et la droite du modèle soit la plus petite possible.&lt;br /&gt;
Mathématiquement, il suffit de résoudre cette formule:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression2.png|200px|thumb|right|Méthode des moindres carrés illustrée]]&lt;br /&gt;
[[Fichier:regression3.png]]&lt;br /&gt;
&lt;br /&gt;
On utilise donc la méthode des moindres carrés pour mesurer l'erreur entre le modèle de prédiction et les données et ainsi fabriquer notre fonction coût :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression4.png]]&lt;br /&gt;
&lt;br /&gt;
avec m le nombre de points du nuage.&lt;br /&gt;
&lt;br /&gt;
L'objectif de l'algorithme est donc de trouver les paramètres optimaux qui minimisent cette fonction J.&lt;br /&gt;
En machine learning, une des méthodes les plus populaires pour faire ceci est la descente de gradient, car c'est une méthode adaptée quand on fait du traitement de grosses dataset (&amp;quot;faible&amp;quot; temps de calcul). En effet, la fonction coût J est une parabole admettant un unique minimum dépendant des paramètres a et b. La descente de gradient consiste à chercher le point de celle-ci où la dérivée est nulle (donc le minimum)&lt;br /&gt;
&lt;br /&gt;
===Méthode de la descente du gradient===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression6.png|200px|thumb|right|Méthode gradient]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression7.png|200px|thumb|right|Généralisation gradient fct parabolique]]&lt;br /&gt;
&lt;br /&gt;
Soit une fonction parabolique ne dépendant que de x. On cherche à trouver le minimum de cette fonction en utilisant la méthode de la descente du gradient&lt;br /&gt;
Pour cela on choisit un point aléatoirement &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;et on va descendre à partir de celui-ci jusqu'à atteindre un minimum en utilisant&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression5.png]]&lt;br /&gt;
&lt;br /&gt;
avec un paramètre  qui influencera la taille du pas de la descente.&lt;br /&gt;
&lt;br /&gt;
Il faut faire attention à ne pas prendre un pas trop grand, ni trop petit, pour éviter de &amp;quot;tourner&amp;quot; autour du minimum ou de prendre trop de temps pour l'atteindre.&lt;br /&gt;
Note : On peut généraliser cela pour une fonction parabolique à n paramètres qui aurait donc une forme de bol.&lt;br /&gt;
&lt;br /&gt;
===Application sur notre fonction coût===&lt;br /&gt;
&lt;br /&gt;
Notre fonction coût dépend des 2 paramètres a et b :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression8.png]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression9.png]]&lt;br /&gt;
&lt;br /&gt;
On choisit &amp;lt;math&amp;gt;a_0&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; aléatoirement et on applique ceci pour un pas :&lt;br /&gt;
&lt;br /&gt;
Avec &lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression10.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d'un certain nombre d'itérations on trouve le couple &amp;lt;math&amp;gt;(a,b)&amp;lt;/math&amp;gt; qui minimise notre fonction coût.&lt;br /&gt;
&lt;br /&gt;
Note : Nous avons démontré la théorie de la régression linéaire affine mais on pourrait généraliser celle-ci pour un modèle polynomiale d’ordre n, la courbe de prédiction serait donc parabolique et il faudrait trouver le tuple &amp;lt;math&amp;gt;(a_1,a_2,...,a_n)&amp;lt;/math&amp;gt; qui minimise la fonction coût.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression logistique binaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo1.png|200px|thumb|right|Modèle régression logistique]]&lt;br /&gt;
&lt;br /&gt;
La régression logistique binaire est un algorithme de classification, contrairement à la régression linéaire qui est un algorithme de prédiction. De la même façon que la régression linéaire,  il s'agit de modéliser au mieux un modèle mathématique simple à des observations réelles nombreuses. Cette méthode se base sur de l’analyse mathématiques et statistique. Il faut donc associer à des “features” &amp;lt;math&amp;gt;(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; une variable Y valant 1 ou 0 (d’où le terme classification binaire).&lt;br /&gt;
&lt;br /&gt;
L’objectif de l’algorithme est donc de trouver la fonction F dépendant d’une loi de probabilité telle que :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo2.png]]&lt;br /&gt;
&lt;br /&gt;
avec S un certain seuil (fixé la plupart du temps à 0,5).&lt;br /&gt;
&lt;br /&gt;
===Modèle===&lt;br /&gt;
&lt;br /&gt;
Comme cette méthode repose principalement sur des statistiques, il est important d’adopter une notation explicite lors de l’explication théorique :&lt;br /&gt;
&lt;br /&gt;
* On notera Y la variable à prédire (qui vaudra 0 ou 1) et &amp;lt;math&amp;gt;X=(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; les variables permettant de prédire Y&lt;br /&gt;
* On travaillera dans un univers  de N échantillons (taille de la dataset)&lt;br /&gt;
* On notera &amp;lt;math&amp;gt;P(Y=1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;P(Y=0)&amp;lt;/math&amp;gt; les probabilités que Y valent respectivement 1 ou 0 &amp;lt;math&amp;gt;p(1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0)&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;p(X|1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(X|0)&amp;lt;/math&amp;gt; sont les distributions conditionnelles des caractéristiques X sachant la valeur prise par Y&lt;br /&gt;
* &amp;lt;math&amp;gt;p(1|X)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0|X)&amp;lt;/math&amp;gt; sont donc les probabilités d’obtenir la valeur de Y (1 ou 0) sachant les valeurs de X&lt;br /&gt;
&lt;br /&gt;
La régression logistique utilise l’hypothèse fondamentale (mesure de l’évidence) :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo3.png]]&lt;br /&gt;
&lt;br /&gt;
On en déduit donc (comme &amp;lt;math&amp;gt;p(0|X)=1-p(1|X))&amp;lt;/math&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo4.png]]&lt;br /&gt;
&lt;br /&gt;
Avec &amp;lt;math&amp;gt;(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; des variables à déterminer.&lt;br /&gt;
&lt;br /&gt;
''Note :'' ce modèle est appelé modèle LOGIT.&lt;br /&gt;
&lt;br /&gt;
===Estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
Contrairement à la régression linéaire affine, on ne peut pas utiliser la méthode des moindres carrés, on utilise alors la méthode de maximisation de la vraisemblance.&lt;br /&gt;
“La vraisemblance mesure une adéquation entre la distribution observée sur un échantillon aléatoire et une loi de probabilité supposée décrire une réalité sur la population dont l'échantillon est issu.” (source : [www.jybaudot.fr])&lt;br /&gt;
&lt;br /&gt;
Le calcul de la vraisemblance L dans un univers  de N échantillons est le suivant :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo5.png]]&lt;br /&gt;
&lt;br /&gt;
Plus la vraisemblance est élevée, alors plus la loi de probabilité est proche de la réalité. Le but est donc de maximiser cette valeur et de trouver les valeurs optimales de &amp;lt;math&amp;gt;A =(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; qui influent directement sur la loi de probabilité établie dans la partie modèle.&lt;br /&gt;
&lt;br /&gt;
===Algorithme d'optimisation===&lt;br /&gt;
&lt;br /&gt;
Afin de trouver la valeur optimale du vecteur A, nous utiliserons encore une fois la méthode de descente du gradient adaptée à notre cas.&lt;br /&gt;
&lt;br /&gt;
Celle-ci utilise la relation suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo6.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d’un certain nombre d’itérations, on trouvera la valeur optimale de A afin de maximiser la vraisemblance.&lt;br /&gt;
&lt;br /&gt;
=Recherche bibliographique=&lt;br /&gt;
&lt;br /&gt;
* https://www.wikipedia.com&lt;br /&gt;
&lt;br /&gt;
* https://www.jybaudot.fr&lt;br /&gt;
&lt;br /&gt;
* https://datascientest.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.ipgirl.com&lt;br /&gt;
&lt;br /&gt;
* Cours de probabilités et statistiques de l’Université Jules Vernes&lt;br /&gt;
&lt;br /&gt;
* Chaine youtube Machine Learning : https://www.youtube.com/channel/UCmpptkXu8iIFe6kfDK5o7VQ&lt;br /&gt;
&lt;br /&gt;
* Machine Learning with scikit-learn Quick Start Guide écrit par Kevin Jolly&lt;br /&gt;
&lt;br /&gt;
* https://lucidar.me/&lt;br /&gt;
&lt;br /&gt;
* https://archive.ics.uci.edu/ml/datasets.php&lt;br /&gt;
&lt;br /&gt;
* https://www.kaggle.com/datasets&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com/&lt;br /&gt;
&lt;br /&gt;
* Machine Learning algorithms - Second Edition écrit par Giuseppe Bonaccorso&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com&lt;br /&gt;
&lt;br /&gt;
* https://towardsdatascience.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.learndatasci.com/&lt;br /&gt;
&lt;br /&gt;
==Rapports et présentation==&lt;br /&gt;
&lt;br /&gt;
===Librairies===&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1CQZ1s6fNY_6MsmbBa5TP1OzSedqFeaWI?usp=sharing/ Rapport Numpy]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1tdu_B2wRsUiqdnSeskQENdn_wX3pJMeT?usp=sharing/ Rapport Pandas]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1DPS4ZT91SIEhscwST8kfER7u21tKoM3a?usp=sharing/ Rapport Seaborn]&lt;br /&gt;
&lt;br /&gt;
===Rapports===&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/document/d/1yR0vLePV3hI1_HVtTZWwGIwy0Cb-oLOsOTK3Um5KAYE/edit?usp=sharing/ Rapport]&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/presentation/d/1Je_yF0dgc-s9gB7LLsfOg0b05xcwIFJbaqpVytxWv5A/edit?usp=sharing/ Présentation]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1y_NMo9XKJ0WzwE2zmcRblUyuIebwfoN8?usp=sharing/ Régression linéaire]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1bRyrnL1JM870cEcEvfGaS8ItrG16rchy?usp=sharing/ Google Colab]&lt;/div&gt;</summary>
		<author><name>Abrossas</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Fichier:Panda.JPG&amp;diff=88007</id>
		<title>Fichier:Panda.JPG</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Fichier:Panda.JPG&amp;diff=88007"/>
				<updated>2022-02-02T14:53:32Z</updated>
		
		<summary type="html">&lt;p&gt;Abrossas : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Abrossas</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88006</id>
		<title>IMA3/IMA4 2020/2022 P5</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=88006"/>
				<updated>2022-02-02T14:50:32Z</updated>
		
		<summary type="html">&lt;p&gt;Abrossas : /* Pandas */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #C2E5FF; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Introduction et cahier des charges''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce projet est la mise en place d’algorithmes de machine Learning afin de diagnostiquer l’état de machines industrielles. Nous travaillerons sur ce projet durant 2 semestres. &lt;br /&gt;
Durant le premier semestre, nous avions comme objectifs d’acquérir la maîtrise des différentes librairies primordiales pour traiter les données en machine Learning, ainsi que d’étudier et d’utiliser certains algorithmes basiques (régression linéaire, logistique, Bayes) sur des datasets que nous traiterons nous même. &lt;br /&gt;
Pour ce qui est du second semestre, notre objectif était de concrétiser les connaissances acquises durant le premier semestre. Nous avons donc essayé de créer notre propre dataset à l’aide des matériels mis à notre disposition, de la prétraiter et d’y appliquer différents algorithmes de Machine Learning en critiquant les résultats.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning pour la détection de défaut s'inscrit parfaitement dans le contexte scientifique actuel, notamment grâce à l’industrie 4.0.&lt;br /&gt;
En effet, cette nouvelle industrie fait apparaître des systèmes communicants (l’IOT : Internet Of Things) interconnectés les uns entre les autres. Ces différents systèmes peuvent êtres nécessaires les uns, les autres afin de réaliser une tâche complexe telle que l'usinage de pièces. Le système devient dès lors potentiellement extrêmement fragile aux pannes.&lt;br /&gt;
&lt;br /&gt;
Le machine Learning a pour but de pouvoir détecter, et localiser les pannes, voir les futures pannes potentielles afin de pouvoir dans un premier temps prévenir un opérateur. Mais il peut aussi potentiellement permettre au système de continuer de tourner, en attendant un technicien. Le machine Learning peut donc aussi permettre à une chaîne de production de continuer de tourner par l’envoie d’un autre robot par exemple, le temps que la panne soit réparée.&lt;br /&gt;
&lt;br /&gt;
Dans le schéma ci-dessous nous avons un exemple de système de système.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Intro1.png|500px|thumb|center|Schéma d'un système de systèmes]]&lt;br /&gt;
&lt;br /&gt;
Il y a deux cas de figure:&lt;br /&gt;
* Un autre système peut être envoyé pour remplacer le système 4.&lt;br /&gt;
* Les systèmes 1 et 2 peuvent permettre à la chaîne de production de continuer de tourner&lt;br /&gt;
* La chaîne de production est hors service jusqu'à réparation.&lt;br /&gt;
&lt;br /&gt;
==Cahier de charges==&lt;br /&gt;
&lt;br /&gt;
'''Ressources disponibles :'''&lt;br /&gt;
&lt;br /&gt;
* Livres sur le machine learning &lt;br /&gt;
* Bases de données (afin d'appliquer divers algorithmes de machine learning) que nous prendrons sur ces sites : [https://www.kaggle.com/datasets] et [https://archive.ics.uci.edu/ml/datasets.php]&lt;br /&gt;
* Librairies Python (Scikit-learn, Pandas, Numpy, Seaborn, Matplotlib)&lt;br /&gt;
* Google Colab&lt;br /&gt;
* Matlab (version étudiante)&lt;br /&gt;
&lt;br /&gt;
'''Objectifs poursuivis :'''&lt;br /&gt;
&lt;br /&gt;
* Détecter les dysfonctionnements de systèmes mécatroniques (par exemple les robots Khepera, Robotino…), grâce au machine learning.&lt;br /&gt;
* Apprendre à implémenter différentes méthodes machine learning .&lt;br /&gt;
&lt;br /&gt;
'''Profil du public cible :'''&lt;br /&gt;
* Secteur mécatronique&lt;br /&gt;
* Entreprises disposant d'ingénieurs pour maintenir le système informatique opérationnel&lt;br /&gt;
* Entreprises utilisant des machines dans le secteur public.&lt;br /&gt;
&lt;br /&gt;
'''Analyse des besoins :'''&lt;br /&gt;
* L’industrie a de plus en plus besoin du machine learning pour détecter les erreurs des systèmes. En effet, cette technologie devient indispensable pour les industriels, notamment afin d'accroître la productivité et l’efficacité des systèmes industriels.&lt;br /&gt;
* Le programme peut ne pas être aussi rapide et optimisé en espace mémoire que d'autres programmes, nous visons l’efficacité de notre algorithme plutôt que la rapidité.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #C2E5FF; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Librairies''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
En Machine Learning, il est très important, voire primordial, de savoir manipuler les différentes librairies mises à notre disposition afin de visualiser, traiter nos différentes dataset ou même appliquer les différents algorithmes de machine Learning.&lt;br /&gt;
Durant les premières semaines de notre projet, nous avons donc appris à utiliser ces différentes librairies nécessaires pour le machine Learning, telles que Numpy, Seaborn, Panda, Matplotlib, Scikit-learn... Nous allons dans un premier temps nous intéresser à l'importation des différentes bibliothèques puis résumer les commandes importantes de ces différentes librairies.&lt;br /&gt;
&lt;br /&gt;
Ces différentes librairies ne sont pas incluses de base dans Python, il est donc nécessaire de les ajouter à Python puis à notre programme.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc choisi d'utiliser google colab car ces librairies y sont déjà installées (et aussi pratique pour travailler à plusieurs sur un même code).&lt;br /&gt;
Puis nous devons importer ces bibliothèques au début de notre programme.&lt;br /&gt;
&lt;br /&gt;
Attention : Plusieurs bibliothèques peuvent avoir la même commande mais avec des significations différentes, comme par exemple la commande randint du module numpy et celle du module random et cela peut conduire à des erreurs. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de pallier à ces problèmes nous apporterons nos librairie au début de nos programmes comme suit :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:librairies1.png]]&lt;br /&gt;
&lt;br /&gt;
Ici le np permet de dire que lorsque nous utilisons np.array alors nous utilisons la commande array () contenu dans la bibliothèque Numpy.&lt;br /&gt;
&lt;br /&gt;
Ceci nous permettra d’utiliser en simultané différentes librairies, toutes les bibliothèques seront importées selon ce schéma.&lt;br /&gt;
Nous allons par la suite, nous intéresser à différentes commandes incluses dans ces librairies.&lt;br /&gt;
&lt;br /&gt;
==Numpy==&lt;br /&gt;
&lt;br /&gt;
Numpy est une bibliothèque dédiée aux calculs mathématiques et à la gestion des listes (telles que des matrices).&lt;br /&gt;
Matplotlib, quant à lui, est dédié aux affichages graphiques de données.&lt;br /&gt;
Nous allons dans cette partie nous intéresser aux commandes principales de ces deux bibliothèques de python.&lt;br /&gt;
&lt;br /&gt;
Sous numpy, les tableaux sont des types array, ils définissent l'équivalent des tableaux statiques en langage C. La taille d’un tableau numpy ne peut donc pas être changée après leur création. &lt;br /&gt;
&lt;br /&gt;
Néanmoins grâce a Numpy nous pouvons simplement effectuer des tâches sur les tableaux comme en extraire un sous tableaux, et d’effectuer simplement les produits entre matrice, vecteur.&lt;br /&gt;
&lt;br /&gt;
Dans notre projet, nous utiliserons plus courament les fonctions : &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.shape&amp;lt;/FONT&amp;gt; permet d’obtenir la taille de la matrice sous forme d’un tuple, suffit de choisir le bon numéro&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.zeros&amp;lt;/FONT&amp;gt; permet de créer une ligne de x zéro(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.ones&amp;lt;/FONT&amp;gt; permet de créer une ligne de x un(s)&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.vstack&amp;lt;/FONT&amp;gt; permet de rajouter des lignes dans une matrice déjà créer en paramètre&lt;br /&gt;
* &amp;lt;FONT face=&amp;quot;courier new&amp;quot;&amp;gt;np.transpose&amp;lt;/FONT&amp;gt; permet de transposer une matrice en paramètre&lt;br /&gt;
&lt;br /&gt;
==Seaborn==&lt;br /&gt;
&lt;br /&gt;
Seaborn est une bibliothèque de visualisation de données Python basée sur matplotlib. Il fournit une interface de haut niveau pour dessiner des graphiques statistiques attrayants et informatifs.&lt;br /&gt;
&lt;br /&gt;
'''Différences entre Matplotlib et Seaborn'''&lt;br /&gt;
&lt;br /&gt;
Les défauts de Matplotlib qui ne parlent généralement pas aux utilisateurs sont les couleurs, les marques de tiques sur les axes supérieur et droit, le style,...&lt;br /&gt;
Les exemples ci-dessus rendent également une autre frustration des utilisateurs plus apparente: le fait que travailler avec DataFrames ne va pas aussi bien avec Matplotlib, ce qui peut être ennuyeux si vous faites une analyse exploratoire avec Pandas. Et c’est exactement ce que Seaborn adresse : les fonctions de traçage fonctionnent sur dataframes et tableaux qui contiennent tout un ensemble de données.&lt;br /&gt;
[[Fichier:seaborn1.png|300px|thumb|right|Résultat du code python ci gauche]]&lt;br /&gt;
&lt;br /&gt;
   # Import necessary libraries&lt;br /&gt;
   import seaborn as sns&lt;br /&gt;
   import matplotlib.pyplot as plt&lt;br /&gt;
   &lt;br /&gt;
   # Load iris data&lt;br /&gt;
   iris = sns.load_dataset(&amp;quot;iris&amp;quot;) #DATASET ALREADY EXISTING&lt;br /&gt;
   &lt;br /&gt;
   # Construct iris plot&lt;br /&gt;
   sns.swarmplot(x=&amp;quot;species&amp;quot;, y=&amp;quot;petal_length&amp;quot;, data=iris)&lt;br /&gt;
   &lt;br /&gt;
   # Show plot&lt;br /&gt;
   plt.show()&lt;br /&gt;
&lt;br /&gt;
==Pandas==&lt;br /&gt;
&lt;br /&gt;
Pandas est une API d'analyse de données orientée colonnes. C'est un excellent outil pour manipuler et analyser des données d'entrée. Beaucoup de frameworks d'apprentissage automatique acceptent les structures de données Pandas en entrée.&lt;br /&gt;
&lt;br /&gt;
Comme évoqué précédemment, Pandas travaille avec des matrices colonnes communément appelées ‘Series’ mais aussi et surtout avec des tableaux de données appelés ‘DataFrames’.&lt;br /&gt;
Une Series est tout simplement une colonne et une DataFrame est un tableau à plusieurs dimensions constitué de Series.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #C2E5FF; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Théories des algorithmes étudiés''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Il y a différents types d’algorithmes en machine learning, pour notre sujet qui consiste à classer des machines en défectueuse ou fonctionnelles (1 ou 0), nous aurons surtout besoin d’algorithmes de classification binaire. De manière générale, la conception de la plupart des algorithmes fonctionnent de cette manière : &lt;br /&gt;
&lt;br /&gt;
* Élaborer un modèle &lt;br /&gt;
* Établir une fonction coût pour celui-ci correspondant à l’erreur entre le modèle et les données réelles&lt;br /&gt;
* Trouver un algorithme de minimisation de cette fonction coût&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression linéaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression1.png|200px|thumb|right|Exemple de régression linéaire]]&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est un algorithme de prédiction et non un algorithme de classification, nous aurons surtout besoin de ce deuxième type d’algorithme pour notre projet mais nous tenons à présenter cet algorithme qui est le plus basique en machine learning et un bon début pour une formation pédagogique.&lt;br /&gt;
&lt;br /&gt;
La régression linéaire est une méthode de modélisation qui cherche à établir une relation linéaire entre une ou des &amp;quot;features&amp;quot; (variables explicatives) et une &amp;quot;target&amp;quot; (variable expliquée qu'on cherche à prévoir à partir des variables explicatives). En machine learning, la régression linéaire est un modèle d'apprentissage supervisé, c'est-à-dire qu'on apprend à l'algorithme de prédiction à partir d'exemples dont on dispose dans une dataset. Nous nous intéresserons à la régression affine qui est la plus simple pour débuter.&lt;br /&gt;
&lt;br /&gt;
===Modèle et estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
La régression affine consiste donc à trouver un modèle de type&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt;y=ax+b&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
avec x une &amp;quot;feature&amp;quot;, y la target et avec a et b des paramètres qu'il nous faudra déterminer. Le but est donc de trouver les paramètres a et b tels que la distance entre chaque point du nuage et la droite du modèle soit la plus petite possible.&lt;br /&gt;
Mathématiquement, il suffit de résoudre cette formule:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression2.png|200px|thumb|right|Méthode des moindres carrés illustrée]]&lt;br /&gt;
[[Fichier:regression3.png]]&lt;br /&gt;
&lt;br /&gt;
On utilise donc la méthode des moindres carrés pour mesurer l'erreur entre le modèle de prédiction et les données et ainsi fabriquer notre fonction coût :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression4.png]]&lt;br /&gt;
&lt;br /&gt;
avec m le nombre de points du nuage.&lt;br /&gt;
&lt;br /&gt;
L'objectif de l'algorithme est donc de trouver les paramètres optimaux qui minimisent cette fonction J.&lt;br /&gt;
En machine learning, une des méthodes les plus populaires pour faire ceci est la descente de gradient, car c'est une méthode adaptée quand on fait du traitement de grosses dataset (&amp;quot;faible&amp;quot; temps de calcul). En effet, la fonction coût J est une parabole admettant un unique minimum dépendant des paramètres a et b. La descente de gradient consiste à chercher le point de celle-ci où la dérivée est nulle (donc le minimum)&lt;br /&gt;
&lt;br /&gt;
===Méthode de la descente du gradient===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression6.png|200px|thumb|right|Méthode gradient]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression7.png|200px|thumb|right|Généralisation gradient fct parabolique]]&lt;br /&gt;
&lt;br /&gt;
Soit une fonction parabolique ne dépendant que de x. On cherche à trouver le minimum de cette fonction en utilisant la méthode de la descente du gradient&lt;br /&gt;
Pour cela on choisit un point aléatoirement &amp;lt;math&amp;gt;x_0&amp;lt;/math&amp;gt;et on va descendre à partir de celui-ci jusqu'à atteindre un minimum en utilisant&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression5.png]]&lt;br /&gt;
&lt;br /&gt;
avec un paramètre  qui influencera la taille du pas de la descente.&lt;br /&gt;
&lt;br /&gt;
Il faut faire attention à ne pas prendre un pas trop grand, ni trop petit, pour éviter de &amp;quot;tourner&amp;quot; autour du minimum ou de prendre trop de temps pour l'atteindre.&lt;br /&gt;
Note : On peut généraliser cela pour une fonction parabolique à n paramètres qui aurait donc une forme de bol.&lt;br /&gt;
&lt;br /&gt;
===Application sur notre fonction coût===&lt;br /&gt;
&lt;br /&gt;
Notre fonction coût dépend des 2 paramètres a et b :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression8.png]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression9.png]]&lt;br /&gt;
&lt;br /&gt;
On choisit &amp;lt;math&amp;gt;a_0&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; aléatoirement et on applique ceci pour un pas :&lt;br /&gt;
&lt;br /&gt;
Avec &lt;br /&gt;
&lt;br /&gt;
[[Fichier:regression10.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d'un certain nombre d'itérations on trouve le couple &amp;lt;math&amp;gt;(a,b)&amp;lt;/math&amp;gt; qui minimise notre fonction coût.&lt;br /&gt;
&lt;br /&gt;
Note : Nous avons démontré la théorie de la régression linéaire affine mais on pourrait généraliser celle-ci pour un modèle polynomiale d’ordre n, la courbe de prédiction serait donc parabolique et il faudrait trouver le tuple &amp;lt;math&amp;gt;(a_1,a_2,...,a_n)&amp;lt;/math&amp;gt; qui minimise la fonction coût.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Régression logistique binaire==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo1.png|200px|thumb|right|Modèle régression logistique]]&lt;br /&gt;
&lt;br /&gt;
La régression logistique binaire est un algorithme de classification, contrairement à la régression linéaire qui est un algorithme de prédiction. De la même façon que la régression linéaire,  il s'agit de modéliser au mieux un modèle mathématique simple à des observations réelles nombreuses. Cette méthode se base sur de l’analyse mathématiques et statistique. Il faut donc associer à des “features” &amp;lt;math&amp;gt;(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; une variable Y valant 1 ou 0 (d’où le terme classification binaire).&lt;br /&gt;
&lt;br /&gt;
L’objectif de l’algorithme est donc de trouver la fonction F dépendant d’une loi de probabilité telle que :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo2.png]]&lt;br /&gt;
&lt;br /&gt;
avec S un certain seuil (fixé la plupart du temps à 0,5).&lt;br /&gt;
&lt;br /&gt;
===Modèle===&lt;br /&gt;
&lt;br /&gt;
Comme cette méthode repose principalement sur des statistiques, il est important d’adopter une notation explicite lors de l’explication théorique :&lt;br /&gt;
&lt;br /&gt;
* On notera Y la variable à prédire (qui vaudra 0 ou 1) et &amp;lt;math&amp;gt;X=(X_1,X_2,...,X_n)&amp;lt;/math&amp;gt; les variables permettant de prédire Y&lt;br /&gt;
* On travaillera dans un univers  de N échantillons (taille de la dataset)&lt;br /&gt;
* On notera &amp;lt;math&amp;gt;P(Y=1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;P(Y=0)&amp;lt;/math&amp;gt; les probabilités que Y valent respectivement 1 ou 0 &amp;lt;math&amp;gt;p(1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0)&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;p(X|1)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(X|0)&amp;lt;/math&amp;gt; sont les distributions conditionnelles des caractéristiques X sachant la valeur prise par Y&lt;br /&gt;
* &amp;lt;math&amp;gt;p(1|X)&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;p(0|X)&amp;lt;/math&amp;gt; sont donc les probabilités d’obtenir la valeur de Y (1 ou 0) sachant les valeurs de X&lt;br /&gt;
&lt;br /&gt;
La régression logistique utilise l’hypothèse fondamentale (mesure de l’évidence) :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo3.png]]&lt;br /&gt;
&lt;br /&gt;
On en déduit donc (comme &amp;lt;math&amp;gt;p(0|X)=1-p(1|X))&amp;lt;/math&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo4.png]]&lt;br /&gt;
&lt;br /&gt;
Avec &amp;lt;math&amp;gt;(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; des variables à déterminer.&lt;br /&gt;
&lt;br /&gt;
''Note :'' ce modèle est appelé modèle LOGIT.&lt;br /&gt;
&lt;br /&gt;
===Estimation de la fonction coût===&lt;br /&gt;
&lt;br /&gt;
Contrairement à la régression linéaire affine, on ne peut pas utiliser la méthode des moindres carrés, on utilise alors la méthode de maximisation de la vraisemblance.&lt;br /&gt;
“La vraisemblance mesure une adéquation entre la distribution observée sur un échantillon aléatoire et une loi de probabilité supposée décrire une réalité sur la population dont l'échantillon est issu.” (source : [www.jybaudot.fr])&lt;br /&gt;
&lt;br /&gt;
Le calcul de la vraisemblance L dans un univers  de N échantillons est le suivant :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo5.png]]&lt;br /&gt;
&lt;br /&gt;
Plus la vraisemblance est élevée, alors plus la loi de probabilité est proche de la réalité. Le but est donc de maximiser cette valeur et de trouver les valeurs optimales de &amp;lt;math&amp;gt;A =(a_0,a_1,...,a_n)&amp;lt;/math&amp;gt; qui influent directement sur la loi de probabilité établie dans la partie modèle.&lt;br /&gt;
&lt;br /&gt;
===Algorithme d'optimisation===&lt;br /&gt;
&lt;br /&gt;
Afin de trouver la valeur optimale du vecteur A, nous utiliserons encore une fois la méthode de descente du gradient adaptée à notre cas.&lt;br /&gt;
&lt;br /&gt;
Celle-ci utilise la relation suivante :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:regressionLo6.png]]&lt;br /&gt;
&lt;br /&gt;
Au bout d’un certain nombre d’itérations, on trouvera la valeur optimale de A afin de maximiser la vraisemblance.&lt;br /&gt;
&lt;br /&gt;
=Recherche bibliographique=&lt;br /&gt;
&lt;br /&gt;
* https://www.wikipedia.com&lt;br /&gt;
&lt;br /&gt;
* https://www.jybaudot.fr&lt;br /&gt;
&lt;br /&gt;
* https://datascientest.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.ipgirl.com&lt;br /&gt;
&lt;br /&gt;
* Cours de probabilités et statistiques de l’Université Jules Vernes&lt;br /&gt;
&lt;br /&gt;
* Chaine youtube Machine Learning : https://www.youtube.com/channel/UCmpptkXu8iIFe6kfDK5o7VQ&lt;br /&gt;
&lt;br /&gt;
* Machine Learning with scikit-learn Quick Start Guide écrit par Kevin Jolly&lt;br /&gt;
&lt;br /&gt;
* https://lucidar.me/&lt;br /&gt;
&lt;br /&gt;
* https://archive.ics.uci.edu/ml/datasets.php&lt;br /&gt;
&lt;br /&gt;
* https://www.kaggle.com/datasets&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com/&lt;br /&gt;
&lt;br /&gt;
* Machine Learning algorithms - Second Edition écrit par Giuseppe Bonaccorso&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com&lt;br /&gt;
&lt;br /&gt;
* https://towardsdatascience.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.learndatasci.com/&lt;br /&gt;
&lt;br /&gt;
==Rapports et présentation==&lt;br /&gt;
&lt;br /&gt;
===Librairies===&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1CQZ1s6fNY_6MsmbBa5TP1OzSedqFeaWI?usp=sharing/ Rapport Numpy]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1tdu_B2wRsUiqdnSeskQENdn_wX3pJMeT?usp=sharing/ Rapport Pandas]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1DPS4ZT91SIEhscwST8kfER7u21tKoM3a?usp=sharing/ Rapport Seaborn]&lt;br /&gt;
&lt;br /&gt;
===Rapports===&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/document/d/1yR0vLePV3hI1_HVtTZWwGIwy0Cb-oLOsOTK3Um5KAYE/edit?usp=sharing/ Rapport]&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/presentation/d/1Je_yF0dgc-s9gB7LLsfOg0b05xcwIFJbaqpVytxWv5A/edit?usp=sharing/ Présentation]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1y_NMo9XKJ0WzwE2zmcRblUyuIebwfoN8?usp=sharing/ Régression linéaire]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1bRyrnL1JM870cEcEvfGaS8ItrG16rchy?usp=sharing/ Google Colab]&lt;/div&gt;</summary>
		<author><name>Abrossas</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=87696</id>
		<title>IMA3/IMA4 2020/2022 P5</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=87696"/>
				<updated>2022-01-05T22:32:25Z</updated>
		
		<summary type="html">&lt;p&gt;Abrossas : /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #C2E5FF; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Présentation générale''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
==Contexte==&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce projet est la mise en place d’algorithmes de machine learning afin de diagnostiquer l’état de machines industrielles. Nous travaillons sur ce projet durant 2 semestres. Durant ces 2 premiers semestres, nous avions comme objectifs d’acquérir la maîtrise des différentes librairies primordiales pour traiter les données en machine learning, ainsi que d’étudier et d’utiliser certains algorithmes basiques (régression linéaire, logistique, Bayes) sur des datasets que nous traiterons et récupérerons nous même grâce au matériel mis à notre disposition.&lt;br /&gt;
&lt;br /&gt;
==Répartition des tâches==&lt;br /&gt;
&lt;br /&gt;
===Semestre 6===&lt;br /&gt;
&lt;br /&gt;
Au début, comme le sujet était flou pour une majorité d’entre nous, nous nous sommes documentés tous ensemble sur différents livres à propos du machine learning et avons compris l’importance des librairies associées au machine learning.&lt;br /&gt;
Après s’être suffisamment documenté, 3 d’entre nous devaient réaliser un rapport sur les différentes librairies (Numpy pour Loïc, Pandas pour Tom, Seaborn pour Aymen), celui-ci se devait d’être assez explicite afin que les autres n’ayant pas travaillé sur ces librairies puissent acquérir des connaissances facilement en le lisant, Florian et Antoine, quant à eux, se sont occupées d’implémenter et d’analyser une première méthode de machine learning, la régression linéaire, et d’en effectuer un rapport.&lt;br /&gt;
Ensuite, une partie d’entre nous s’est intéressée à d’autres algorithmes de machine learning (Bayes pour Loïc et régression logistique pour Antoine) tandis que Florian et Tom se sont intéressées à diverses méthodes de pré-traitement de données (méthode SMOTE pour l’oversampling) à appliquer sur une base de données existantes et Aymen s’est occupé de la partie évaluation de l’efficacité d’un algorithme (avec notamment l’importance de la matrice de confusion).&lt;br /&gt;
&lt;br /&gt;
===Semestre 7===&lt;br /&gt;
Durant ce semestre, certains d’entre nous (Aymen, Loïc et Florian) se sont documentés sur les différentes méthodes pour créer notre propre dataset afin de les mettre en place ultérieurement pendant que d’autres (Tom et Antoine) se renseignaient sur différentes méthodes de pré-traitement des datasets (random,...) afin de les réaliser sur la dataset créée.&lt;br /&gt;
&lt;br /&gt;
==Cahier des charges==&lt;br /&gt;
&lt;br /&gt;
'''Ressources disponibles :'''&lt;br /&gt;
&lt;br /&gt;
Livres sur le machine learning&lt;br /&gt;
&lt;br /&gt;
Bases de données (afin d'appliquer divers algorithmes de machine learning) que nous prendrons sur ces sites :&lt;br /&gt;
https://www.kaggle.com/datasets&lt;br /&gt;
https://archive.ics.uci.edu/ml/datasets.php&lt;br /&gt;
&lt;br /&gt;
Librairies Python (Scikit-learn, Pandas, Numpy, Seaborn, Matplotlib)&lt;br /&gt;
&lt;br /&gt;
'''Objectifs poursuivis :'''&lt;br /&gt;
&lt;br /&gt;
Détecter les dysfonctionnements de systèmes mécatroniques (par exemple les robots Khepera, Robotino…), grâce au machine learning.&lt;br /&gt;
&lt;br /&gt;
Apprendre à implémenter différentes méthodes machine learning .&lt;br /&gt;
&lt;br /&gt;
'''Profil du public cible :'''&lt;br /&gt;
&lt;br /&gt;
Secteur mécatronique&lt;br /&gt;
&lt;br /&gt;
Entreprises disposant d'ingénieurs pour maintenir le système informatique opérationnel&lt;br /&gt;
&lt;br /&gt;
Entreprises utilisant des machines dans tous les secteurs&lt;br /&gt;
&lt;br /&gt;
'''Analyse des besoins :'''&lt;br /&gt;
&lt;br /&gt;
L’industrie a de plus en plus besoin du machine learning pour détecter les erreurs des systèmes. En effet, cette technologie devient indispensable pour les industriels, notamment afin d'accroître la productivité et l’efficacité des systèmes industriels. Notamment dans le cadre de l'industrie 4.0.&lt;br /&gt;
&lt;br /&gt;
Le programme peut ne pas être aussi rapide et optimisé en espace mémoire que d'autres programmes, nous visons l’efficacité de notre algorithme plutôt que la rapidité.&lt;br /&gt;
&lt;br /&gt;
==Recherche bibliographique==&lt;br /&gt;
&lt;br /&gt;
* https://www.wikipedia.com&lt;br /&gt;
&lt;br /&gt;
* https://www.jybaudot.fr&lt;br /&gt;
&lt;br /&gt;
* https://datascientest.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.ipgirl.com&lt;br /&gt;
&lt;br /&gt;
* Cours de probabilités et statistiques de l’Université Jules Vernes&lt;br /&gt;
&lt;br /&gt;
* Chaine youtube Machine Learning : https://www.youtube.com/channel/UCmpptkXu8iIFe6kfDK5o7VQ&lt;br /&gt;
&lt;br /&gt;
* Machine Learning with scikit-learn Quick Start Guide écrit par Kevin Jolly&lt;br /&gt;
&lt;br /&gt;
* https://lucidar.me/&lt;br /&gt;
&lt;br /&gt;
* https://archive.ics.uci.edu/ml/datasets.php&lt;br /&gt;
&lt;br /&gt;
* https://www.kaggle.com/datasets&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com/&lt;br /&gt;
&lt;br /&gt;
* Machine Learning algorithms - Second Edition écrit par Giuseppe Bonaccorso&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com&lt;br /&gt;
&lt;br /&gt;
* https://towardsdatascience.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.learndatasci.com/&lt;br /&gt;
&lt;br /&gt;
==Rapports et présentation==&lt;br /&gt;
&lt;br /&gt;
===Librairies===&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1CQZ1s6fNY_6MsmbBa5TP1OzSedqFeaWI?usp=sharing/ Rapport Numpy]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1tdu_B2wRsUiqdnSeskQENdn_wX3pJMeT?usp=sharing/ Rapport Pandas]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1DPS4ZT91SIEhscwST8kfER7u21tKoM3a?usp=sharing/ Rapport Seaborn]&lt;br /&gt;
&lt;br /&gt;
===Rapports===&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/document/d/1yR0vLePV3hI1_HVtTZWwGIwy0Cb-oLOsOTK3Um5KAYE/edit?usp=sharing/ Rapport]&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/presentation/d/1Je_yF0dgc-s9gB7LLsfOg0b05xcwIFJbaqpVytxWv5A/edit?usp=sharing/ Présentation]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1y_NMo9XKJ0WzwE2zmcRblUyuIebwfoN8?usp=sharing/ Régression linéaire]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1bRyrnL1JM870cEcEvfGaS8ItrG16rchy?usp=sharing/ Google Colab]&lt;/div&gt;</summary>
		<author><name>Abrossas</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=87695</id>
		<title>IMA3/IMA4 2020/2022 P5</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=87695"/>
				<updated>2022-01-05T22:31:23Z</updated>
		
		<summary type="html">&lt;p&gt;Abrossas : /* Semestre 7 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #C2E5FF; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Présentation générale''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
==Contexte==&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce projet est la mise en place d’algorithmes de machine learning afin de diagnostiquer l’état de machines industrielles. Nous travaillons sur ce projet durant 2 semestres. Durant le premier semestre, nous avions comme objectifs d’acquérir la maîtrise des différentes librairies primordiales pour traiter les données en machine learning, ainsi que d’étudier et d’utiliser certains algorithmes basiques (régression linéaire, logistique, Bayes) sur des datasets que nous traiterons nous même.&lt;br /&gt;
&lt;br /&gt;
==Répartition des tâches==&lt;br /&gt;
&lt;br /&gt;
===Semestre 6===&lt;br /&gt;
&lt;br /&gt;
Au début, comme le sujet était flou pour une majorité d’entre nous, nous nous sommes documentés tous ensemble sur différents livres à propos du machine learning et avons compris l’importance des librairies associées au machine learning.&lt;br /&gt;
Après s’être suffisamment documenté, 3 d’entre nous devaient réaliser un rapport sur les différentes librairies (Numpy pour Loïc, Pandas pour Tom, Seaborn pour Aymen), celui-ci se devait d’être assez explicite afin que les autres n’ayant pas travaillé sur ces librairies puissent acquérir des connaissances facilement en le lisant, Florian et Antoine, quant à eux, se sont occupées d’implémenter et d’analyser une première méthode de machine learning, la régression linéaire, et d’en effectuer un rapport.&lt;br /&gt;
Ensuite, une partie d’entre nous s’est intéressée à d’autres algorithmes de machine learning (Bayes pour Loïc et régression logistique pour Antoine) tandis que Florian et Tom se sont intéressées à diverses méthodes de pré-traitement de données (méthode SMOTE pour l’oversampling) à appliquer sur une base de données existantes et Aymen s’est occupé de la partie évaluation de l’efficacité d’un algorithme (avec notamment l’importance de la matrice de confusion).&lt;br /&gt;
&lt;br /&gt;
===Semestre 7===&lt;br /&gt;
Durant ce semestre, certains d’entre nous (Aymen, Loïc et Florian) se sont documentés sur les différentes méthodes pour créer notre propre dataset afin de les mettre en place ultérieurement pendant que d’autres (Tom et Antoine) se renseignaient sur différentes méthodes de pré-traitement des datasets (random,...) afin de les réaliser sur la dataset créée.&lt;br /&gt;
&lt;br /&gt;
==Cahier des charges==&lt;br /&gt;
&lt;br /&gt;
'''Ressources disponibles :'''&lt;br /&gt;
&lt;br /&gt;
Livres sur le machine learning&lt;br /&gt;
&lt;br /&gt;
Bases de données (afin d'appliquer divers algorithmes de machine learning) que nous prendrons sur ces sites :&lt;br /&gt;
https://www.kaggle.com/datasets&lt;br /&gt;
https://archive.ics.uci.edu/ml/datasets.php&lt;br /&gt;
&lt;br /&gt;
Librairies Python (Scikit-learn, Pandas, Numpy, Seaborn, Matplotlib)&lt;br /&gt;
&lt;br /&gt;
'''Objectifs poursuivis :'''&lt;br /&gt;
&lt;br /&gt;
Détecter les dysfonctionnements de systèmes mécatroniques (par exemple les robots Khepera, Robotino…), grâce au machine learning.&lt;br /&gt;
&lt;br /&gt;
Apprendre à implémenter différentes méthodes machine learning .&lt;br /&gt;
&lt;br /&gt;
'''Profil du public cible :'''&lt;br /&gt;
&lt;br /&gt;
Secteur mécatronique&lt;br /&gt;
&lt;br /&gt;
Entreprises disposant d'ingénieurs pour maintenir le système informatique opérationnel&lt;br /&gt;
&lt;br /&gt;
Entreprises utilisant des machines dans tous les secteurs&lt;br /&gt;
&lt;br /&gt;
'''Analyse des besoins :'''&lt;br /&gt;
&lt;br /&gt;
L’industrie a de plus en plus besoin du machine learning pour détecter les erreurs des systèmes. En effet, cette technologie devient indispensable pour les industriels, notamment afin d'accroître la productivité et l’efficacité des systèmes industriels. Notamment dans le cadre de l'industrie 4.0.&lt;br /&gt;
&lt;br /&gt;
Le programme peut ne pas être aussi rapide et optimisé en espace mémoire que d'autres programmes, nous visons l’efficacité de notre algorithme plutôt que la rapidité.&lt;br /&gt;
&lt;br /&gt;
==Recherche bibliographique==&lt;br /&gt;
&lt;br /&gt;
* https://www.wikipedia.com&lt;br /&gt;
&lt;br /&gt;
* https://www.jybaudot.fr&lt;br /&gt;
&lt;br /&gt;
* https://datascientest.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.ipgirl.com&lt;br /&gt;
&lt;br /&gt;
* Cours de probabilités et statistiques de l’Université Jules Vernes&lt;br /&gt;
&lt;br /&gt;
* Chaine youtube Machine Learning : https://www.youtube.com/channel/UCmpptkXu8iIFe6kfDK5o7VQ&lt;br /&gt;
&lt;br /&gt;
* Machine Learning with scikit-learn Quick Start Guide écrit par Kevin Jolly&lt;br /&gt;
&lt;br /&gt;
* https://lucidar.me/&lt;br /&gt;
&lt;br /&gt;
* https://archive.ics.uci.edu/ml/datasets.php&lt;br /&gt;
&lt;br /&gt;
* https://www.kaggle.com/datasets&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com/&lt;br /&gt;
&lt;br /&gt;
* Machine Learning algorithms - Second Edition écrit par Giuseppe Bonaccorso&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com&lt;br /&gt;
&lt;br /&gt;
* https://towardsdatascience.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.learndatasci.com/&lt;br /&gt;
&lt;br /&gt;
==Rapports et présentation==&lt;br /&gt;
&lt;br /&gt;
===Librairies===&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1CQZ1s6fNY_6MsmbBa5TP1OzSedqFeaWI?usp=sharing/ Rapport Numpy]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1tdu_B2wRsUiqdnSeskQENdn_wX3pJMeT?usp=sharing/ Rapport Pandas]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1DPS4ZT91SIEhscwST8kfER7u21tKoM3a?usp=sharing/ Rapport Seaborn]&lt;br /&gt;
&lt;br /&gt;
===Rapports===&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/document/d/1yR0vLePV3hI1_HVtTZWwGIwy0Cb-oLOsOTK3Um5KAYE/edit?usp=sharing/ Rapport]&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/presentation/d/1Je_yF0dgc-s9gB7LLsfOg0b05xcwIFJbaqpVytxWv5A/edit?usp=sharing/ Présentation]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1y_NMo9XKJ0WzwE2zmcRblUyuIebwfoN8?usp=sharing/ Régression linéaire]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1bRyrnL1JM870cEcEvfGaS8ItrG16rchy?usp=sharing/ Google Colab]&lt;/div&gt;</summary>
		<author><name>Abrossas</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=87694</id>
		<title>IMA3/IMA4 2020/2022 P5</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=87694"/>
				<updated>2022-01-05T22:31:09Z</updated>
		
		<summary type="html">&lt;p&gt;Abrossas : /* Semestre 7 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #C2E5FF; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Présentation générale''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
==Contexte==&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce projet est la mise en place d’algorithmes de machine learning afin de diagnostiquer l’état de machines industrielles. Nous travaillons sur ce projet durant 2 semestres. Durant le premier semestre, nous avions comme objectifs d’acquérir la maîtrise des différentes librairies primordiales pour traiter les données en machine learning, ainsi que d’étudier et d’utiliser certains algorithmes basiques (régression linéaire, logistique, Bayes) sur des datasets que nous traiterons nous même.&lt;br /&gt;
&lt;br /&gt;
==Répartition des tâches==&lt;br /&gt;
&lt;br /&gt;
===Semestre 6===&lt;br /&gt;
&lt;br /&gt;
Au début, comme le sujet était flou pour une majorité d’entre nous, nous nous sommes documentés tous ensemble sur différents livres à propos du machine learning et avons compris l’importance des librairies associées au machine learning.&lt;br /&gt;
Après s’être suffisamment documenté, 3 d’entre nous devaient réaliser un rapport sur les différentes librairies (Numpy pour Loïc, Pandas pour Tom, Seaborn pour Aymen), celui-ci se devait d’être assez explicite afin que les autres n’ayant pas travaillé sur ces librairies puissent acquérir des connaissances facilement en le lisant, Florian et Antoine, quant à eux, se sont occupées d’implémenter et d’analyser une première méthode de machine learning, la régression linéaire, et d’en effectuer un rapport.&lt;br /&gt;
Ensuite, une partie d’entre nous s’est intéressée à d’autres algorithmes de machine learning (Bayes pour Loïc et régression logistique pour Antoine) tandis que Florian et Tom se sont intéressées à diverses méthodes de pré-traitement de données (méthode SMOTE pour l’oversampling) à appliquer sur une base de données existantes et Aymen s’est occupé de la partie évaluation de l’efficacité d’un algorithme (avec notamment l’importance de la matrice de confusion).&lt;br /&gt;
&lt;br /&gt;
===Semestre 7===&lt;br /&gt;
Durant ce semestre, certains d’entre nous (Aymen, Loïc et Florian) se sont documentés sur les différentes méthodes pour créer notre propre dataset afin de les mettre en place ultérieurement pendant que d’autres (Tom et Antoine) se renseignaient sur différentes méthodes de pré-traitement des datasets (random,...) afin de les réaliser sur la dataset créée&lt;br /&gt;
&lt;br /&gt;
==Cahier des charges==&lt;br /&gt;
&lt;br /&gt;
'''Ressources disponibles :'''&lt;br /&gt;
&lt;br /&gt;
Livres sur le machine learning&lt;br /&gt;
&lt;br /&gt;
Bases de données (afin d'appliquer divers algorithmes de machine learning) que nous prendrons sur ces sites :&lt;br /&gt;
https://www.kaggle.com/datasets&lt;br /&gt;
https://archive.ics.uci.edu/ml/datasets.php&lt;br /&gt;
&lt;br /&gt;
Librairies Python (Scikit-learn, Pandas, Numpy, Seaborn, Matplotlib)&lt;br /&gt;
&lt;br /&gt;
'''Objectifs poursuivis :'''&lt;br /&gt;
&lt;br /&gt;
Détecter les dysfonctionnements de systèmes mécatroniques (par exemple les robots Khepera, Robotino…), grâce au machine learning.&lt;br /&gt;
&lt;br /&gt;
Apprendre à implémenter différentes méthodes machine learning .&lt;br /&gt;
&lt;br /&gt;
'''Profil du public cible :'''&lt;br /&gt;
&lt;br /&gt;
Secteur mécatronique&lt;br /&gt;
&lt;br /&gt;
Entreprises disposant d'ingénieurs pour maintenir le système informatique opérationnel&lt;br /&gt;
&lt;br /&gt;
Entreprises utilisant des machines dans tous les secteurs&lt;br /&gt;
&lt;br /&gt;
'''Analyse des besoins :'''&lt;br /&gt;
&lt;br /&gt;
L’industrie a de plus en plus besoin du machine learning pour détecter les erreurs des systèmes. En effet, cette technologie devient indispensable pour les industriels, notamment afin d'accroître la productivité et l’efficacité des systèmes industriels. Notamment dans le cadre de l'industrie 4.0.&lt;br /&gt;
&lt;br /&gt;
Le programme peut ne pas être aussi rapide et optimisé en espace mémoire que d'autres programmes, nous visons l’efficacité de notre algorithme plutôt que la rapidité.&lt;br /&gt;
&lt;br /&gt;
==Recherche bibliographique==&lt;br /&gt;
&lt;br /&gt;
* https://www.wikipedia.com&lt;br /&gt;
&lt;br /&gt;
* https://www.jybaudot.fr&lt;br /&gt;
&lt;br /&gt;
* https://datascientest.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.ipgirl.com&lt;br /&gt;
&lt;br /&gt;
* Cours de probabilités et statistiques de l’Université Jules Vernes&lt;br /&gt;
&lt;br /&gt;
* Chaine youtube Machine Learning : https://www.youtube.com/channel/UCmpptkXu8iIFe6kfDK5o7VQ&lt;br /&gt;
&lt;br /&gt;
* Machine Learning with scikit-learn Quick Start Guide écrit par Kevin Jolly&lt;br /&gt;
&lt;br /&gt;
* https://lucidar.me/&lt;br /&gt;
&lt;br /&gt;
* https://archive.ics.uci.edu/ml/datasets.php&lt;br /&gt;
&lt;br /&gt;
* https://www.kaggle.com/datasets&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com/&lt;br /&gt;
&lt;br /&gt;
* Machine Learning algorithms - Second Edition écrit par Giuseppe Bonaccorso&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com&lt;br /&gt;
&lt;br /&gt;
* https://towardsdatascience.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.learndatasci.com/&lt;br /&gt;
&lt;br /&gt;
==Rapports et présentation==&lt;br /&gt;
&lt;br /&gt;
===Librairies===&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1CQZ1s6fNY_6MsmbBa5TP1OzSedqFeaWI?usp=sharing/ Rapport Numpy]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1tdu_B2wRsUiqdnSeskQENdn_wX3pJMeT?usp=sharing/ Rapport Pandas]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1DPS4ZT91SIEhscwST8kfER7u21tKoM3a?usp=sharing/ Rapport Seaborn]&lt;br /&gt;
&lt;br /&gt;
===Rapports===&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/document/d/1yR0vLePV3hI1_HVtTZWwGIwy0Cb-oLOsOTK3Um5KAYE/edit?usp=sharing/ Rapport]&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/presentation/d/1Je_yF0dgc-s9gB7LLsfOg0b05xcwIFJbaqpVytxWv5A/edit?usp=sharing/ Présentation]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1y_NMo9XKJ0WzwE2zmcRblUyuIebwfoN8?usp=sharing/ Régression linéaire]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1bRyrnL1JM870cEcEvfGaS8ItrG16rchy?usp=sharing/ Google Colab]&lt;/div&gt;</summary>
		<author><name>Abrossas</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=87687</id>
		<title>IMA3/IMA4 2020/2022 P5</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=87687"/>
				<updated>2022-01-05T21:59:55Z</updated>
		
		<summary type="html">&lt;p&gt;Abrossas : /* Cahier des charges */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #C2E5FF; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Présentation générale''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
==Contexte==&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce projet est la mise en place d’algorithmes de machine learning afin de diagnostiquer l’état de machines industrielles. Nous travaillons sur ce projet durant 2 semestres. Durant le premier semestre, nous avions comme objectifs d’acquérir la maîtrise des différentes librairies primordiales pour traiter les données en machine learning, ainsi que d’étudier et d’utiliser certains algorithmes basiques (régression linéaire, logistique, Bayes) sur des datasets que nous traiterons nous même.&lt;br /&gt;
&lt;br /&gt;
==Répartition des tâches==&lt;br /&gt;
&lt;br /&gt;
===Semestre 6===&lt;br /&gt;
&lt;br /&gt;
Au début, comme le sujet était flou pour une majorité d’entre nous, nous nous sommes documentés tous ensemble sur différents livres à propos du machine learning et avons compris l’importance des librairies associées au machine learning.&lt;br /&gt;
Après s’être suffisamment documenté, 3 d’entre nous devaient réaliser un rapport sur les différentes librairies (Numpy pour Loïc, Pandas pour Tom, Seaborn pour Aymen), celui-ci se devait d’être assez explicite afin que les autres n’ayant pas travaillé sur ces librairies puissent acquérir des connaissances facilement en le lisant, Florian et Antoine, quant à eux, se sont occupées d’implémenter et d’analyser une première méthode de machine learning, la régression linéaire, et d’en effectuer un rapport.&lt;br /&gt;
Ensuite, une partie d’entre nous s’est intéressée à d’autres algorithmes de machine learning (Bayes pour Loïc et régression logistique pour Antoine) tandis que Florian et Tom se sont intéressées à diverses méthodes de pré-traitement de données (méthode SMOTE pour l’oversampling) à appliquer sur une base de données existantes et Aymen s’est occupé de la partie évaluation de l’efficacité d’un algorithme (avec notamment l’importance de la matrice de confusion).&lt;br /&gt;
&lt;br /&gt;
===Semestre 7===&lt;br /&gt;
&lt;br /&gt;
==Cahier des charges==&lt;br /&gt;
&lt;br /&gt;
'''Ressources disponibles :'''&lt;br /&gt;
&lt;br /&gt;
Livres sur le machine learning&lt;br /&gt;
&lt;br /&gt;
Bases de données (afin d'appliquer divers algorithmes de machine learning) que nous prendrons sur ces sites :&lt;br /&gt;
https://www.kaggle.com/datasets&lt;br /&gt;
https://archive.ics.uci.edu/ml/datasets.php&lt;br /&gt;
&lt;br /&gt;
Librairies Python (Scikit-learn, Pandas, Numpy, Seaborn, Matplotlib)&lt;br /&gt;
&lt;br /&gt;
'''Objectifs poursuivis :'''&lt;br /&gt;
&lt;br /&gt;
Détecter les dysfonctionnements de systèmes mécatroniques (par exemple les robots Khepera, Robotino…), grâce au machine learning.&lt;br /&gt;
&lt;br /&gt;
Apprendre à implémenter différentes méthodes machine learning .&lt;br /&gt;
&lt;br /&gt;
'''Profil du public cible :'''&lt;br /&gt;
&lt;br /&gt;
Secteur mécatronique&lt;br /&gt;
&lt;br /&gt;
Entreprises disposant d'ingénieurs pour maintenir le système informatique opérationnel&lt;br /&gt;
&lt;br /&gt;
Entreprises utilisant des machines dans tous les secteurs&lt;br /&gt;
&lt;br /&gt;
'''Analyse des besoins :'''&lt;br /&gt;
&lt;br /&gt;
L’industrie a de plus en plus besoin du machine learning pour détecter les erreurs des systèmes. En effet, cette technologie devient indispensable pour les industriels, notamment afin d'accroître la productivité et l’efficacité des systèmes industriels. Notamment dans le cadre de l'industrie 4.0.&lt;br /&gt;
&lt;br /&gt;
Le programme peut ne pas être aussi rapide et optimisé en espace mémoire que d'autres programmes, nous visons l’efficacité de notre algorithme plutôt que la rapidité.&lt;br /&gt;
&lt;br /&gt;
==Recherche bibliographique==&lt;br /&gt;
&lt;br /&gt;
* https://www.wikipedia.com&lt;br /&gt;
&lt;br /&gt;
* https://www.jybaudot.fr&lt;br /&gt;
&lt;br /&gt;
* https://datascientest.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.ipgirl.com&lt;br /&gt;
&lt;br /&gt;
* Cours de probabilités et statistiques de l’Université Jules Vernes&lt;br /&gt;
&lt;br /&gt;
* Chaine youtube Machine Learning : https://www.youtube.com/channel/UCmpptkXu8iIFe6kfDK5o7VQ&lt;br /&gt;
&lt;br /&gt;
* Machine Learning with scikit-learn Quick Start Guide écrit par Kevin Jolly&lt;br /&gt;
&lt;br /&gt;
* https://lucidar.me/&lt;br /&gt;
&lt;br /&gt;
* https://archive.ics.uci.edu/ml/datasets.php&lt;br /&gt;
&lt;br /&gt;
* https://www.kaggle.com/datasets&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com/&lt;br /&gt;
&lt;br /&gt;
* Machine Learning algorithms - Second Edition écrit par Giuseppe Bonaccorso&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com&lt;br /&gt;
&lt;br /&gt;
* https://towardsdatascience.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.learndatasci.com/&lt;br /&gt;
&lt;br /&gt;
==Rapports et présentation==&lt;br /&gt;
&lt;br /&gt;
===Librairies===&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1CQZ1s6fNY_6MsmbBa5TP1OzSedqFeaWI?usp=sharing/ Rapport Numpy]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1tdu_B2wRsUiqdnSeskQENdn_wX3pJMeT?usp=sharing/ Rapport Pandas]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1DPS4ZT91SIEhscwST8kfER7u21tKoM3a?usp=sharing/ Rapport Seaborn]&lt;br /&gt;
&lt;br /&gt;
===Rapports===&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/document/d/1yR0vLePV3hI1_HVtTZWwGIwy0Cb-oLOsOTK3Um5KAYE/edit?usp=sharing/ Rapport]&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/presentation/d/1Je_yF0dgc-s9gB7LLsfOg0b05xcwIFJbaqpVytxWv5A/edit?usp=sharing/ Présentation]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1y_NMo9XKJ0WzwE2zmcRblUyuIebwfoN8?usp=sharing/ Régression linéaire]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1bRyrnL1JM870cEcEvfGaS8ItrG16rchy?usp=sharing/ Google Colab]&lt;/div&gt;</summary>
		<author><name>Abrossas</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=87476</id>
		<title>IMA3/IMA4 2020/2022 P5</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=IMA3/IMA4_2020/2022_P5&amp;diff=87476"/>
				<updated>2021-12-27T13:25:38Z</updated>
		
		<summary type="html">&lt;p&gt;Abrossas : /* S6 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= &amp;lt;div class=&amp;quot;mcwiki-header&amp;quot; style=&amp;quot;border-radius: 15px; padding: 15px; font-weight: bold; text-align: center; font-size: 80%; background: #C2E5FF; vertical-align: top; width: 98%;&amp;quot;&amp;gt; '''Présentation générale''' &amp;lt;/div&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
==Contexte==&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce projet est la mise en place d’algorithmes de machine learning afin de diagnostiquer l’état de machines industrielles. Nous travaillons sur ce projet durant 2 semestres. Durant le premier semestre, nous avions comme objectifs d’acquérir la maîtrise des différentes librairies primordiales pour traiter les données en machine learning, ainsi que d’étudier et d’utiliser certains algorithmes basiques (régression linéaire, logistique, Bayes) sur des datasets que nous traiterons nous même.&lt;br /&gt;
&lt;br /&gt;
==Répartition des tâches==&lt;br /&gt;
&lt;br /&gt;
===Semestre 6===&lt;br /&gt;
&lt;br /&gt;
Au début, comme le sujet était flou pour une majorité d’entre nous, nous nous sommes documentés tous ensemble sur différents livres à propos du machine learning et avons compris l’importance des librairies associées au machine learning.&lt;br /&gt;
Après s’être suffisamment documenté, 3 d’entre nous devaient réaliser un rapport sur les différentes librairies (Numpy pour Loïc, Pandas pour Tom, Seaborn pour Aymen), celui-ci se devait d’être assez explicite afin que les autres n’ayant pas travaillé sur ces librairies puissent acquérir des connaissances facilement en le lisant, Florian et Antoine, quant à eux, se sont occupées d’implémenter et d’analyser une première méthode de machine learning, la régression linéaire, et d’en effectuer un rapport.&lt;br /&gt;
Ensuite, une partie d’entre nous s’est intéressée à d’autres algorithmes de machine learning (Bayes pour Loïc et régression logistique pour Antoine) tandis que Florian et Tom se sont intéressées à diverses méthodes de pré-traitement de données (méthode SMOTE pour l’oversampling) à appliquer sur une base de données existantes et Aymen s’est occupé de la partie évaluation de l’efficacité d’un algorithme (avec notamment l’importance de la matrice de confusion).&lt;br /&gt;
&lt;br /&gt;
===Semestre 7===&lt;br /&gt;
&lt;br /&gt;
==Cahier des charges==&lt;br /&gt;
&lt;br /&gt;
'''Ressources disponibles :'''&lt;br /&gt;
&lt;br /&gt;
Livres sur le machine learning&lt;br /&gt;
&lt;br /&gt;
Bases de données (afin d'appliquer divers algorithmes de machine learning) que nous prendrons sur ces sites :&lt;br /&gt;
https://www.kaggle.com/datasets&lt;br /&gt;
https://archive.ics.uci.edu/ml/datasets.php&lt;br /&gt;
&lt;br /&gt;
Librairies Python (Scikit-learn, Pandas, Numpy, Seaborn, Matplotlib)&lt;br /&gt;
&lt;br /&gt;
'''Objectifs poursuivis :'''&lt;br /&gt;
&lt;br /&gt;
Détecter les dysfonctionnements de systèmes mécatroniques (par exemple les robots Khepera, Robotino…), grâce au machine learning.&lt;br /&gt;
&lt;br /&gt;
Apprendre à implémenter différentes méthodes machine learning .&lt;br /&gt;
&lt;br /&gt;
'''Profil du public cible :'''&lt;br /&gt;
&lt;br /&gt;
Secteur mécatronique&lt;br /&gt;
&lt;br /&gt;
Entreprises disposant d'ingénieurs pour maintenir le système informatique opérationnel&lt;br /&gt;
&lt;br /&gt;
Entreprises utilisant des machines dans tous les secteurs&lt;br /&gt;
&lt;br /&gt;
'''Analyse des besoins :'''&lt;br /&gt;
&lt;br /&gt;
L’industrie a de plus en plus besoin du machine learning pour détecter les erreurs des systèmes. En effet, cette technologie devient indispensable pour les industriels, notamment afin d'accroître la productivité et l’efficacité des systèmes industriels.&lt;br /&gt;
&lt;br /&gt;
Le programme peut ne pas être aussi rapide et optimisé en espace mémoire que d'autres programmes, nous visons l’efficacité de notre algorithme plutôt que la rapidité.&lt;br /&gt;
&lt;br /&gt;
==Recherche bibliographique==&lt;br /&gt;
&lt;br /&gt;
* https://www.wikipedia.com&lt;br /&gt;
&lt;br /&gt;
* https://www.jybaudot.fr&lt;br /&gt;
&lt;br /&gt;
* https://datascientest.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.ipgirl.com&lt;br /&gt;
&lt;br /&gt;
* Cours de probabilités et statistiques de l’Université Jules Vernes&lt;br /&gt;
&lt;br /&gt;
* Chaine youtube Machine Learning : https://www.youtube.com/channel/UCmpptkXu8iIFe6kfDK5o7VQ&lt;br /&gt;
&lt;br /&gt;
* Machine Learning with scikit-learn Quick Start Guide écrit par Kevin Jolly&lt;br /&gt;
&lt;br /&gt;
* https://lucidar.me/&lt;br /&gt;
&lt;br /&gt;
* https://archive.ics.uci.edu/ml/datasets.php&lt;br /&gt;
&lt;br /&gt;
* https://www.kaggle.com/datasets&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com/&lt;br /&gt;
&lt;br /&gt;
* Machine Learning algorithms - Second Edition écrit par Giuseppe Bonaccorso&lt;br /&gt;
&lt;br /&gt;
* https://www.datacamp.com&lt;br /&gt;
&lt;br /&gt;
* https://towardsdatascience.com/&lt;br /&gt;
&lt;br /&gt;
* https://www.learndatasci.com/&lt;br /&gt;
&lt;br /&gt;
==Rapports et présentation==&lt;br /&gt;
&lt;br /&gt;
===Librairies===&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1CQZ1s6fNY_6MsmbBa5TP1OzSedqFeaWI?usp=sharing/ Rapport Numpy]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1tdu_B2wRsUiqdnSeskQENdn_wX3pJMeT?usp=sharing/ Rapport Pandas]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1DPS4ZT91SIEhscwST8kfER7u21tKoM3a?usp=sharing/ Rapport Seaborn]&lt;br /&gt;
&lt;br /&gt;
===Rapports===&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/document/d/1yR0vLePV3hI1_HVtTZWwGIwy0Cb-oLOsOTK3Um5KAYE/edit?usp=sharing/ Rapport]&lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/presentation/d/1Je_yF0dgc-s9gB7LLsfOg0b05xcwIFJbaqpVytxWv5A/edit?usp=sharing/ Présentation]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1y_NMo9XKJ0WzwE2zmcRblUyuIebwfoN8?usp=sharing/ Régression linéaire]&lt;br /&gt;
&lt;br /&gt;
* [https://colab.research.google.com/drive/1bRyrnL1JM870cEcEvfGaS8ItrG16rchy?usp=sharing/ Google Colab]&lt;/div&gt;</summary>
		<author><name>Abrossas</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Projets_IMA3_IMA4_2020/2022&amp;diff=87475</id>
		<title>Projets IMA3 IMA4 2020/2022</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Projets_IMA3_IMA4_2020/2022&amp;diff=87475"/>
				<updated>2021-12-27T12:58:51Z</updated>
		
		<summary type="html">&lt;p&gt;Abrossas : /* Répartition des binômes 2021/2022 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Répartition des binômes 2021/2022 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Projet !! Encadrants école !! Eleves&lt;br /&gt;
|-&lt;br /&gt;
| P8 [[IMA3/IMA4 2020/2022 P8|Objet connecté pour la gestion des applications]]&lt;br /&gt;
| Thomas Vantroys&lt;br /&gt;
| Aymerick SERGEANT / Alix DUFOUR / Thibault MEYNIER / Arthur VAIN / Maxime BALBASTRE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| P5 [[IMA3/IMA4 2020/2022 P5|Machine learning pour le diagnostic de machines défectueuses]]&lt;br /&gt;
| Othman Lakhal / K. Midzodzi PEKPE&lt;br /&gt;
| Antoine BROSSAS / Tom CARRERE / Loïc BAL  / Aymen BACCAR / Florian DERLIQUE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| P6 [[IMA3/IMA4 2020/2022 P6|Network monitoring]]&lt;br /&gt;
| Thomas Vantroys&lt;br /&gt;
| Valentin DOSIAS/ Simon DOUTEAU / Théo LEFEBVRE/ Tristan PAYEN&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| P7 [[IMA3/IMA4 2020/2022 P4|Conception et commande d'un minisegway]]&lt;br /&gt;
| Midzodzi Pekpe / Othman Lakhal&lt;br /&gt;
| Maxence Neus/ Omar Sifa / Logan Paquin/ Ayman Moummadi&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| P1 [[IMA3/IMA4 2020/2022 P1|Emulation d'une ferme éolienne connectée au réseau]]&lt;br /&gt;
| Florian CHEVALIER / Betty SEMAIL / Philippe DELARUE / Abdelkader BENABOU&lt;br /&gt;
| LACROIX Héloïse / WANG Miaoqi / HENRY Flavie / MAZOUZI Janet&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| P11 [[IMA3/IMA4 2020/2022 P11|Mise en place d'un réseau de capteurs dans les salles de Polytech]]&lt;br /&gt;
| Thomas Vantroys&lt;br /&gt;
| Yanis LACROIX/ Florian VALLEE / Haitam BLGRIM/ Abdelillah EL KHOTRI&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| P14 [[IMA3/IMA4 2020/2022 P13|Maquette virtuelle pour les cours/TP traitements d'image &amp;quot;pick and drop&amp;quot;]]&lt;br /&gt;
| Othman Lakhal / Blaise Conrard &lt;br /&gt;
| Brahim LEMRABET / Ayoub ER-REGUYBY &lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| P9 [[IMA3/IMA4 2020/2022 P9|Conception et commande d'un bras manipulateur flexible ]]&lt;br /&gt;
| Othman Lakhal / K. Midzodzi PEKPE&lt;br /&gt;
| Sami AGGAR / Ali KHALAF / Florian PRIN / Ilyass MEHARZI&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| P4 [[IMA3/IMA4 2020/2022 P7|Conception d'une mangeoire connectée]]&lt;br /&gt;
| Thomas Vantroys&lt;br /&gt;
| BLONDELLE Victor, GARIN Benoit, GIELEN Corentin, LAURENT Maxence, PAPASEIT Matthieu&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| P2 [[IMA3/IMA4 2020/2022 P2|Véhicule Autonome]]&lt;br /&gt;
| Midzodzi Pekpe / Othman Lakhal&lt;br /&gt;
| Clément KOPERSKI / Konstantin PATRIKEEV / Julien DUMON / Ronan SING&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| P3 [[IMA3/IMA4 2020/2022 P3|Conception et commande d'un Drone]]&lt;br /&gt;
| Midzodzi Pekpe / Othman Lakhal&lt;br /&gt;
| Louise Maës / Léo Poumaer / Niels Godbert / Rémi Brachot / Lucas Postollec / Chaimae Yasmine &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Abrossas</name></author>	</entry>

	</feed>