Thématiques principales

Affichage des articles dont le libellé est Scikit Learn. Afficher tous les articles
Affichage des articles dont le libellé est Scikit Learn. 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

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

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 15 septembre 2018

IA: Equation normale

Il y a quelques jours, j'avais parlé de l’équation normale dans la régression linéaire [1]. Nous n'avions pas traité de son utilisation dans la régression linéaire parque:
  • c'est la solution analytique et que du coup c'est la solution simple
  • elle ne s'applique qui si les jeux de données sont limitées
  • c'est pas fun car on voulait utiliser la descente de gradient.
Du coup nous l'avions laissé de coté, la pauvre....

Aujourd'hui on va rendre a l’équation normale ce qui appartient à l’équation normale, c'est a dire la régression linéaire.

Dans le principe, l’équation normale [2] est la résolution analytique parfaite des coefficients du modèle linéaire:



Avec Theta, le vecteur des coefficients du modèle, X le vecteur des données d'entrée et Y le vecteur des données de sortie attendues.

Pour illustrer cela, prenons un exemple en python:


1
2
3
4
5
6
7
import numpy as np
 
MAX=1000
    
X=  np.arange( 0, MAX )
T= 4+3*X  
Y= T + (np.random.rand(1,MAX)-0.5)[0]*3000 

Dans cet exemple, nous allons construire une série de valeur de 0 a 3000, on en calcule la série T équivalente selon une droite dont on va bruité les données: la série Y.

Représentons ces données:

1
2
3
4
5
import matplotlib.pyplot as plt
fig = plt.figure(1,figsize=(8,8))
plt.plot(X,T,"b-")# model lineaire
plt.plot(X,Y,"r.")# model lineaire bruité
plt.show(



Donc on a bien déployer nos données autour de la droite T. Avant de chercher des paramètres, en première approche, nous pourrions nous demander si l’équation normale est capable de nous retrouver les paramètres initiaux de la droite avant que celle ci ne soit bruitée.

Appliquons l'equation normale a (X,T) afin de voir si le Theta resultant est bien le couple (4,3):


1
2
3
4
5
Xmat=np.c_[np.ones((len(X),1)),np.mat(X).T]
Ymat=np.mat(T).T

Verif=np.linalg.inv(Xmat.T.dot(Xmat)).dot(Xmat.T).dot(T)
print(Verif)

De résultat:

[[4.]
 [3.]]

Cool! Au moins on sait que l'on sait retrouver nos paramètres! A noter la préparation des données avec la fonction c_ (concatenate) et ones qui permet de construire une matrice unitaire (rempli de 1). L'objectif de cette préparation est de permettre de produire une paire de valeur.

Maintenant reprenons nos données buitées et calculons nos paramètres, au passage calculons les valeurs résultants du modèle sur l'ensemble des valeurs d'entrées:

1
2
3
4
Xmat=np.c_[np.ones((len(X),1)),np.mat(X).T]
Ymat=np.mat(Y).T
TheTa=np.linalg.inv(Xmat.T.dot(Xmat)).dot(Xmat.T).dot(Ymat)
print(TheTa)

donnant:

[[-165.91134982]
 [   3.24312348]]

OK cela ne correspond pas a nos paramètres initiaux. Mais peut etre que cela donne une bonne approximation de nos données. Superposons les graphes:


1
2
3
4
5
6
ThetaD=np.array(TheTa[0])+np.array(TheTa[1])*X
fig = plt.figure(1,figsize=(8,8))
plt.plot(X,Y,"r.")# model lineaire bruité
plt.plot(X,T,"b-")# model lineaire
plt.plot(X,ThetaD.T,"y-") # taux erreur de base deux precedents
plt.show()

Effectivement nos deux droites ne sont pas les mêmes, cependant, au vue de la dispersion, celle estimé est une assez bonne approximation de la première. Bien sur c'est lorsque l'on sortira du périmètre de l'ensemble [0-1000] que les encarts se feront les plus important. Il faudra donc en tenir compte lors de l'utilisation du modèle résultant de façon a minimiser les erreurs.

Voila, en fournissant une solution analytique, l’équation normale fourni une approche assez immédiate pour la détermination des paramètres de notre modèle. Apres il reste comme tout autre approche limité par l'ensemble des données du jeu d’apprentissage dont la taille peut rendre celle ci rédhibitoire.

Références

[1] https://un-est-tout-et-tout-est-un.blogspot.com/2018/09/started-ia-neuromimetique-la-regression.html
[2] http://gilles.dubois10.free.fr/geometrie_affine/eucliequanorm.html

dimanche 9 septembre 2018

IA : Neuromimétique, la régression linéaire

Nous revoilà sur un sujet un peu plus sympa pour ce début septembre, la régression linéaire.

Cet article aurait du être publié en août mais le temps a manqué, et j'ai voulu profiter du précédent article sur les Streams [1] pour essayer une approche un peu différente de ce tour d'horizon de ce que l'on peut faire avec un neurone!

Du coup aujourd'hui, il s'agit de présenter la régression linéaire en s'appuyant sur les Streams Java. Comme nous l'avions vu dans les articles précédents sur l'IA [2], nous allons créer un jeu de données d'apprentissage et un jeu de donnée de test sur deux cas d'utilisations (en fait 3 nous verrons pourquoi):
  • l'un sur l'identification de paramètres : nous allons donc demander a notre neurone de nous donner les paramètres (a,b) d'une droite tel que y=a.x+b
  • l'un sur la construction d'un modèle prédictif partant d'une droite bruité artificiellement (nous traiterons ici de plusieurs cas différents afin de considérer les situations qui marchent bien de celles, moins pertinentes)
Pour cela, nous n’utiliserons qu'un seul modèle de fonction d’activation : le linéaire [3]. Nous pourrions utiliser le sigmoïde mais ça risque de faire vraiment long... peut être que dans un autre article nous nous intéresserons a cette dernière.

Enfin concernant le mode d'apprentissage, nous utiliserons un apprentissage supervisé. Nous n'avions pas beaucoup parlé de ce point dans nos précédents articles sur la classification [2] [4], ou nous avions élaboré un modèle basé sur une correction simple du vecteur des paramétrés portés par les dendrites du neurone. Ici ça sera l'occasion de découvrir la descente de gradient [5] et par la même occasion quelques fonctions de coût nous permettant d’évaluer l'efficacité de notre modèle.

Pour bien comprendre cet article, je vais d'abord en donner les lignes directrices:

  1. Tout d'abord, comme nous n'utilisons pas encore de frameworks spécifiques pour le machine learning (comme scikit-learn [6]) ou de framework de réseau de neurone comme Tensor-Flow [7] ou Keras [8]), il nous faut d'abord construire un  neurone, lui donner une implémentation pour la fonction d'activation, et lui donner une fonction d'apprentissage.
  2. Ensuite, nous tacherons de monitorer le neurone lors de son fonctionnement afin de nous permettre d'observer comment vont évoluer ses paramètres lors de l'apprentissage, et comment va évoluer son  efficacité en fonction de ses paramètres.
  3. Enfin, nous ferons une petite séance de visualisation de données sous python afin d'avoir des schémas explicatifs des données monitorées.

Voila, ça va être dense!

Le neurone

Nous en avions déjà fait un en python pour la classification. Ici on va aller a l'essentiel:

  • Un tableau de paramètre représentant les poids des dendrites (biais inclus).
  • Une fonction linearInfer permettant le calcul de la sortie du neurone (produit matricielle du vecteur d'entrée avec le vecteur des poids) inféré sur la fonction d'activation linéaire).
  • Une fonction d'apprentissage learnStep permettant la correction des poids selon des données étiquetés fourni par la classe Data
  • Quelques méthodes utilitaires comme la méthode reset permettant d'initialiser les données des poids de façon aléatoire.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class Neurone {

    public Double[] dendrites;

    public Neurone(int inSize)
    {
        this.reset(inSize);
        System.out.println(this);
    }

    public void setParameter(Double v,Double b)
    {
        this.dendrites[0]=v;
        this.dendrites[1]=b;
    }

    public void reset(int inSize)
    {
        this.dendrites= Stream.generate(() -> Math.random()/1000).limit(inSize+1).toArray(Double[]::new);
    }

    public Double linearInfer(Double[] stepInputs)
    {
        ...      
    }

    public void learnStep(Set<Data> datasSet)
    {
        ...
    }

}


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
public class Data {

    public Double[] input;
    public Double output;


    public Data(Double[] input,Double output)
    {
        this.input=input;
        this.output=output;

    }
}

Nous voila donc une ébauche de neurone et une structure de données pour gérer les données d'apprentissage.


samedi 17 mars 2018

IA : Lecture

Nous avions vu dans un précédent article quelques livres dont j'avais agréablement parcouru les pages [1]. J'avais eu réellement un coup de cœur pour le livre de Aurelien Géron "Machine Learning avec Scikit-Learn" et ce à tel point que j'ai poursuivi sur la suite "Deep Learning avec Tensor Flow".



Honnêtement, je vais pas tourner au tour du pot, ce livre est une référence. Pour avoir suivi un cursus d’ingénieur en automatique et en informatique et avoir eut un cours sur les réseaux de neurones, je voulais d'une part, me rafraîchir la mémoire et me mettre à jour, et bien banco!

Tout y es avec toutes les références qu'il faut pour poursuivre l'aventure (les publications scientifiques ça n'a pas de prix!) Alors il est clair que ce n'est pas un sujet simple, quelques bonnes bases en mathématique (algèbre linéaire) sont nécessaires et aussi un peu en programmation (et encore le framework Tensor Flow est assez clair dans les principes).

Remarquez qu'il est plus simple d'aborder ce livre en lisant le premier volume sur le Machine Learning. Ce premier permet de donner de bonnes bases dans les démarches de traitement des données et sur les procédures d'apprentissages afin d'en appréhender un peu le lexique.

Au delà de cela, les grandes familles de réseaux neuronaux sont décrites, les types de fonctions d'activations, les méthodes d'apprentissages, leurs architectures... avec pour ma part une petite préférence pour les réseaux de Hopfield et de Markov car quelques part, ils me font penser aux SED (allez savoir pourquoi...)

Enfin voila, lisez le!

Références:

[1] http://un-est-tout-et-tout-est-un.blogspot.fr/2018/02/ia-petit-point-de-litterature.html

samedi 17 février 2018

IA : Petit point de littérature

Petit retour sur quelques lectures du début d'année .

Un premier livre qui donne des bases théoriques et techniques complètes en machine learning, pour ceux qui aiment le python je recommande vivement, et pour les autres aussi car Scikit learn est un incontournable, donc c'est aussi une bonne occasion de se mettre au python.

A destination d'un public avec un minimum de bagages techniques...

Machine Learning avec Scikit-Learn




Le second livre est traite du deep learning. Honnêtement, un peu déçu, l'ouvrage s'adresse vraiment a qui ne connait vraiment rien sur le sujet, (même pas qu'il nécessite de maîtriser quelques rudiments de calcul matriciel), en même temps, il est vraiment que ce n'est qu'une "introduction". 

Je conseille aux pures novices, qui étudient le sujet par curiosité.

Comprendre le Deep Learning




Un troisième ouvrage sur lequel je ne fondais pas beaucoup d'espoirs... Et grosse surprise, un ouvrage bien construit et complet, suffisamment abstrait sur les sujets du Dig Data, du ML et des rudiments du DL pour conclure que : 
  • tout manager se doit de le lire pour comprendre le monde qui se profile ces prochaines années 
  • suffisamment technique pour orienter les techos sur les frameworks principaux des ces domaines avec la bonne dose d'explications pour en comprendre les utilisations et les architectures types 

Un indispensable je pense pour celui qui veut entrer dans ces trois sujets a la fois et en comprendre les tenants et aboutissants.

Big Data et Machine Learning


Voila un petit aperçu de mes dernières lectures, ces dernières me serviront pour les prochains articles  qui traiteront de l'IA mais avant il reste deux à traiter
Mais je reviendrais sur ces deux livres