Thématiques principales

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/

Aucun commentaire:

Enregistrer un commentaire