S’amuser avec le Machine Learning!

L’introduction au Machine Learning la plus simple au monde

Cet article nécessite très peu de connaissances mathématiques & informatiques.( texte original : https://medium.com/@ageitgey/machine-learning-is-fun-80ea3ec3c471#.2do9stxaw )

Préface

Ayant tout d’abord voulu écrire un article sur l’Intelligence Artificielle, je me suis rendu compte qu’il en existait déjà de très bons, mais malheureusement peu accessibles à ceux ne pratiquant pas l’anglais technique. De nombreuses lectures plus tard, j’ai finalement contacté Adam Geitgey afin de savoir si je pouvais officiellement traduire sa série de papiers. Après m’avoir envoyé une réponse positive et validé mes retouches, voici la première partie (d’autres suivront en 2017). Bonne lecture !

http://image.slidesharecdn.com/deepdiveinaimlventurelandscape-150831132221-lva1-app6891/95/deepdive-in-aiml-venture-landscape-by-ajit-nazre-rahul-garg-3-638.jpg?cb=1441027412

Vous avez déjà entendu parler du Machine Learning mais vous n’avez qu’une vague idée de ce que cela signifie ? Vous en avez assez d’hocher machinalement la tête lors de vos discussions entre collègues ? Alors vous êtes au bon endroit !

Ce guide est dédié à toutes les personnes curieuses d’en savoir plus sur le Machine Learning mais qui ne savent pas par où commencer. J’imagine que certain d’entre vous ont déjà essayé de s’immiscer dans ce sujet à partir de Wikipédia, mais que vous avez aussitôt abandonné, frustré, espérant qu’un proche technophile allait pouvoir vous en donner une explication plus simple. C’est le but de cet article.

L’objectif est d’être accessible à tous — ce qui signifie qu’il y aura beaucoup de généralités. Mais on s’en fiche. Si cela permet à quiconque de s’intéresser davantage au Machine Learning, alors la mission est accomplie.


Qu’est ce que le Machine Learning ?

Le Machine Learning est un concept stipulant qu’il existe des algorithmes génériques pouvant nous révéler des informations intéressantes sur des données, sans avoir besoin de construire ou de développer un code spécifique. Au lieu d’écrire du code, vous nourrissez donc ces algorithmes avec des données qui leur permettront de construire leurs propres logiques.

Prenons par exemple l’algorithme de classification. Il permet de classer des données en groupes. Cet algorithme, utilisé pour la reconnaissance manuscrite des nombres, peut aussi servir à classer des mails entre spam et non-spam, cela sans changer une ligne de code. C’est le même algorithme, mais nourrit de façon différente il développe une logique de classification différente.

Cet algorithme de Machine Learning est une boite noire pouvant être ré-utilisée pour résoudre différents problèmes de classifications

Le “Machine Learning” est un terme englobant un grand nombre de ces algorithmes génériques.

Les deux types d’algorithmes de Machine Learning

Vous pouvez diviser le Machine Learning en deux principales catégories : l’Apprentissage Supervisé et l’Apprentissage non-Supervisé. La différence est simple mais très importante.

L’Apprentissage Supervisé

Mettons que vous êtes un agent immobilier. Votre business est en train de grossir, vous décidez donc d’embaucher une flopée de recrues afin de vous aider dans vos tâches. Cependant il y a un soucis— un simple coup d’oeil sur une maison vous permet d’en connaître sa valeur, mais les nouveaux agents n’ont pas votre expérience et ne savent pas comment en déterminer le prix.

Afin de les aider (et de prendre des vacances par la même occasion), vous décidez de développer une petite application permettant d’estimer la valeur d’une maison en se basant sur ses caractéristiques (sa taille, son quartier etc…) et à combien des maisons similaires ont été vendues.

Pendant trois mois, vous notez minutieusement chaque vente qui s’effectue. Pour chaque maison, vous notez toutes ses caractéristiques — nombre de chambres, taille en m², quartier etc. Mais le plus important, c’est que vous notez aussi le prix final :

Ce sont nos “training data” (données d’entrainement)

En nous servant de ces données, nous souhaitons créer un programme permettant d’estimer la valeur de n’importe quelle autre maison.

Nous voulons utiliser les données précédentes afin de déterminer le prix des autres maisons.

C’est ce qu’on appelle de l’apprentissage supervisé. Vous savez combien chaque maison a été vendue, donc en d’autres termes, vous connaissez la réponse au problème et il suffit de travailler à reculons à partir de là afin de comprendre la logique s’en dégageant.

Pour construire votre application, vous nourrissez l’algorithme de Machine Learning avec les données de vente que vous aviez notées sur chaque maison. L’algorithme se charge lui de définir quelles formules mathématiques doivent être appliqués afin de trouver le meilleur résultat.

Cela revient à trouver le résultat d’un devoir de maths avec tous les signes arithmétiques effacés :

Oh non ! Un étudiant maladroit a effacé les symboles arithmétiques !

A partir de cela, pouvez-vous retrouver le type de problème mathématique auquel nous avions affaire ? Vous vous doutez seulement que vous devez “faire quelque chose” avec les nombre à gauche afin d’obtenir les résultats de droite.

En apprentissage supervisé, vous laissez l’ordinateur faire ces relations à votre place. Et une fois que vous savez quelles opérations ont été nécessaires pour résoudre ce problème, vous pourrez répondre à tous les problèmes du même type !

L’Apprentissage non-Supervisé

Revenons à notre agent immobilier. Que faire si vous ne connaissez pas le prix de vente final de chaque maison ? Première étape : ne paniquez pas! Même si tout ce que vous connaissez est la taille, la localisation etc de chaque maison, vous pouvez quand même faire des choses sympas grâce à l’Apprentissage non-Supervisé.

Même si vous ne pouvez pas prédire une donnée inconnue (tel que le prix), vous pouvez faire des choses intéressantes avec le Machine Learning.

C’est comme si quelqu’un vous donnait une liste de nombre sur une feuille de papier et vous disait “Je ne sais pas vraiment ce que ces nombres signifient mais peut-être qu’il y a un schéma qui se répète ou des groupes ou quelque chose — bonne chance!”

Alors que faire de ces données ? Pour commencer, vous pourriez avoir un algorithme qui identifie automatiquement les différents marchés. Peut-être que vous découvrirez que les acheteurs près de l’université adorent les petites maisons avec beaucoup de chambre, alors que ceux des banlieues préfèrent les maisons 3-chambres avec beaucoup de superficie. Connaître tous ces types d’acheteurs peut vous aider fortement au niveau du marketing.

Une autre chose sympa que vous pouvez faire, c’est d’identifier automatiquement les lieux atypiques qui sont vraiment différents du reste. Peut-être que ces maisons sont de géantes villas sur lesquelles il faudrait donc envoyer vos meilleurs agents.

Dans la suite de l’article, nous nous concentrerons davantage sur l’ Apprentissage Supervisé, mais ce n’est pas parce l’Apprentissage non-Supervisé est moins important ou moins intéressant. En fait, l’objectif des méthodes d’Apprentissage non-Supervisé est de permettre une extraction de connaissances organisées à partir de données. Il ne s’agit donc pas d’une simple réponse à une question.

Note pour les pédants : Il existe d’autres catégories de Machine Learning. Mais les deux précédentes sont un bon début pour commencer.

Tout ça c’est cool, mais en quoi estimer le prix d’une maison relève vraiment de “l’apprentissage” ?

En tant qu’humain, votre cerveau peut être confronté à de multiples situations et sait les traiter sans avoir besoin d’instructions spécifiques au préalable. Si vous vendez des maisons depuis longtemps, vous aurez certainement un instinct concernant le prix de vente, le meilleur moyen de la vendre, le type de client potentiellement intéressé etc. Le but des algorithmes d’IA forte est d’être capable de reproduire ce comportement sur des ordinateurs.

Mais les algorithmes de Machine Learning ne sont pas encore suffisamment développés — ils ne fonctionnent que lorsqu’ils ont affaire à des cas très spécifiques. Peut-être qu’ici une meilleure définition de l’ “apprentissage” serait “trouver une équation permettant de résoudre un cas spécifique à partir d’exemples de données”.

Malheureusement “trouver une équation permettant de résoudre un cas spécifique à partir d’exemples de données” n’est pas un nom très vendeur. Nous avons donc opté pourMachine Learningà la place.

Bien entendu, si vous êtes en train de lire ceci 50 ans dans le futur et que nous avons découvert un algorithme d’IA forte, alors cet article vous paraîtra quelque peu pittoresque.Arrêtez donc de le lire et demandez à votre robot-serviteur de vous faire un sandwich, humain du futur.

Écrivons ce programme !

Bref, revenons à nos moutons. De quelle manière allez-vous vous y prendre pour estimer la valeur de la maison ? Réfléchissez-y une seconde avant de continuer la lecture de l’article.

Si vous ne savez vraiment rien du Machine Learning, vous écrirez probablement quelques règles basiques comme celles-ci :

def estimation_prix_vente_maison(nombre_de_chambres, superficie, quartier):
prix = 0
# A côté de chez moi, le prix moyen au m² est de 200€ 
prix_par_metre_carre = 200
if quartier == "paris16":
# mais quelques quartiers sont plus chers...
prix_par_metre_carre = 400
elif quartier== "paris18":
# ...et d'autres moins
prix_par_metre_carre= 100
# commençons avec un prix estimé à partir de la superficie du lieu
prix = prix_par_metre_carre * superficie
# ajustons maintenant notre prix en fonction du nombre de chambres
if nombre_de_chambres == 0:
# les studios sont moins chers (moins de murs)
prix = prix— 20000
else:
# les lieux avec plus de chambres ont en général plus de valeurs
prix = prix + (nombre_de_chambres * 1000)
return prix

Si vous jonglez avec chaque paramètre des heures durant, vous pourriez arriver à quelque chose qui fonctionne. Mais votre programme ne sera jamais parfaitement exact et sera très compliqué à maintenir si les prix évoluent.

Ne serait-ce pas plus pratique si l’ordinateur pouvait faire ce travail à votre place ?

def estimation_prix_vente_maison(nombre_de_chambres, superficie, quartier):
prix = <ordinateur, fait le travail à ma place stp>
return prix

Une façon de voir la chose est de comparer le prix avec un délicieux pot-au-feu dont les ingrédients seraient le nombre de chambre, la superficie et le quartier. La quantité de chaque ingrédient à mélanger impacte forcément la recette finale. Il y a donc un ratio à trouver afin d’avoir un prix final le plus proche possible de la réalité.

Cela réduirait notre fonction initiale (avec tous ces if et else ) à quelque chose de vraiment simple comme cela:

def estimation_prix_vente_maison(nombre_de_chambres, superficie, quartier):
prix= 0
# une petite pincée de ceci
prix += nombre_de_chambres* .841231951398213
# et un gros pincée de cela
prix += superficie* 1231.1231231
# peut-être aussi une poignée de ça
prix += quartier* 2.3242341421
# et au final, un extra de sel pour les ajustements
prix += 201.23432095
return prix

J’espère que vous avez remarqué ces nombres magiques en gras — .841231951398213, 1231.1231231, 2.3242341421, et 201.23432095. Ce sont nos poids. Si nous arrivions à trouver le ratio parfait entre chacun de nos poids, notre fonction pourrait prédire le prix de toutes les maisons !

Une façon toute bête de trouver ce ratio serait de faire ceci:

Etape 1:

Commencez par fixer chaque poids sur 1.0 :

def estimation_prix_vente_maison(nombre_de_chambres, superficie, quartier):
prix= 0
# une petite pincée de ceci
prix += nombre_de_chambres* 1.0
# et un gros pincée de cela
prix += superficie* 1.0
# peut-être aussi une poignée de ça
prix += quartier* 1.0
# et au final, un extra de sel pour les ajustements
prix += 1.0
return prix

Etape 2:

Déroulez cet algorithme sur chacune des maisons dont vous connaissez le prix final et regardez si votre prédiction se rapproche du prix réel.

Utilisez votre fonction afin de prédire le prix de chaque maison

Par exemple, si la première maison s’est vendue à 250 000 $ mais que la fonction a prédis 178 000 $, alors il y a un écart de 72 000 $ en moins pour cette seule maison.

Calculez ainsi chaque écart en le multipliant au carré afin de n’avoir que des nombres positifs (-72 000*-72 000 pour la première ligne donc). Mettons que vous ayez 500 maisons dans votre tableau et que la somme des carré de chaque écart fasse un grand total de 86 123 373 $. Ce nombre représentera l’“inexactitude” actuelle de votre fonction.

Maintenant, prenez ce grand total et divisez-le par 500 pour avoir une moyenne des écarts de chaque maison. Appelez cette moyenne le coût de la fonction.

Si vous arrivez à atteindre un coût de 0 en ayant jonglé avec les poids, alors votre fonction est parfaite. Cela signifie que pour chaque cas, la fonction prédit parfaitement le coût de la maison en fonction des autres maisons. Donc c’est notre objectif — trouver le coût le plus bas possible en modifiant les différents poids à notre disposition.

Etape 3:

Répétez l’étape 2 encore et encore avec chaque combinaison de poids possible. Quelque soit la combinaison, celle qui s’approche un peu plus du zéro est celle à utiliser ! Le processus se termine lorsque le zéro est atteint !

Miracle!

C’était plutôt simple, non ? Réfléchissez un peu sur ce que vous venez tout juste de faire. Vous avez pris quelques données, vous les avez jetées dans trois étapes génériques et très simples , pour au final vous retrouver avec une fonction pouvant deviner le prix de n’importe quel maison près de chez vous ! Prend garde à toi Century21 !

Mais voici quelques anecdotes supplémentaires qui vous retourneront davantage le cerveau :

  1. Les recherches dans de nombreux sujets (en linguistique comme en traduction) des 40 dernières années ont montré que ces algorithmes d’apprentissage génériques surpassent de loin l’approche des “règles” explicites. Le “bête” processus de Machine Learning bat donc l’expert humain.
  2. La fonction finale est elle aussi complètement bête. Elle ne sait même pas ce qu’est une “chambre” ou une “superficie”. Tout ce qu’elle sait c’est qu’il faut mélanger ces nombres afin d’arriver à une réponse correcte.
  3. Il est très probable que vous n’ayez aucune idée de pourquoi cette combinaison particulière fonctionne. Donc vous avez écrit une fonction que vous ne comprenez pas vraiment mais dont vous pouvez prouver son efficacité
  4. Imaginez qu’au lieu de prendre des paramètres tels que “superficie” ou “nombre_de_chambres”, votre fonction prédictive utilisait un tableau de chiffres. Chacun d’entre eux représente la luminosité d’un pixel d’une image provenant d’un appareil-photo fixé sur le toit de votre voiture. Au lieu de prédire le prix d’une maison, la fonction prédis “tourner_le_volant_de_x_degrés”. Bravo ! Vous venez tout juste de créer une fonction de pilotage automatique.

C’est plutôt fou, hein ?

Revenons sur le “essayez toutes les combinaisons” de l’étape 3.

Bon, vous pouvez évidemment vous contenter d’essayer toutes les combinaisons de poids possibles et trouver celle qui convient le mieux. Cela vous prendrait littéralement une éternité car il y aura toujours des chiffres à tester.

Pour éviter cela, les mathématiciens ont découvert de nombreuses méthodes un peu plus intelligentes permettant de trouver rapidement les bonnes valeurs des poids sans avoir à en essayer beaucoup. Voici une façon de faire :

Premièrement, écrivons une équation simple représentant l’étape 2 vu précédemment:

C’est notre fonction de coût

Ré-écrivons maintenant exactement la même équation, mais en utilisant le jargon du Machine Learning (que vous pouvez ignorer pour le moment).

θ représente votre poids . J(θ) correspond au coût de la fonction lié à votre choix de poids.

Cette équation calcule l’erreur d’estimation de notre fonction de prix en fonction des poids que nous avons choisi.

De manière graphique, si nous exprimons toutes les valeurs possibles des poids nombre_de_chambres et superficie, nous aurions quelque chose de ce type :

Le graphe de notre fonction de coût ressemble à un bol. L’axe vertical représente le coût.

Dans ce graphe, le point le plus bas en bleu représente notre coût le plus bas -où notre fonction est la plus représentative. Les points les plus hauts représentant les fonctions les moins représentatives. Donc si nous arrivons à trouver la valeur des poids nous permettant d’accéder au point le plus bas, nous avons notre réponse !

Nous avons donc simplement besoin d’ajuster nos poids afin de descendre dans le graphe au point le plus bas. Si nous continuons à faire de petits ajustements permettant de nous y rapprocher au fur et à mesure, nous y arriverons éventuellement sans devoir tester trop de poids différents.

Si vous avez fait un peu de mathématiques, vous savez qu’en prenant la dérivé de la fonction vous obtiendrez la pente de la tangente de la fonction en tout point. En d’autres termes, cela vous permet de savoir quelle direction prendre pour descendre.

Donc, si nous calculons une dérivée partielle de notre fonction de coût par rapport à chacun de nos poids, nous pouvons soustraire cette valeur à chaque poids. Cela nous amènera un peu plus près de notre point. Continuez à le faire et, au final, vous l’atteindrez et aurez les meilleures valeurs possibles pour vos poids. (Si cela n’a aucun sens pour vous, ne vous inquiétez pas et continuez à lire).

Ceci est un résumé vulgarisé d’une façon de trouver les meilleurs poids pour votre fonction, appelée Algorithme du gradient stochastique. N’ayez pas peur de creuser plus profondément si vous souhaitez en apprendre davantage.

Lorsque vous vous servirez du Machine Learning afin de résoudre un problème, toute cette partie sera déjà automatiquement traitée pour vous. Mais c’est toujours bon d’avoir une idée concrète des opérations effectuées en amont.

Que nous avez-vous caché d’autre ?

L’algorithme en trois étapes que je vous ai décrit auparavant est appelé un “Modèle linéaire”. Vous estimez l’équation d’une droite correspondante à toutes vos maisons. Vous utilisez ensuite cette équation pour deviner le prix de vente des maisons que vous n’avez jamais vu avant, basé sur l’emplacement fictif que cette maison aurait sur votre droite.

En revanche, cette approche ne fonctionne qu’avec des cas simples. Cela est principalement dû au fait que les prix des maisons ne puissent pas toujours suivre une ligne continue.

Bien heureusement, il y a beaucoup de façon de régler ça. Il y a pléthore d’autres algorithmes de Machine Learning permettant de mieux appréhender les données non-linéaires (comme le Réseau de neurones artificiels ou bien la Machine à vecteurs de support avec des astuces du noyaux ). Il est aussi possible d’utiliser plus intelligemment la régression linéaire afin de nous permettre d’explorer des données plus complexes. Dans tous les cas, c’est le même principe qui s’applique : trouver les meilleurs poids.

J’ai aussi décide d’ignorer le surapprentissage. Il est facile de trouver un ensemble de poids qui fonctionne toujours parfaitement pour prédire les prix des maisons dans vos données d’origines, mais cet ensemble ne fonctionnera jamais réellement pour les nouvelles maisons qui n’étaient pas là initialement. Là encore il y a des méthodes de résolution (comme la Régularisation associée à la validation croisée des données).

En d’autres mots, Alors que le concept de base est assez simple, il faut néanmoins une certaine compétence et de l’expérience pour appliquer le Machine Learning et obtenir des résultats utiles. Mais ce sont des compétences qui sont à la portée de tous!

Est-ce que le Machine Learning est magique ?

Maintenant que vous commencez à percevoir la facilité avec laquelle les techniques de Machine Learning peuvent être appliquées (comme la reconnaissance d’écriture manuscrite), vous commencez à avoir le sentiment que vous pouvez utiliser le Machine Learning afin de résoudre n’importe quel problème et obtenir une réponse tant que vous avez assez de données. Il suffit juste de nourrir l’algorithme avec des données et de regarder l’ordinateur trouver l’équation qui correspond aux données par magie!

Mais il est important de se rappeler que le Machine Learning ne fonctionne que si le problème est soluble à partir des données que vous avez.

Par exemple, si vous construisez un modèle qui prédit les prix des maisons en fonction du type de plantes en pot dans chaque maison, cela ne fonctionnera jamais. Il n’y a tout simplement aucun type de relation entre les plantes en pot dans chaque maison et le prix de vente de la maison. Donc peu importe à quel point votre algorithme fonctionne, l’ordinateur n’arrivera jamais à déduire de relation entre les deux.

Vous ne pouvez modéliser que les relations qui existent déjà

Tâchez de vous rappeler que si un expert humain ne peut pas utiliser les données pour résoudre le problème manuellement, un ordinateur ne le saura probablement pas non plus. Au lieu de cela, concentrez-vous sur les problèmes qu’un être humain pourrait résoudre , mais sur lesquels il serait bien plus avantageux et rapide d’utiliser un ordinateur.

En apprendre davantage sur le Machine Learning

Selon moi, le principal problème actuel du Machine Learning vient du fait qu’il ne soit présent que dans le monde académique ou dans les secteurs de R&D. Il n’y a pas beaucoup de ressources accessibles pour les personnes qui souhaitent obtenir une compréhension générale sans devenir réellement des experts. Mais cela tend à s’améliorer.

Le cours de Machine Learning d’Andrew Ng sur Coursera est brillant. Je vous recommande fortement de commencer par là. C’est accessible à n’importe quelle personne se rappelant ses cours de maths de seconde.

Vous pouvez aussi faire joujou avec une tonne d’algorithmes de Machine Learning, en téléchargeant et en installant SciKit-Learn. Il s’agit d’une librairie python “boite noire”, faisant fonctionner les algorithmes standards sans connaissances poussées.


Si vous avez aimé cet article, abonnez-vous à ma newsletter sur le Machine Learning (en anglais). Je ne vous enverrai un mail que si je trouve quelque chose d’intéressant à partager.

Continuer à lire Machine Learning is Fun Part 2, Part 3, Part 4 and Part 5! (en anglais pour le moment)