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,344