Apache Spark et le machine learning : rêves et réalités
Nastasia Saby
@saby_nastasia
Zenika
Scala.io 2019
#PHP, #Scala, #Spark, #Kafka, #ML, #TDD, #Craft
@saby_nastasia

Data
Data
Transformation
Scala.io - Nastasia Saby @saby_nastasia - Zenika
Statistiques, prédictions, clustering
Terabytes, petabytes
Travail sur machine 1
Travail sur machine 2
Travail sur machine 3
SPARK
Scala.io - Nastasia Saby @saby_nastasia - Zenika
SQL
Streaming
ML
SPARK
Scala.io - Nastasia Saby @saby_nastasia - Zenika
Apprentissage supervisé
Apprentissage non supervisé

Scala.io - Nastasia Saby @saby_nastasia - Zenika
Scala.io - Nastasia Saby @saby_nastasia - Zenika

Faire des clusters avec des citrouilles selon poids
Scala.io - Nastasia Saby @saby_nastasia - Zenika

Choisir aléatoirement un nombre de citrouilles.
Ces citrouilles sont les centres des clusters.
Scala.io - Nastasia Saby @saby_nastasia - Zenika
Scala.io - Nastasia Saby @saby_nastasia - Zenika

Affecter chaque citrouille (élément de la matrice de donnée) au groupe dont elle est le plus proche en son centre
Scala.io - Nastasia Saby @saby_nastasia - Zenika
Scala.io - Nastasia Saby @saby_nastasia - Zenika

Recalculer le centre de chaque cluster
Scala.io - Nastasia Saby @saby_nastasia - Zenika
Répéter
JUSQU‘A CONVERGENCE
OU un certain nombre de fois
Scala.io - Nastasia Saby @saby_nastasia - Zenika
Citrouilles bizarres : pas assez mûres, hantées.
KMeans
Demo
case class Citrouille(nom: String, poids: Int)
Scala.io - Nastasia Saby @saby_nastasia - Zenika
val citrouilles: DataFrame = Seq( Citrouille("Petit1", 5), Citrouille("Petit2", 6), Citrouille("Petit3", 4), Citrouille("Moyen1", 100), Citrouille("Moyen2", 101), Citrouille("Moyen3", 102), Citrouille("Grand1", 1000), Citrouille("Grand2", 1001), Citrouille("Grand3", 1002) ).toDF citrouilles.show
Scala.io - Nastasia Saby @saby_nastasia - Zenika
Scala.io - Nastasia Saby @saby_nastasia - Zenika
val vectorAssembler = new VectorAssembler(). setInputCols(Array("poids")). setOutputCol("features") val citrouillesPretes: DataFrame = vectorAssembler. transform(citrouilles) citrouillesPretes.show
Scala.io - Nastasia Saby @saby_nastasia - Zenika
Scala.io - Nastasia Saby @saby_nastasia - Zenika
val kmeans: KMeans = new KMeans().setK(3) val kmeansModel: KMeansModel = kmeans. fit(citrouillesPretes) kmeansModel.transform(citrouillesPretes).show
Scala.io - Nastasia Saby @saby_nastasia - Zenika
Scala.io - Nastasia Saby @saby_nastasia - Zenika
Type d'algo
Feature engineering
Des trucs que j'aime pas : Vector Assembler, DataFrame
Recalculer le centre de chaque cluster
Scala.io - Nastasia Saby @saby_nastasia - Zenika
Le centre des données





5
6,5
4,5
922
4
Scala.io - Nastasia Saby @saby_nastasia - Zenika
Moyenne : 188.4





5
6,5
4,5
922
4
Scala.io - Nastasia Saby @saby_nastasia - Zenika
Médiane : 4, 4.5, 5, 6.5, 922





4
4,5
5
922
6.5
Scala.io - Nastasia Saby @saby_nastasia - Zenika
Le centre des clusters
KMeans
Moyenne : 188.4
(5 + 6.5 + 4.5 + 922 + 4) / 5





5
6,5
4,5
922
4
Scala.io - Nastasia Saby @saby_nastasia - Zenika
KMedoids





5
6,5
4,5
922
4
Scala.io - Nastasia Saby @saby_nastasia - Zenika
Nombre | Calcul | Résultat |
---|---|---|
5 | 1,5 + 1,5 + 917 + 1 | 921 |
Scala.io - Nastasia Saby @saby_nastasia - Zenika





6.5
5
4,5
922
4
Scala.io - Nastasia Saby @saby_nastasia - Zenika
Nombre | Calcul | Résultat |
---|---|---|
5 | 1,5 + 1,5 + 917 + 1 | 921 |
6.5 | 1.5 + 2 + 915.5 + 2.5 | 921.5 |
Scala.io - Nastasia Saby @saby_nastasia - Zenika
Scala.io - Nastasia Saby @saby_nastasia - Zenika
Nombre | Calcul | Résultat |
---|---|---|
5 | 1,5 + 1,5 + 917 + 1 | 921 |
6.5 | 1.5 + 2 + 915.5 + 2.5 | 921.5 |
4.5 | 1.5 + 2 + 917.5 + 4 | 925 |
922 | 917 + 915.5 + 917.5 + 918 | 3 668 |
4 | 1 + 2.5 + 0.5 + 918 | 922 |
Scala.io - Nastasia Saby @saby_nastasia - Zenika
Nombre | Calcul | Résultat |
---|---|---|
5 | 1,5 + 1,5 + 917 + 1 | 921 |
6.5 | 1.5 + 2 + 915.5 + 2.5 | 921.5 |
4.5 | 1.5 + 2 + 917.5 + 4 | 925 |
922 | 917 + 915.5 + 917.5 + 918 | 3 668 |
4 | 1 + 2.5 + 0.5 + 918 | 922 |
Medoid : 5
KMeans VS KMedoids
KMeans => Plus rapide
KMedoids =>
- Converge mieux
- moins sensible aux valeurs aberrantes
- la valeur appartient au cluster
Spark Packages
Appelle un copain
Machine learning = if/else
Scala.io - Nastasia Saby @saby_nastasia - Zenika

Choisir aléatoirement un nombre de citrouilles.
Ces citrouilles sont les centres des clusters.
Scala.io - Nastasia Saby @saby_nastasia - Zenika
Scala.io - Nastasia Saby @saby_nastasia - Zenika

Affecter chaque citrouille (élément de la matrice de donnée) au groupe dont elle est le plus proche en son centre
Scala.io - Nastasia Saby @saby_nastasia - Zenika
Scala.io - Nastasia Saby @saby_nastasia - Zenika

Recalculer le centre de chaque cluster
Répéter
JUSQU‘A CONVERGENCE
OU un certain nombre de fois
Scala.io - Nastasia Saby @saby_nastasia - Zenika
Scala.io - Nastasia Saby @saby_nastasia - Zenika

Scala.io - Nastasia Saby @saby_nastasia - Zenika
Scala.io - Nastasia Saby @saby_nastasia - Zenika

Scala.io - Nastasia Saby @saby_nastasia - Zenika
//Calculer toutes les distances par rapport aux centres val clusteredCitrouilles: Dataset[ClusteredCitrouilles] = ... clusteredCitrouilles. map(clusteredCitrouille: ClusteredCitrouille => { //Récupérer les centres //Calculer la distance de la citrouille par rapport à tous les centres })
//Calculer toutes les distances par rapport aux centres clusteredCitrouilles. map(clusteredCitrouille: ClusteredCitrouille => { //Récupérer les centres val first = clusteredCitrouille.centres(0) val second = // val third = // //Calculer la distance de la citrouille par rapport à tous les centres })
//Calculer toutes les distances par rapport aux centres clusteredCitrouilles. map(clusteredCitrouille: ClusteredCitrouille => { //Récupérer les centres val first = clusteredCitrouille.centres(0) val second = // val third = // //Calculer la distance de la citrouille par rapport à tous les centres val citrouilleDistance1AvecLeCentre1 = clusteredCitrouille. avecDistance1(""" calcul distance entre la citrouille et le premier centre""") val citrouilleDistanceAvecLeCentre2 = citrouilleWithDistance1.... val citrouilleDistanceAvecLeCentre3 = citrouilleWithDistance2.... citrouilleDistanceAvecLeCentre3 })
Scala.io - Nastasia Saby @saby_nastasia - Zenika
On reprend le contrôle
Dataset
Erreurs à la compilation !
Au revoir vector assembler !
Tuning party !
A toutes les étapes : machine learning, feature engineering
6.5 - 5
5 - 4.5





5
6,5
4,5
922
4
Scala.io - Nastasia Saby @saby_nastasia - Zenika
Dynamic Time Warping
Merci et joyeux halloween
Des questions ?
Nastasia Saby
@saby_nastasia
Zenika
Scala.io 2019
Transcription Scala.io - Apache Spark et ML
By nastasiasaby
Transcription Scala.io - Apache Spark et ML
Présentation Scala.io 2019
- 1,428