Thématiques principales

Affichage des articles dont le libellé est Machine Learning. Afficher tous les articles
Affichage des articles dont le libellé est Machine Learning. Afficher tous les articles

vendredi 12 avril 2019

IA : Régression non linéaire avec scikit-learn

Dans les derniers articles nous avons vu l’astuce du noyau. Maintenant, nous allons le mettre en pratique avec un problème de régression non linéaire avec l’outil scikit learn [1].

Nous allons faire comme dans la problématique linéaire [2] , nous allons produire des données non linéaire parfaites que nous allons bruiter. Ensuite nous tâcherons d’extraire un modèles pour ces deux jeux de données et nous visualisons graphiquement comment celui ci se comporte.
Les données

Ainsi commençons par construire des données. D’un côté on va se donner un plage de données avec un pas important (ça limitera la quantité de données lors de l’apprentissage). Ensuite sur la base de ce résultat, on va générer une valeur aléatoire que l’on ajoutera où on retranchera à nos précédents résultats:


print(__doc__)
import numpy as np
from sklearn.svm import SVR
import matplotlib.pyplot as plt
import math

A=0.02
B=-12
C=51
D=2*math.pow(10,8)


X=np.arange(-1000,1000,35)
SIZE=np.size(X)
print(SIZE)
Y=(A*X**3+B*X**2+C*X+D)*0.00000001
Bruit=Y + np.random.randint(0,15, size=(1,SIZE))[0]*0.005*(np.random.rand(1,SIZE)-0.5)[0]


fig = plt.figure(1,figsize=(8,8))
plt.plot(X,Y,"bo")# model lineaire
plt.plot(X,Bruit,"r.")# model lineaire bruité
plt.show()

Si l’on visualise ces données, on obtient le graphe suivant (au passage on calcule l'écart moyen au carré du résultat de la prédiction avec la vraie données initiale):


Modèles

Ensuite on construit un modèle polynomial basé sur un degré 3 (ok on triche un peu on sait que nos données sont de degré 3), au passage on se construira un modèle linéaire histoire de comparer un peu.


svr_lin = SVR(kernel='linear', C=100, gamma='scale')
svr_poly = SVR(kernel='poly', C=100, gamma='scale', degree=3, epsilon=.001, coef0=2)
X_=X.reshape(-1, 1)

On va alors d’abord vérifier sur nos données non bruités ce que nos modèles sont capable de faire:


svrs = [svr_lin,svr_poly]
model_color = ['c', 'g']

fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(16, 8), sharey=True)
for index, svr in enumerate(svrs):
    PREDICT=svr.fit(X_, Y).predict(X_)
    axes[index].plot(X_, PREDICT, color=model_color[index], lw=2)
    # on affiche les points supports du SVM
    axes[index].scatter(X_[svr.support_], Y[svr.support_], facecolor="none",edgecolor=model_color[index])
    # les autres points qui ne sont pas les supports (d'ou le diff)
    axes[index].scatter(X_[np.setdiff1d(np.arange(len(X)), svr.support_)],Y[np.setdiff1d(np.arange(len(X)),
        svr.support_)],facecolor="none", edgecolor="k")
    print("eccart carré moyen : {}".format(np.square(Y-PREDICT).mean()))

plt.show()

On obtient un eccart carré moyen : 6.847129083752741e-07



On voit donc que nos données sont correctement décrits mais en soit c’est normal! Mais essayons sur les données bruitées?



svrs = [ svr_lin,svr_poly]
model_color = ['c', 'g']

fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(16,8), sharey=True)
for index, svr in enumerate(svrs):
    PREDICT=svr.fit(X_, Bruit).predict(X_)
    axes[index].plot(X_, PREDICT, color=model_color[index], lw=2)
    # on affiche les points supports du SVM
    axes[index].scatter(X_[svr.support_], Bruit[svr.support_], facecolor="none",edgecolor=model_color[index])
    # les autres points qui ne sont pas les supports (d'ou le diff)
    axes[index].scatter(X_[np.setdiff1d(np.arange(len(X)), svr.support_)],Bruit[np.setdiff1d(np.arange(len(X)),
        svr.support_)],facecolor="none", edgecolor="k")
    print("eccart carré moyen : {}".format(np.square(Y-PREDICT).mean()))


plt.show()

On obtient eccart carré moyen : 3.2041407166403025e-06

Donc la on voit que malgré le bruit, on obtient une prédiction qui colle à ce qu'étaient nos données non bruité!

Sur-modèle

Alors on pourrait se dire que si l’on cherche à augmenter le degré on pourrait peut être espérer augmenter la qualité de notre modèle… sauf que ….


svrs = [ svr_lin,svr_poly]
model_color = ['c', 'g']

fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(16,8), sharey=True)
for index, svr in enumerate(svrs):
    PREDICT=svr.fit(X_, Bruit).predict(X_)
    axes[index].plot(X_, PREDICT, color=model_color[index], lw=2)
    # on affiche les points supports du SVM
    axes[index].scatter(X_[svr.support_], Bruit[svr.support_], facecolor="none",edgecolor=model_color[index])
    # les autres points qui ne sont pas les supports (d'ou le diff)
    axes[index].scatter(X_[np.setdiff1d(np.arange(len(X)), svr.support_)],Bruit[np.setdiff1d(np.arange(len(X)),
        svr.support_)],facecolor="none", edgecolor="k")
    print("eccart carré moyen : {}".format(np.square(Y-PREDICT).mean()))


plt.show()

On obtient eccart carré moyen : 0.002954915450864114


Ce que l’on constate ici est ce que l’on appelle de l’overfiting, c’est à dire un sur-apprentissage, cela arrive lorsque l’on pousse le modèle à vouloir trop coller au données. Au lieu d'être une bonne approximation de l’ensemble des données, le modèle devient  une surreprésentation de celles ci et sera incapable d’en prédire de nouvelles.

Conclusion

Pour conclure la-dessus je ferai surtout un point sur notre avancement dans l’IA. Ainsi on peut remarquer que la nous sommes sur la fin des régressions non linéaires (et les linéaires). Bien sur on ne dira pas que l’on en a fait le tour car il serait encore possible de traiter aussi des algo de type lasso, ridge, ou même elastic-net cependant dans le principe, ces approches restent proches de ce que l’on pu voir jusque maintenant (de plus la littérature sur ces modèles de régression est plus que riche et vous laisserai donc chercher).

De même nous avons vu des classifications binaires mais aussi des classifications multi-étiquettes (souvenez vous du dataset iris) et nous avons la aussi fait un peu le tour! Nous nous attacherons quand même à conclure sur une problématique classique du domaine qu’est Mnist car ce problème est tellement un classique qu’il ne serait pas normal de ne pas en parler.

Mais du coup ça y est on a fini avec l’IA? bien sur que non… il reste encore plein de sujet!

Rassurez vous!! c’est loin d'être fini! Sans vouloir trop entrer dans ces sujets ou spoiler, le machine learning compte encore d’autres approches comme les arbres de décisions ou les forêts aléatoire et bien sur, après cela, les réseaux de neurones (ça y est on y arrive!!).

Cependant, il faudra un peu de patience… car d’autres sujets surprises vont s’intercaler entre tout ça…. enfin vous verrez!

Références

mercredi 3 avril 2019

Math: Linéarité or not linéarité

Un petit aparté avant de traiter l’astuce du noyau et son utilisation dans les SVM pour parler de la linéarité et de la non linéarité.

Principe de la linéarité

Des données sont dites linéaires lorsqu'il est possible de construire un modèle de ces données en s’appuyant sur une équation linéaire. Pour rappel, une équation linéaire est une équation du type:
TODO Généralisable en dimension n sous la forme:
TODO Que l’on peut réécrire sous forme matricielle:
TODO Souvent c’est à partir de la que l’on va appliquer les algorithmes de machine learning afin de rechercher les paramètres W optimaux à partir d’un jeu de données (mais cela on l’a vu dans les articles précédents en minimisant la distance des points à la moyenne par exemple où avec l'équation normale).

Pourtant, si les SVM sont une approche de machine learning efficace pour la classification ou la régression sur des ensembles de données linéaires (ou linéairement séparable) cet outil n’est pas adapté à une utilisation sur des ensembles de données non linéaire ou du moins pas directement.

Mais qu’est ce que l’on appel des données non-linéaires ?

La non linéarité

La non linéarité du coup c’est le reste! Ok merci au revoir….

Non, bon ok, ça parait un peu facile dit comme ça mais en fait ça se limite vraiment à ça! Donc ca signifie que toute construction à base d’exponentielle, de logarithme, de passage à la puissance ou faisant intervenir une quelconque dérivée est non linéaire. il en existe bien d’autre forme, les pire étant les systèmes chaotique (mais nous n’irons pas ici jusqu'à la).

Mais cela parait assez vite logique lorsque l’on observe un peu ces fonctions car elles ont un profil typiquement non linéaire. Par exemple les fonctions exp, log et x à différents niveau de puissances



Mais du coup on en fait quoi de la non linéarité? Et bien c’est un sujet difficile qu’il faut appréhender un peu cas par cas car chaque non linéarité peut être issue de mécanisme varié.

Cependant en machine learning, il existe une approche efficace qui permet de ramener un problème non linéaire (pas chaotique) en un problème linéaire, c’est l’utilisation du kernel-trick! Rien que ça…. mais on en parlera dans le prochain article.

vendredi 29 mars 2019

SVM : Formule dual

Cet article sera court car il n’entrera pas dans le détail de l’obtention de l'équation dual mais juste dans l’explication de comment y parvenir en partant de la fonction de décision (où le modèle de régression. L’idée n’est pas d’entrer trop dans les détails mathématiques que d’une part je ne maîtrise pas forcement mais d’intègrer cet article dans la continuité des sujet sur SVM et finalement aboutir aux modèles SVM non linéaire. Pour plus de détails la littérature sur le sujet est vaste, en dehors de ressources de type cours de math de master, vous trouverez les articles suivant qui m’ont permis de mieux appréhender cette problématique [1,2,3].

Pour rappel cette fonction solution à notre problème est [6]:
TODO Dans ce cadre, le but est de maximiser la marge qui dans le cas de la SVM est inversement proportionnel à la norme de W par deux
TODO Pour faire plus simple, alors on propose de plutôt minimiser directement la norme de W. Que l’on préférera choisir sous la forme de (½)W^^2
TODO

Formule primal

Ainsi, la SVM devient un problème d’optimisation quadratique avec contrainte dans laquelle, on cherche:
TODO sous la contrainte
TODO A noter que cette contrainte dépend du type de modèle : régression ou classification

Ce problème est alors ce que l’on appelle le problème primal.

Ce qu’il faut savoir est que la solution à ce “facile” à la condition que le nombre de données soit conséquent par rapport au nombre de variable (rang(X)). Par contre lorsque le nombre de données devient equivalent au nombre de variable voir est inferieur, cette solution n’est plus efficace et il faut alors se tourner vers la solution duale.

Formule dual

Cette solution duale qui est le propos de cet article s’obtient à l’aide du multiplicateur de agrange [4,5] qui nous permettre de la reformuler la solution primale sous la forme suivante.
TODO avec
TODO et
TODO A noter que ce dernier element étant associée à la contrainte de la formule primale, il faut l’ajuster selon le type de modèle : classification ou régression. On obtient donc:
TODO L’utilisation des conditions Kuhn-Tucker à cette étape vont alors nous permettre en calculant de gradient de L de nous fournir la formule duale (au coef prés du type de modèle) qu’il faudra maximiser selon le paramètre alpha.
TODO L’intéret de cette approche est de fournir à l’inverse de la solution primale une solution adapté au calcule des W dans le cas ou le nombre de données est faible face au nombre de variable. Pour plus d’informations afin d’approfondir, je vous invite à consulter la formation [1] qui explique le rôle de alpha qui selon sa valeur permet d’identifier le rôle des vecteurs du support à la marge du SVM.

Enfin dernier intérêt de la formule duale sur la formule primale, comme nous le verrons dans les articles suivant, est que celui ci fait intervenir un produit scalaire…. mais nous verrons cela plus tard.

Références

[1] https://openclassrooms.com/fr/courses/4444646-entrainez-un-modele-predictif-lineaire/4507841-maximisez-la-marge-de-separation-entre-vos-classes
[2] https://zestedesavoir.com/tutoriels/1760/un-peu-de-machine-learning-avec-les-svm/#5-systemes-non-lineaires--astuce-du-noyau
[3] https://fr.wikipedia.org/wiki/Machine_%C3%A0_vecteurs_de_support
[4] https://fr.wikipedia.org/wiki/Multiplicateur_de_Lagrange
[5] https://fr.wikipedia.org/wiki/Optimisation_quadratique
[6] https://medium.com/coinmonks/support-vector-regression-or-svr-8eb3acf6d0ff

lundi 25 mars 2019

IA : Obtention de l'equation normale

En machine learning, nous cherchons un modèle. Dans le cas d’un nuage de point pour lequel nous avons que son profil est linéaire, nous allons rechercher un modèle de la forme
TODO Ce modèle une fois obtenu, va nous permet de fournir des prédictions. Seulement, encore faut il en déterminer le paramétrage.

Pour cela on peut utiliser l'équation normale que nous avions vu dans l’article [1]:
TODO Du coup comme il importe d’en comprendre l’origine, explorons son origine: la méthode des résidus.

En fait l’idée est simple l'équation du modèle linéaire que nous avons vu précédemment nous fourni un modèle linéaire mais qui forcément ne sera pas parfait. Ainsi, si l'équation normale nous donne un résultat optimal en terme de régression (par exemple), si l’on compare les valeurs prédites avec les valeurs initiales, on va faire apparaître ce que l’on pourrait apparaître comme un résidu:
TODO À partir de ce constat, il faut que nous cherchions donc une solution permettant de minimiser les résidus. Pour cela, on va en calculer le produit scalaire c’est à dire: TODO Ensuite on décompose:
TODO Or on peut trouver l'équivalence suivante:
TODO Du coup en réintroduisant ce résultat dans l'équation on obtient:
TODO Il s’agit d’une forme quadrative avec du type avec la solution associé (l’équation du modèle linéaire)
TODO Donc notre calcule des residus nous amene à l’equation normale
TODO Voila en allant chercher la valeur minimale c’est à dire la solution l’équation quadrative, alors on retrouve l’équation normale.

Réferences

[1] https://un-est-tout-et-tout-est-un.blogspot.com/2018/09/ia-equation-normale.html

samedi 23 mars 2019

IA : Chemin vers le kernel trick

Quand tu fais face a Dunning, Kruger.... tu prends conscience de ton ignorance et du travail qu'il te reste a accomplir....

Cette semaine ça a été mon quotidien. J'ai du temps et je me suis dit, et bien pourquoi ne pas s’intéresser plus précisément aux modèles de machines learning permettant de réaliser des classification ou des régressions non linéaire? En toute logique, forcement je me suis pencher sur les SVM....

Alors bien sur ce sujet avait été traité de façon technique avec scikit-learn [2] sans se préoccuper des fondamentaux mathématiques qui se cachaient derrières... et conscient des explications faisaient défaut.

J'ai donc voulu remplir le vide.... seulement en m'intéressant aux SVM dans le cadre des problèmes de la non linéarité, on se rend vite compte qu'il s'agit d'un faux problème car il existe un outil mathématique magique (mathemagique?) qui permet de passer d'un espace de description  non linéaire a un espace linéaire : le kernel trick! et en plus cerise sur le gâteau, il permet de ne pas avoir a se poser de question sur la fonction permettant cette transformation, celle ci étant dans le noyau et que ce dernier s'applique directement! Du coup un bon choix de noyau et op, on est capable d'appliquer un SVM (qui est très efficace sur les problèmes linéaires).

Mais du coup forcement outil aussi cool que le kernel trick devait aussi etre compris et surtout pourquoi il marche!

Alors le kernel trick fonctionne car dans les équations solutions (équation dual de la forme quadratique de minimisation de la norme du vecteur de poids) du SVM, existe un produit scalaire des données d'entrées d'entrainement. Ce produit scalaire est justement l'astuce du noyaux car il autorise sa substitution avec le noyau choisi (grâce au théorème de Mercer).

A ce stade, on se rend compte qu'il y a encore des choses a expliquer.... que fait réellement le kernel trick (ou du moins qu'est ce qu'il permet de cacher?) Pourquoi avons nous une solution de minimisation des poids du modèle sous une forme quadratique?

Voila donc tout ceci pour expliquer la complexité d'un sujet que même si compris implicitement dans le survol,  il est souvent nécessaire en réalité de fournir un travail plus en profondeur pour en maîtriser réellement les tenant et aboutissant (comprenant les concepts mathématiques dans l'ombre).

Donc ce que nous allons faire c'est:
  • Expliquer comment on obtient l’équation normale
  • Comment a partir de l’équation normale, on obtient la forme duale
  • Identifier le kernel trick et son fonctionnement
  • Application de kernel trick a autre chose que SVM
Bon ok c'est probablement pas l'article que vous attendiez mais... au plus je me suis intéressé au sujet et au plus il m'a semblé nécessaire d'en écrire plusieurs.... il me fallait éclaircir la démarche, d'ou cet article...

Références

[1] https://fr.wikipedia.org/wiki/Effet_Dunning-Kruger
[2] https://un-est-tout-et-tout-est-un.blogspot.com/2018/12/ia-classification-svc-avec-scikit-learn.html

mercredi 13 mars 2019

Math: La nature des données

Jusqu'à maintenant nous nous somme intéressé comment construire un outil capable de soit prédire des données futurs (avec des modèles de régression) soit prédire l’association de celle ci avec des ensembles divers (classification)

Ces deux types de modèles sont en fait typique de la nature des données manipulées ou de la nature des données de sorties souhaitées, ici respectivement des données quantitatives et qualitatives [1,2].

lundi 10 décembre 2018

IA : Classification SVC avec SciKit-Learn

Introduction

Dans les article précédent, nous avion aborder la problématique de la classification [1,2] qui consiste à séparer des ensembles binaire ou multiple, pour cela, nous avions réalisé un neurone à la main avec une approche rationalisée autour de la constitution d’un jeu de donné d’apprentissage et d’un jeu de donnée d'évaluation.

Dans cet article, on va industrialiser une peu plus en nous appuyant sur un framework pour réaliser toute ces tâches : scikit learn [3]. Nous prendrons le cas classique de la classification des données du jeu Iris sur lequel nous appliquerons l’algorithme de classification SVC (Support Vector Classification)[4].

Avant cela, nous présenterons rapidement (car nous aurons d’autres occasion de l’utiliser) scikit learn et son utilisation, nous verrons le principe général de SVC puis nous traiterons concrètement la problématique de classification du jeu de données Iris.

Description Scikit learn

Scikit learn est un framework python dédié au machine learning. il implémente de façon exhaustive les algorithmes les plus commun du domaine (il suffit de télécharger la documentation pdf du framework pour se rendre compte de la quantité d'algorithme que regorge scikit learn).

On y trouvera donc autant des algorithmes à base d'apprentissage supervisé (K plus proche voisin, Régression linéaire/logistique, SVM, arbre de décisions, etc…), non supervisé (partitionnement, visualisation ou réduction de dimension, règle d’association) ou semi-supervisé (issu de la combinaison des deux précédentes approches)

À cela, scikit-learn va proposer des outils facilitateurs pour construire des processus de traitements incluant phases de traitements des données (visualisations, analyse, nettoyage, calibrage, découpage, transformation), de paramétrages (par quadrillage, recherche aléatoire ou avec des modèles), d’apprentissages (sous format batch c’est à dire en une fois, en ligne c’est à dire de façon progressive ou encore avec des stratégies d’optimisation comme la descente de gradient ordinaire ou stochastique, l’utilisation de mini-lots, d'arrêt précoce), d’évaluations et de mises en production tout cela sous la forme de pipeline.

Nous aurons l’occasion d’explorer l’ensemble des fonctionnalités de scikit learn, aujourd’hui intéressons nous aux SVM et entre autre à SVC.

Description SVC

SVC (ou Support Vector Classifier) est un algorithme de machine learning faisant parti de la famille des SVM (Support Vector Machine) [4].

En fait un SVM est un algorithme utilisant la composante vectorielle des éléments du jeu de données d’apprentissage afin d’en déterminer une orientation préférentielle. Ainsi selon que l’on se place dans un contexte de régression ou de classification, il va être possible de
  • soit définir une droite porté par cette orientation donnée par la composante vectorielle 
  • soit de construire une droite perpendiculaire à ce même vecteur (et placer à équidistance des ensembles à séparer)
Si vous avez pris le temps de lire l’article précédent sur la classification [1], l’exemple de la construction de la droite séparatrice des fruits est classiquement un SVM et entre une forme de SVC.

edit 1: pas tout a fait car le SVM va chercher a minimiser la distance avec les quelques éléments choisis des deux ensembles, ces elements etant les "vecteurs supports", dans le cas de l'article [1], tous les elements sont des vecteurs supports.

edit 2: le schema ci dessous a pour but d'illustrer le principe de la separation d'ensemble pas que ce soit celle ci qui est obtenu

L'iris dataset

Pour illustrer l’utilisation d’un SVM avec scikit learn, nous allons utiliser un jeu de donnée (dataset) classiquement employé pour justement illustrer les approches de classification. Ne faisons pas mentir les habitudes.


iris= pd.read_csv('iris.data.txt',sep=',') #https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data
print(iris.shape)
pandata = pd.DataFrame(np.array(iris),columns=['sepal_length',  'sepal_width',  'petal_length',  'petal_width', 'species'])
print(pandata[:5])
sns.pairplot(pandata,hue='species', size=2.5)


Ce jeu de donnée est accessible les archives en ligne [5]. Pour visualiser un peu les données comme nous l’avions fait dans le précédent article à l’aide de panda:

Comme on le voit sur le schéma, le jeu de donnée est constitué de différentes informations sur les iris comme la largeur et la longueur du pétale ainsi que la longueur du sepal (la sorte de petal mais verte et enfermant le bouton). Une dernière information permet enfin de déterminer le type de la fleur en fonction des informations données. 

Celle ci sont de trois types:
  • Iris-setosa
  • Iris-virginica
  • Iris-versicolor
Tentons maintenant avec scikit learn d'entraîner un modèle SVC nous permettant de déterminer le type de fleur à partir des informations précédentes.

Traitement avec scikit learn

Pour construire notre modèle il nous faut avant tout chose penser à constituer un jeu de donnée de test afin nous permettre de l'évaluer une fois l’apprentissage réalisé.

Ainsi nous allons scinder le jeu de donné. Le data set n’est pas énorme (150 échantillons), il faut donc faire un choix entre quantité lié à l’apprentissage et quantité dédié à la validation. À cet effet on prendra 125 échantillons pour l’apprentissage et les 25 derniers pour la validation.

A noter cependant que les données iris sont initialement trié, nous allons donc les mélanger d’abord avant de les scinder à laide d’un tableau de valeurs aléatoires pour constituer le jeux d’apprentissage et le jeu de validation.

perm=random.permutation(np.array(iris)[:,4].size)
irisRand=np.array(iris)[perm]
targetPerm,dataPerm=irisRand[:,4],irisRand[:,:4]
division=125
print("base:",targetPerm.size,dataPerm.shape)
targetLearn,targetTest=targetPerm[:division],targetPerm[division:]
print("target:",targetLearn.size,targetTest.size)
dataLearn,dataTest=dataPerm[:division,:],dataPerm[division:,:]
print("data:",dataLearn.size,dataTest.shape)

Maintenant, on va réaliser la partie peut être la plus facile, instancier un modèle et faire une phase d'apprentissage:

model=SVC()
model.fit(dataLearn,targetLearn)

On vérifie que celui-ci fonctionne:

print(model.predict(dataTest[:4]))
print(targetTest[:4])

Bon on voir que ca fonctionne mais on ne peut pas se limiter à ce genre d’evaluation pour mesurer l’efficacité de notre modèle. Dans nos précédents exemple, nous avions utilisé la matrice de confusion.

Matrice de confusion

Nous avons un modèle qui à appris, nous avons un jeu de test maintenant regardons comment Scikit learn nous facilite la vie pour l'évaluer.

Pour cela Scikit nous propose une api générique du package metrics: confusion_matrix.

Prenons l’exemple de jeu de test:

predicData=model.predict(dataTest)
confusion_matrix(targetTest,predicData)


array([[8, 0, 0],
       [0, 9, 1],
       [0, 0, 6]], dtype=int64)

Nous voyons que la matrice est diagonale, donc le modèle est dans l’absolu idéal! mais comme nous ne croyons pas aux licornes on peut légitimement se demander si cela n’est pas du à un jeu de test un peu trop petit. Essayons avec quelques jeux de test un peu plus important (mais du coup reduisant à l’inverse le jeu d’apprentissage et donc diminuant forcement la qualité du modele aussi…) avec les ratio suivant: 100/50, 75/75, 50/100:


array([[19,  0,  0],
       [ 0, 17,  1],
       [ 0,  0, 12]], dtype=int64)

array([[21,  0,  0],
       [ 0, 25,  1],
       [ 0,  3, 24]], dtype=int64)


array([[30,  0,  0],
       [ 0, 35,  3],
       [ 0,  0, 31]], dtype=int64)


À cela, on se rend compte que sensiblement le modèle se dégrade mais réagit plutôt bien (puisque à priori notre jeu de test est lui plus performant) Apres le choix de l’ajustement et de la balance des données reste un choix et un paramètre à prendre en compte mais il faut toujours avoir un moyen d’évaluation et d’en connaitre la pertinence et la limite

Conclusion

Bien sur il y à d’autre algo de classification et aussi bien sur d’autres outils mais ceux la sont les basiques, on en verra d’autres. Aujourd’hui nous avons vu le modèle SVC appliqué au jeu de données Iris en appliquant une approche mettant en avant la problématique de l’apprentissage face à la validation.

Notes: vous trouverez l’intégralité des exemples sur le depot github [6]

Référence

[1] https://un-est-tout-et-tout-est-un.blogspot.com/2018/07/ai-approche-neuromimetique-la.html
[2] http://un-est-tout-et-tout-est-un.blogspot.com/2018/07/ai-approche-neuromimetique.html
[3] http://scikit-learn.org/
[4] https://zestedesavoir.com/tutoriels/1760/un-peu-de-machine-learning-avec-les-svm/

samedi 10 novembre 2018

La Veille Technologique

S’il fallait des raisons d’apprendre

La veille technologique est un processus incontournable aujourd'hui dans n'importe quel domaine et métier mais cette vérité est d'autant plus forte dans le monde de l'IT tant cet eco-système change vite et se transforme rapidement.

Les concepts changent, les processus changent, les technologies changent et tout cela en même temps et ne pas les suivre c'est s'exposer à devenir rapidement inadapté face, pour d'une part, à des besoins clients  en perpétuels évolutions mais aussi d'autre part à des exigences de performances qui doivent faire face a des enjeux de dimensionnement de plus en plus présent (comme avec l’essor du BigData et par extension du Machine Learning cette dernière décennie [1])

Ainsi ne pas faire de veille technologie, par extension, c'est s'exposer individuellement a l'inadaptation face à un marché de l'emploi qui lui aussi évolue vite. J'ai, moi même, comme j'en ai parlé dans mon article un peu auto-biographique [2], pu perdre a certains moment le fil de l'actualité du monde technologique et théorique. Ainsi selon mon évaluation (ça ne vaut que mon avis), aujourd'hui, si un individu s'endort pour quelques 2 a 4 années, alors le gap qu'il aura a combler sera pour lui équivalent a repasser une bonne année des études qu'il avait pu suivre lorsqu'il était étudiant!
Je n'imagine pas la masse de travail a faire si il s'endort plus longtemps car cela ne prend pas en compte bien d'autres phénomènes qui intervienne au delà de ne rien faire.

Un des premiers phénomènes est celui de l'oubli, après combien de temps parvenez vous encore a exploiter des connaissances que vous avez acquises quelques temps plus tôt? honnêtement? 1 mois? 3 mois ? 6 mois? 1 an? 3 ans? 5 ans? Bien sur ce qui est appris est globalement acquis, mais le temps est délétère et selon la manière que cette connaissance a été acquise, il en restera plus ou moins les bases au mieux et nécessitera des révisions.
Personnellement je pense que au delà 3 mois sans utilisation, une technologie nouvelle devra être révisé, et que pour une connaissance couramment utilisé, il faudra probablement 3 années d'inutilisations pour impliquer la nécessite d'une révision (si a ce moment la cette technologie ou connaissance est encore d'actualité!)
De plus, il existe des freins et des limites propres a l'hommes qui font qu'il est nécessaire de faire de la veille technologique régulièrement. Par exemple:
  • les biais cognitifs (bais de confirmations, préjugé, culture, etc...) qui auront altérer notre lecture initiale des faits et qui dans le temps ne feront que renforcer un point de vue sur un sujet qui sera peut être complètement erroné [3]. La veille technologique permet d'apprendre a réviser son jugement et ainsi passer outre nos préjugés (nous évitant alors de passer a coté de sujet intéressant voir même important 
  • le vieillissement est malheureusement un fait et comme on dit, parmi les génies, seuls ceux de moins de 40 ans ont réalisé des grandes choses et des bouleversements justifiant des changement de paradigme : il ne faut donc pas compter sur l'age pour nous aider a être plus performant. Pourtant, la veille technologique a l’intérêt, au delà du travail d'apprentissage de connaissances, d’entraîner le cerveau a réfléchir, a construire sa pensée, a imaginer, a se restructurer. 
  • la confiance en soit, peut être un frein a la connaissance, et la veille technologique peut permettre de gagner en confiance et être plus capable de se mettre en avant sur des sujets.
Au delà de l'acquisition de connaissance brut, la veille est donc un indispensable, elle permet de se maintenir a jour de l'actualité mais aussi de maintenir ses sens en éveil, se maintenir prêt a relever de nouveau défi quitte a même aller sur des sujet non connus!  C'est même la peut être la partie la plus utile de la veille technologique, garder l'esprit aguerri a la réflexion et a la résolution de problématiques sans avoir peur de sortir de son cadre.

WWWWH

Maintenant que l'on s'est donné (de bonnes) raisons de faire de la veille technologique, regardons un peu du coté du WWWWWH [4] pour creuser les axes de cette démarche.

Why ?

Evidemment nous n'allons pas refaire la partir introductive de cet article mais restons pragmatique, pourquoi faire de la veille technologique? Plusieurs points de vue peuvent être aborder:
  • Court terme : le besoin projet, c'est peut être ce qui est le plus pragmatique, pouvoir mettre directement en pratique ce que l'on apprend!
  • A moyen terme : Assouvir de la curiosité mais aussi se maintenir a jour techniquement et aussi parce qu’il ne faut pas attendre qui que ce soit pour préparer l'avenir, sachant que ce sont probablement ces connaissances qui permettront d’accéder a certains autres types de projets
  • A long terme : entretenir les connaissances, mais aussi alimenter la curiosité personnelle de façon a continuer a faire un métier qui nous passionne, un métier ayant du sens.

When ? Where ?

Inutile de dire que ce chapitre sera court! Tous le temps, Partout! Comme le disait Einstein (citation du livre d'Etienne Klein, le pays qu'habitait Albert Einstein [5]):
"L'essentiel dans l’existence d'un homme de mon espèce, réside dans ce qu'il pense et comment il pense, non dans ce qu'il fait ou souffre"
En substance, signifiant pour moi que peu importe le lieu et le temps pour quoique ce soit, l'essentiel est l'utilisation de sa pensée et la manière de la construire. Et autant cela n'engage que moi mais la veille technologique (tout apprentissage en fait) a un rôle structurant pour la pensée qui est important de développer.

What ?

La question du sujet de la veille technologique est compliqué. Il s'agit ici d'un élastique tendu au bout de lequel on trouvera d'un coté, les sujets d’intérêts et de l'autre les sujets utiles!
Toute la difficulté dans une carrière sera de réussir a reboucler cet élastique! On peut distinguer différents types de sujet:
  • les sujets généraux ou transverses
  • les sujets spécifiques ou ciblés
Les premiers auront généralement pour but de donner du sens a une activité de veille technologique. Ce seront donc des sujets plutôt de méthodologie, conceptuel, historiques, et ou posant un contexte. Nous sommes alors plus dans un contexte de vulgarisation.
Les second seront des ramifications des premiers en s'attachant a entrer dans l'intimité d'un aspect du domaine considérer. Il s'agira donc plutôt de sujets abordant certaines technologies, frameworks ou encore de sujets décortiquant une problématique données. Pour aborder ces points, il faudra généralement un certain bagage.

How 

La partie la plus intéressante! Comment réaliser sa veille technologique? Probablement en ne faisant pas faire n'importe quoi non plus! Il importe que ce travail d'apprentissage soit pertinent et efficace! 

Tout d'abord, passons en revu les basiques:
Il est évident qu'il faut avant toute chose identifier un sujet intéressant. On sait pertinemment que la capacité d'apprentissage sera directement conditionné par le taux d’intérêt qui sera alloué au sujet. Bien sur on nous dira:

"Parfois, certains sujets, même indispensable, ne sont pas intéressant! "

C'est vrai, parfois il faut effectuer des veilles technologiques sur des sujets peu ou pas intéressant parce que ce sont des choses déjà vu et qu'il faut alors réviser ou parce que simplement ce sont des pre-requis qui sont juste pas intéressant. Dans ce genre de situation, l’idéal est de coupler le sujet avec un autre pour lequel l’intérêt sera plus grand. Ainsi, l'utilisation du second sera un prétexte pour le premier. L’idéal est même que le second soit une technologie déjà un peu maîtrisée de façon a limiter la marche a gravir.
Une fois le sujet cerné, il importe d'identifier les bagages nécessaires pour l’appréhender. Autant commencer par le commencement! Cela mène à construire un programme pour sa veille technologique. Sans cela, le risque est de sortir du cadre du sujet que l'on souhaitait traiter, attiré par l'ensemble des sujets amont à celui ci, sans cela, le risque est de se retrouver, un mois plus tard, a finalement encore préparer la veille du sujet initial!
Apres il ne faut pas non plus être trop exigent avec soit même car parfois en vagabondant, on se découvre de nouveaux centres d'intérêts et de nouvelles choses a apprendre, c'est ca aussi la veille technologique, s'ouvrir a d'autres choses. 

Ainsi, il est bien de se planifier sa veille technologique mais pas trop afin d’être raisonnable et réaliste avec des objectifs atteignables! Cela évitera de se décourager et de perdre le rythme et finalement abandonné en pensant "je suis trop vieux pour ces conneries". 

Dans le cas ou il faut tout apprendre d'un sujet alors il sera préférable de se tourner vers des supports autres que internet de façon a avoir des sources plus englobante (on sera alors plus sur des sujet généraux comme ceux dont nous avons parlé précédemment)
Maintenant que l'on a cerner le sujet, et identifier les pré-requis, il va falloir trouver les moyens de s'informer. Bien sur la première approche est de se tourner vers internet. Effectivement, on y trouve beaucoup d'informations (peut être parfois trop) sous de nombreux formats:
  • l'article les articles sont souvent un peu plus généraux et donne une vision d'ensemble de sujet spécifique
  • la vidéo est un support un peu spécial, souvent pratique pour les sujets généraux car permettant de comprendre les tenant et aboutissant d'un sujet, par contre lorsqu'il s'agit d'entrer techniquement dans les sujets, cela devient plus compliqué a suivre et nécessite de jouer beaucoup avec le curseur d'avancement. Pas fan personnellement, je peux comprendre que d'autre y adhère plus facilement (que moi), question d'affinité.
  • le tutorial est un article exclusivement dédie a la démonstration, très pratique pour acquérir une expérience, elle ne permet pas forcement par contre de comprendre les concepts sous-jacent contrairement aux article
  • la présentation est un exercice délicat, elle doit marié un contenu intéressant et une bonne pédagogie. Elle apporte la possibilité de connaitre un point de vue spécifique peut être différent de sa propre compréhension et d’étayer le sujet avec l'interlocuteur. 
  • le blog souvent très pratique car regroupant des articles ou des tutoriaux, il permettent d’acquérir une connaissance très précise sur un sujet ou d'une problématique
  • la doc technique est exclusivement a réservé pour ceux qui ont déjà le bagage mais qui cherchent des détails ou qui sont dans une phase de POC
  • le mooc est une formation en ligne mixant articles, tutoriaux et vidéos. Souvent a réserver a des vielles technologiques conséquente, quand on part de loin sur un sujet.
Enfin, dans les cas difficile ou trop conséquent, il faudra préférer probablement s'appuyer sur un livre de façon a avoir un support couvrant l'ensemble des problématiques dans un formalisme homogène et cohérent.

Nous n'avons encore pas vraiment parler d'outils ou de méthode (enfin si avec cette article) cependant, il me semble que la phase de construction de la connaissance est une étape intime et que si vous en êtes la c'est que vous avez déjà depuis longtemps appris a apprendre et que vous vous connaissez et savez comment optimiser cette phase d'assimilation et de compréhension.

Pour ma part, elle se réalise assez simplement:
  • Identifications des sources intéressantes par une lecture rapide filtrante
  • Relecture approfondi par une prise de note
  • Synthèse général par quelques schéma (UML, Mindmap, ERA selon votre domaine de compétence et vos connaissances, nous verrons que cela sera utile par la suite)

Enfin suite a cela a priori, et c'est ce qui viendra en tête de tout le monde, il faut mettre en oeuvre ce qui est appris. C'est effectivement très important car au delà de nous permettre de comprendre les avantages et inconvénient d'une technologie, la mise en oeuvre permet aussi de consolider l'apprentissage en se confrontant aux lacunes de la compréhension que l'on a du sujet (prejugé, biais cognitif, etc...). 

La mise en oeuvre se réalise par un POC (Prove Of Concept).  Il va permettre de vérifier que la technologie offre bien les services qu elle annonce mais et surtout va permettre de savoir que l'on est capable de l'utiliser!

A ce stade alors on pourrait s'attendre à ce que le processus de veille soit a ce stade terminé... il n'en est rien, réaliser un POC est une chose mais le terme de la veille n'est pas cette phase. Finir correctement une veille technologique nécessite de transmettre ce qui a été appris.

Teach

Pour débuter ce paragraphe, je citerai Robert Heinlein :
"When one teaches, two learn" 
Oui, enseigner a d'autres ses connaissances c'est faire aussi de la veille technologique! 

Même si cela est fait très rarement par même ceux faisant de la veille technologique regulierement, la dernière phase d'un apprentissage quel qu'il soit est de démontrer sa capacité à restituer ce que l'on connait. Cela augmente significativement la maîtrise du sujet étudié pour les raisons suivantes:

  • Mon directeur de thése citait souvent Nicolas Boileau (que je paraphraserai pas): 
"Ce que l'on conçoit bien s'énonce clairement"
  • Faire une restitution des connaissances acquise impose de se confronter a la réalité de notre compréhension car en transmettant son savoir, on doit être en mesure de garantir celui-ci! Il faudra donc se pencher plus sur les détails de faire une préparation donnant du sens a l'ensemble, de la cohérence. 
  • Impose, contrairement au POC ou la mise en oeuvre ne permet que de démontrer notre capacité utiliser une technologie, d'en avoir compris les tenant et aboutissant, les éléments pivots, etc...
Donc enseigner va permettre de consolider sa propre connaissance mais aussi d’être face aux choses que l'on aura oublié, a coté duquel il est possible de passer, les subtilités car heureusement, les gens auquel la restitutions s'adressent ne sont probablement pas complètement vierge de connaissances sur le sujet! C'est même du coup la l'occasion de confronter des idées et des points de vue.


Comment transmettre? A qui?


Alors du coup finalement vient la question de comment transmettre? et a qui? Il s'agit d'une question a laquelle chacun doit donner une réponse selon le contexte dans lequel il évolue et les sujets qu'il traite!
Tout d'abord le comment. De la même manière que certaines sources d'informations ont permis d’acquérir des connaissances, rien n’empêche de produire le même genre de support. Ça peut être un blog (comme moi) ou des vidéos (dans la mouvance youtube) mais il faut garder en tête l'objectif de ce travail, le support ne doit pas devenir non plus plus complexe a mettre en oeuvre que le sujet lui même! 

Apres c'est selon l'envies mais il faut garder une chose importante en tête, la veille technologique, c'est pour vous. Le succès de transmettre ses connaissances est un plus si des gens y ont appris quelque chose, ce qui compte c'est le travail de formalisation, consolidation qui a été nécessaire.
Se poser la question de à qui enseigner ses connaissances acquises lors de la veille technologique, c'est avant tout et surtout une question cherchant a positionner le profil de l'interlocuteur cible.
On peut en définir plusieurs types:
  • le novice sur le sujet. Dans ce cas, la restitution de la veille technologique doit être très progressive, il s'agit de ne pas noyer l'interlocuteur. Cette approche progressive aura alors pour intérêt dans la veille technologique de démontrer la maîtrise globale et cohérente du sujet. On sera ici plutôt dans un exercice de vulgarisation.
  • l'expert du sujet. Il faudra pour un public aguerri être très prudent. Bien poser les concepts du sujets et être précis dans les démonstrations. L’intérêt de ce public est d'imposer a votre discourt un certain degré de justesse dans ce qui sera présenté car la critique pourrait être cinglante en cas de grosse bévue. Par contre les échanges seront plus pertinent et enrichissant.
  • l'inconnu. Ce sera l'interlocuteur le plus difficile, car faute de savoir se positionner, il faudra considérer un support de communication adapté au deux types d'interlocuteurs présentés précédemment.

Conclusion

Certains diront que la veille technologique est surement un indispensable mais qu'ils n'ont pas le temps. Effectivement, on a tous une vie en dehors du travail, cependant dans le monde de l'IT ou tout change très vite, on ne peut se satisfaire des formations d'entreprise pour se tenir a jour. De plus, la veille technologique est une activité complexe qui pour être efficace doit être mené régulièrement mais aussi avec de la méthode.
Dans cet article, a été présenté une approche (celle que je suis personnellement) permettant de mener cette veille tout en tachant de la rendre efficace au mieux. Elle consiste globalement a bien sur hiérarchiser les sujets mais aussi après en avoir pris connaissance et avoir fait une mise en oeuvre, a réaliser un travail de restitution.

Pour aller un peu plus loin, voici quelques articles et blog permettant de compléter et confronter mon point de vue [6], [7], [8]

Références

[1] Big data et Machine Learning, 2016, de Pirmin Lemberger (Auteur), Marc Batty (Auteur), Médéric Morel (Auteur), Jean-Luc Raffaëlli (Auteur)
[2] https://un-est-tout-et-tout-est-un.blogspot.com/2018/09/100-un-peu-dautobio.html
[3] http://www.psychomedia.qc.ca/memoire/2014-05-29/transformation-des-souvenirs
[4] https://un-est-tout-et-tout-est-un.blogspot.com/2017/12/qqoqccp.html
[5] Le pays qu'habitait Albert Einstein Broché – 19 octobre 2016, Etienne Klein
[6] https://www.camilleroux.com/2009/09/20/conseil-realiser-bonne-veille-technologique/
[7] https://linuxfr.org/news/methode-et-outils-pour-la-veille-technologique
[8] https://toiledefond.net/5-outils-pour-commencer-une-veille-sur-internet/

lundi 24 septembre 2018

Python : Manipulation des données

Nous voila dans une petite digression. Je n'avais pas pensé faire un article sur les préceptes de base de la manipulation des listes, des tuples, des tableaux ou encore des dictionnaires en python mais au vue des quelques derniers articles sur l'IA [1-4] et aussi des futurs articles qui auront pour base les frameworks numpy [6], pandas [7] et scikit-learn [8], il nous faut explorer un peu comment nous pouvons manipuler les données, c'est a dire ici les charger, et effectuer des calculs.

Alors nous irons dans la compréhension des structures de données rencontrées de façon récurrente dans l'IA et le machine learning mais nous n'entrerons pas ici dans la visualisation ou l’interprétation des données. Nous nous attarderons sur ces aspects lorsque l'on traitera de la visualisation et de l'analyse statistique des données dans la limite du compréhensible.

Commençons par les bases, ce que python nous permet de base déjà

Les listes

Bon nous ne cherchons pas spécialement a faire un cours sur python donc voyons l'essentielle sur les listes et les manipulations de base. La liste en python est un ensemble de données de taille dynamique et modifiable.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# liste
maListe=[1, 2, 3, 4]
print(maListe)
maListe.append(5)
print(maListe)
print(maListe[:3])#on prend les paramtres avant l'index 3 exclu
print(maListe[3:])# on prend les paramtres apres l'index 3 inclu
malisteN2=[[1, 2, 3, 4],[5,6,7,8],[9,10, 11, 12],[13, 14, 15, 16]]
print(malisteN2)

[1, 2, 3, 4]
[1, 2, 3, 4, 5]
[1, 2, 3]
[4, 5]
[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]