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

Made with Slides.com