aiguille dans botte de foin: scikit-learn et joblib
DESCRIPTION
Présentation à Pycon FR 2010 sur l'apprentissage statistique effiace en Python avec scikit-learn et joblib.TRANSCRIPT
Aiguille et botte de foin :scikit-learn et joblib pour explorer des donnees volumeuses
G. VaroquauxNeurospin + INRIA
Explosion de la quantite de donnees
Explosion de la quantite de donnees
Traitement statistique de donnee (apprentissage)
Resumer l’information
Predire de nouvelles informations
Statistiquement optimal
Algorithmiquement rapide
1 Predire – scikit-learn
2 Resumer – scikit-learn
3 Etre faineant (et efficace) – joblib
1 Predire – scikit-learn
1 Reconnaissance de visage
Andre Bernard Charles Didier
1 Reconnaissance de visage
Andre Bernard Charles Didier
?
1 Methode naıve
1 Estimer les visages typiques a partird’images connues (bruitees).
2 A partir d’une photo (bruitee aussi), trouverle visages typique qui lui ressemble le plus.
1 Une botte de foin
La fraction d’information interessante est faible :Il y a du bruitL’image est grande
0.0 0.5 1.0 1.5 2.0 2.5 3.0Niveau de bruit
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1.0
Taux d
e p
redic
tion
1 2 3 4 5 6 7
Fraction utile du cadre
0.40
0.45
0.50
0.55
0.60
0.65
0.70
Taux d
e p
redic
tion
1 Les vrais donnees sont pourries
http://cswww.essex.ac.uk/mv/allfaces100 individus, 10 photos par individu,a peu pres alignees
1 Validation croisee
1 Choisir une fraction des photos pour les visagesconnus (jeu d’apprentissage).
2 Apprendre les visages typiques et la fonction deprediction dessus.
3 Tester la prediction en essayant de nommer lesphotos non utilisees pour l’apprentissage (jeu detest) et en mesurant le taux d’erreur.
1 Du code : scikit-learn
Objets avec fit/predict prenant des tableaux numpye = E s t i m a t o r ()e . f i t ( known f a c e s , known names )g u e s s e d n a m e s = e . p r e d i c t ( u n k o w n f a c e s )
Generateurs de validation croisee renvoyant des masquesfrom s c i k i t s . l e a r n import c r o s s v a lcv = c r o s s v a l . S t r a t i f i e d K F o l d ( names )for t r a i n , t e s t in cv :
e . f i t ( f a c e s [ t r a i n ], names [ t r a i n ])e . p r e d i c t ( f a c e s [ t e s t ])
Ingredients de base d’un framework d’apprentissage
1 Au final : .5% d’erreur de prediction
Utiliser les k plus proches voisin (kNN) :import numpy as npfrom s c i k i t s . l e a r n import c r o s s v a lfrom s c i k i t s . l e a r n . n e i g h b o r s import N e i g h b o r s
cv = c r o s s v a l . S t r a t i f i e d K F o l d ( l a b e l s , k =5)e = N e i g h b o r s (k =5)e r r o r s = c r o s s v a l . c r o s s v a l s c o r e (e , data ,
l a b e l s , cv = cv )print ’score ’, np.sum( e r r o r s )/ f l o a t ( l e n ( da t a ))
Choisir k pour optimiser le score.Attention 2 boucles imbriquees de validation croisee1 choisir k2 evaluer l’erreur sur des donnees inconnues
2 Resumer – scikit-learn
2 Reduire la taille des donnees
Botte de foin : la taille des donnees nuit a laperformance
Les images contiennent beaucoupd’information redondante
Comment la reduire de facon optimale ?
2 Former des groupes
Pays associes a une devise majeureLa correlation des taux de changes fournit
une mesure d’affinite
2 Former des groupes
Qui se ressemble s’assemble
2 Former des groupes sur une image
Lena
4 8 16 32
2 Former des groupes sur les 1000 visages
k=30 k=50 k=100 k=200Choisir k pour maximiser la prediction(encore une boucle de validation croisee)
2 scikit-learn
Apprentissage statistique en PythonEfficace
Bons algorithmes, numpy + scipy,C + Cython + Python
PythonesqueLicense BSD, objets simples,pas de dependences autres que numpy + scipy
Facile a utiliserAPI uniforme, documentation,parametres par default
3 Etre faineant (et efficace) –joblib
3 Evaluation faineante
On calcule toujours la meme choseBoucles de imbriquees avec transformationssuccessivesCalculs en variant les parametres
DifficultesConnaıtre les dependances entre les etapesSuivre les parametres
Evaluation faineante : ne pas recalculer cequ’on a deja calcule
3 pipeline/data flow programming
3 joblib
Philosophie
Simple ne changez pas vos programmesn’apprenez pas de nouveau paradigmes
Minimal pas de dependances, embarquablepeu de fonctionnalites
Performant grosses donneescalcul parallele
Robuste tolerant aux erreursdebuggable
3 joblib
Evaluation faineante>>> from j o b l i b import Memory>>> mem = Memory( c a c h e d i r =’/tmp/ joblib ’)>>> import numpy as np>>> a = np. v a n d e r (np. a r a n g e (3))>>> s q u a r e = mem. cache (np. s q u a r e )>>> b = s q u a r e (a)
[Memory] C a l l i n g s q u a r e ...s q u a r e ( a r r a y ([[0 , 0, 1],
[1, 1, 1],[4, 2, 1]]))
s q u a r e - 0.0 s>>> c = s q u a r e (a)>>> # Pas de re - evaluation
3 joblib
Evaluation faineante
Hash MD5 des parametres d’entrees (efficace)⇒ pas de modele de donnees et d’execution
Stockage sur disk dans des repertoires separes(efficace – memmap)
Table globale sqlite (verrous :( )
Nettoyage de cache a la volee (beta)
3 joblib
Calcul parallele>>> from j o b l i b import P a r a l l e l , d e l a y e d>>> from math import s q r t>>> P a r a l l e l ( n j o b s =1)( d e l a y e d ( s q r t )( i **2)... for i in r a n g e (7))[0.0 , 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0]
La syntaxe est importante
Le debugage aussi
⇒ Fork agressif
3 joblib
Le futur
Meilleur branchement parallele/memoire
Meilleurs bases de donnees/datastore
2 niveaux de cache (memoire/disk)
Suivit d’execution
3 Traitement de donnees performant. . .
Scikit Learn :Algorithmes etat de l’artProjet jeune
joblibMieux calculerPas que scientifique
http://scikits-learn.sf.nethttp://packages.python.org/joblib