MLlib est une librairie de machine Learning qui contient la plus part des algorithmes d’apprentissage classiques (SVMs, naive Bayes, decision tree,régression linéaire, logistic regression,k-means....)
2. Sommaire
Architecture de la plateforme Spark
La librairie MLlib
Les algorithmes de la librairie MLlib
Pourquoi MLlib
Performance
Types de données
Exemples
Fonctions des statistiques descriptives
Application sur python
Matrices distribuées
Références
4. Architecture de Spark
Spark Streaming :
utilisé pour traitement temps-réel des données en flux.
s’appuie sur un mode de traitement en "micro batch"
utilisé pour les données temps-réel DStream, c’est-à-dire une série
de RDD (Resilient Distributed Dataset).
Spark SQL :
Permet d’exposer les jeux de données Spark via API JDBC et
d’exécuter des requêtes de type SQL en utilisant les outils BI et de
visualisation traditionnels.
Permet d’extraire, transformer et charger des données sous
différents formats (JSON, Parquet, base de données) et les
exposer pour des requêtes ad-hoc.
5. Architecture de Spark
Spark GraphX :
GraphX Permet les traitements et de parallélisassions de graphes.
GraphX étend les RDD de Spark en introduisant le Resilient
Distributed Dataset Graph, un multi-graphe orienté avec des
propriétés attachées aux nœuds et aux arrêtes.
GraphX inclut une collection toujours plus importante d’algorithmes
et de builders pour simplifier les tâches d’analyse de graphes
6. Librairie MLlib
MLlib est une librairie de machine learning qui contient tous les
algorithmes d’apprentissage classiques
Traite la classification, la régression, le clustering, le filtrage
collaboratif, la réduction de dimensions…
Developé par MLbase team dans le laboratoire AMPLab
Plus de 80 contributions par divers organisations
Supporter par Scala, Python, and Java APIs
11. Types de données
MLlib propose des vecteurs locaux et matrices locales (stockés
sur un seul nœud de calcul), ainsi que des matrices distribuées
sous forme de RDD
Dense vector: Un vecteur dense emploie un seul tableau (array)
de valeurs
Sparse vector : deux tableaux sont mis en correspondance, un
d’indices et l’autre de valeurs.
12. Types de données
Labeled point Ce type est spécifique aux algorithmes
d’apprentissage et associe un "label", en fait un réel, et un
vecteur.
Ce "label" est soit la valeur de la variable Y quantitative à
modéliser en régression, soit un code de classe : 0.0, 1.0... en
classification supervisée ou discrimination
13. Exemples
scala> import org.apache.spark.mllib.linalg.Vectors
// Créer un vecteur dense (1.5, 0.0, 3.5)
• scala> val vectDense = new DenseVector(Array(1.5, 0.0, 3.5))
//Créer un vecteur creux (1.5, 0.0, 3.5) en indiquant les indices et valeurs
correspondant aux composantes non nulles
• scala> val vectCreux1 = new SparseVector(3, Array(0, 2), Array(1.5, 3.5))
• scala> val vectCreux2 = new SparseVector(3, Array(0, 2), Array(1.5, 3.5))
// Accès à une valeur
• scala> println(vectCreux1(1))
//Taille des vecteurs
• scala> vectDense.size // la méthode size n'a pas d'arguments
//Copie profonde d'un vecteur
• scala> val vectCreux3 = vectCreux1.copy // la méthode copy n'a pas d'arguments
14. Labeled Point
C est un type spécifique aux algorithmes d’apprentissage et
associe un "label", en fait un réel, et un vecteur.
Ce "label" est soit la valeur de la variable Y quantitative à
modéliser en régression, soit un code de classe : 0.0, 1.0... en
classification supervisée ou discrimination.
•scala> import org.apache.spark.mllib.linalg.Vectors //
•scala> import org.apache.spark.mllib.regression.LabeledPoint
•// Créer un point étiquetté avec une étiquette positive et un vecteur dense
•scala> val pointPos = LabeledPoint(1.0, Vectors.dense(1.0, 0.0, 3.0))
•// Créer un point étiquetté avec une étiquette négative et un vecteur creux
• scala> val pointNeg = LabeledPoint(0.0, Vectors.sparse(3, Array(0, 2), Array(1.0, 3.0)))
15. Rating, Model
Rating
Type de données (note d’un article par un client) spécifique aux systèmes de
recommandation et donc à l’algorithme de factorisation (ALS) disponible.
Model
Model La classe Model est le résultat d’un algorithme d’apprentissage qui
dispose de la fonction predict() pour appliquer le modèle à une nouvelle
observation ou à une table de données résiliente de nouvelles observations.
16. Statistique descriptive
Supported function:
- count
- max
- min
- mean
- variance
…
Supported data types
- Dense
- Sparse
- Labeled Point
17. Application sur python
from pyspark.mllib.stat import Statistics
from pyspark.mllib.linalg import Vectors
import numpy as np
## example data(2 x 2 matrix at least)
data= np.array([[1.0,2.0,3.0,4.0,5.0],[1.0,2.0,3.0,4.0,5.0]])
## to RDD
distData = sc.parallelize(data)
## Compute Statistic Value
summary = Statistics.colStats(distData)
print "Duration Statistics:"
print " Mean: {}".format(round(summary.mean()[0],3))
print " St. deviation: {}".format(round(sqrt(summary.variance()[0]),3))
print " Max value: {}".format(round(summary.max()[0],3))
print " Min value: {}".format(round(summary.min()[0],3))
print " Total value count: {}".format(summary.count())
print " Number of non-zero values: {}".format(summary.numNonzeros()[0])
18. Matrices distribuées
Une matrice distribuée a des indices de type Long dont la valeur
commence à 0 pour les lignes et pour les colonnes, et des valeurs
de type Double.
MLlib propose trois types de matrices distribuées .
RowMatrix:
IndexedRowMatrix
CoordinateMatrix
19. Matrices distribuées
RowMatrix
Matrice sans indices de lignes.
Une RowMatrix a comme support un RDD de ses lignes, chaque ligne étant
suffisamment courte pour être représentée par un vecteur local. Le nombre
de lignes peut en revanche être très élevé.
IndexedRowMatrix :
possède des indices des lignes, pour le reste est comme RowMatrix
CoordinateMatrix
matrice qui utilise comme support un RDD de ses éléments ; format
adapté aux matrices qui ont à la fois un grand nombre de lignes et un
grand nombre de colonnes mais sont très creuses
20. Exemples
•scala> import org.apache.spark.mllib.linalg.Vector
•scala> import org.apache.spark.mllib.linalg.distributed.{IndexedRow,
IndexedRowMatrix, RowMatrix}
• // Créer une RowMatrix à partir d'un RDD[Vector]
•scala> val matLignes: RowMatrix = new RowMatrix(lignes)
•// Déterminer la taille de la matrice
•scala> val m = matLignes.numRows()
• scala> val n = matLignes.numCols()
•// Créer une IndexedRowMatrix à partir d'un RDD[IndexedRow]
•scala> val idxRows: RDD[IndexedRow] = sc.parallelize(Seq((0L, Vectors.dense(0.0,
1.0, 2.0)),(1L, Vectors.dense(3.0, 4.0, 5.0)),(2L, Vectors.dense(6.0, 7.0, 8.0))).map(x =>
IndexedRow(x._1, x._2)))
•scala> val matLignesIndexees: IndexedRowMatrix = new IndexedRowMatrix(idxRows)
•// Déterminer la taille de la matrice
•scala> val m = matLignesIndexees.numRows()
•scala> val n = matLignesIndexees.numCols()