Vous êtes sur la page 1sur 50

APACHE SPARK MLIB : PRINCIPES ET CONCEPTS POUR LA MISE

EN ŒUVRE DES MÉTHODES D’APPRENTISSAGE

DR MUSTAPHA MICHRAFY

CONTACT : DATASCIENCE.KM@GMAIL.COM
PLAN M.MICHRAFY

1. Contexte
2. Objectif et prérequis
3. Spark MLIB, Motivations
4. Concepts pour la mise en place des algorithmes de Spark ML
5. DataFrame, Motivations
6. Pipeline et ses composants
7. API Pipeline en Spark MLIB
8. ‘Transformers’ et ‘Estimators’ en Spark MLIB
9. Transformer : étapes
10. Gestion des paramètres en Spark MLIB
11. Quelques ‘Transformers’ et ‘Estimators’
12. Techniques pour l’évaluation d’une méthode d’apprentissage
13. API pour l’évaluation d’un algorithme d’apprentissage sous Spark ML
14.Validation croisée
15. Illustration et mise en œuvre sous Spark ML

2
CONTEXTE M.MICHRAFY

Cette étude a été menée dans le cadre des rencontres de travail


organisées au Laboratoire CERMSEM, Centre d'Économie de la
Sorbonne (CES).

Elle vise à présenter les étapes pour la mise en œuvre d’une


méthode d’apprentissage dans le cadre de Spark ML ( API
d’apprentissage de SPARK).

3
OBJECTIF ET PRÉREQUIS M.MICHRAFY

Objectif Prérequis
Cette étude vise à présenter les étapes d’un • Connaissance du langage Scala
workflow pour la mise en place des • Connaissance de Spark et Spark SQL
méthodes d’apprentissage basées sur l’API • Connaissance des méthodes
Apache Spark ML. d’apprentissage

4
SPARK ML : MOTIVATIONS ? M.MICHRAFY

SPARK ML ? Fonctionnalités
• Spark ML est une brique logiciel incontournable de • Préparer, enrichir, transformer des données
la plate forme Apache Spark. • L’API de Spark ML propose plusieurs transformateurs
• L’API Spark ML est dédiée à la mise en place des • Algorithmes pour le développement et la mise au
méthodes d’apprentissage. point des méthodes de :
• Spark ML offre des services couvrant la o Classification
préparation des données, l’enrichissement, la o Régression
mise au point des méthodes d’apprentissage, et le o Clustering
déploiement. o Recommandation

• En Apache Spark, deux API sont dédiées aux méthodes


d’apprentissage :
1. Spark ML : il est basé sur l’API DataFrame
2. Spark MLIB : il est basée sur RDD.
• Dans cette présentation, nous nous intéressons seulement à
Spark ML. Par conséquent, l’API Spark MLIB ne sera pas abordée.

5
CONCEPTS POUR LA MISE EN PLACE DES ALGORITHMES DE SPARK ML
Transformers
DataFrame Ce sont des algorithmes
C’est une structure de permettant de transformer une
données distribuée, orientée dataFrame en une autre
colonne et adaptée pour les
données statistiques ou Parameters
méthodes d’apprentissage
Les Transformers et Estimators
partagent la même API pour
Estimators Concepts spécifier les paramètres.
Ce sont des algorithmes visant
à ajuster une fonction entre les Spark ML Pipeline
Un pipeline est constitué de plusieurs
variables explicatives et la
variable cible. Les algorithmes Transformers et Estimators pour la
s’appuient sur les données mise en place d’un workflow ML.
d’une DataFrame.

Evaluators Cross Validation


Technique pour mettre au
Mesures pour évaluer la
point une méthode
performance d’une méthode
d’apprentissage
d’apprentissage.

6
DATAFRAME : MOTIVATIONS

Variété des données


• Les méthodes d’apprentissage
trouvent des applications dans • Alors quelle structure
divers domaines, et nécessitant de données utilisée ?
divers types de données.

DataFrame est constituée de Popularisée par R,


n lignes (les individus) repris par python(Pandas)
m colonnes (les variables) enfin, étendue par Saprk SQL
une colonne est typée (vecteur)
• Distribuée, résiliente, orientée
colonne, optimisée
• Supportant divers types de
données, inclus les vecteurs

DataFrame

7
PIPELINE ET SES COMPOSANTS

PIPELINE
 Un pipeline est une séquence d’étapes finies.
 Chaque étape est associée à un Estimator ou un Transformer
 Un Estimator est une interface qui doit implémenter la
méthode fit()
 Un transformer est une interface nécessitant l’implémentation
de la méthode transform()
 Transformer.transform() et Estimator.fit() sont des états légers.
 Chaque instance du Transformer ou Estimator dispose d’un
identifiant unique.
Transformer Estimator

8
API PIPELINE EN SPARK MLIB

Pipeline & PipelineStage Etape de Transformation Etape d’Estimation


• Une méthode d’apprentissage • Pour une étape de • Pour une étape d’estimation, la
fait appel à des phases de transformation, la méthode méthode fit() d’un Estimator est
traitement, et d’apprentissage. transform() est appelée sur une appelée sur une dataframe pour
• Un Pipeline, en Spark MLIB, est Dataframe et retourne une produire un Transformer
une séquence d’éléments de DataFrame.
type pipelineStage.
• Chaque PipelineStage est
constitué d’un Transformer ou
d’un Estimator. DataFrame DataFrame
• Par conséquent, l’ordre des
étapes (PiplineStage) est
important

Pipeline
DataFrame Transformer

PipelineStage
9
TRANSFORMER ET ESTIMATOR EN SPARK MLIB

Transformer Estimator Package


• Un transformer permet de • Un estimateur permet d’évaluer • Les implémentations de transformer
transformer des données. ou approcher un paramètre dans :org.apache.spark.ml.feature
• En Spark ML, un transformer inconnu. • Des implémentation d’Estimators dans :
permet de transformer une • Un estimateur statistique vise à org.apache.spark.ml.regression
DataFrame en une autre évaluer un paramètre inconnu org.apache.spark.ml.recomendation
DataFrame. via un échantillon de données org.apache.spark.ml.clustering
• Transformer est une classe • En Spark ML, un Estimator est un org.apache.spark.ml.feature
abstraite qui étend la classe opérateur qui prend en entrée org.apache.spark.ml.classification
abstraite pipelineStage. une DataFrame et retourne un …
Transformer. ….

Params
Estimator & Transformer

DataFrame DataFrame
Hiérarchie :

Transformer

Estimator
PipelineStage

Estimator Transformer DataFrame Transformer


10
ETAPES POUR LE TRANSFORMATEUR & ESTIMATEUR

Transformateur Estimateur

Créer l’opérateur de
transformation Créer l’estimateur

Positionner les paramètres Positionner les paramètres


d’entrée d’entrée

fit : ajuster le modèle selon


les données

transform : générer la transform : générer la


nouvelle DataFrame nouvelle DataFrame

11
PARAMETRES
Intérêt Serializable
• Les transformateurs, les
estimateurs, les évaluateurs ParamPair Param
nécessitent des paramètres.
• Spark ML propose un package
dédié à la gestion des ParamMap Params
paramètres, partagé par les
estimateurs et les LongParam
transformateurs.

BooleanParam
Package Param
DoubleParam
• Le package est :
org.apache.spark.ml.param FloatParam
• La classe de base est Param. StringArrayParam
• Des spécialisations de Param, IntParam
sont proposées, portant sur des IntArrayParam Transformer
primitifs (Int, Long, Float,
Boolean,Double, String, IntArray, DoubleArrayParam Estimator
…)
• Les classes Transformer et
Estimator étendent la classe 12
Params.
QUELQUES TRANSFORMERS ET ESTIMATORS

Transformers Estimators

 Tokenization : segmenter un texte en une liste de mots.  StringIndexer : coder des catégories
 Binarization : transformer des valeurs numériques en  IndexToString : décoder des index
valeurs binaires.
 VectorIndexer : identifier des variables catégorielles
 Normalizer : normaliser des vecteur en utilisant p-norm. selon un seuil de fréquence

 N-gram : calculer le prochain caractère à partir d’une  QuantileDiscretizer : transformer une variable
séquence d’article quantitative en une variable qualitative en utilisant le
quantile
 MinMaxScaler : transformer une variable quantitative
vers une variable quantitative avec des valeurs dans  StandardScaler : normaliser un vecteur en utilisant la
un intervalle donné. variance

 Etc.  Etc.

13
EVALUER UNE MÉTHODE D’APPRENTISSAGE

Mesure d’évaluation ?
• Pour évaluer la performance d’une
méthode d’apprentissage, nous
utilisons des mesures dédiées.
• Quelles sont les mesures d’évaluation
pour les méthodes de classification?
• Pour un individu donné, une
mesure d’évaluation exploite la
valeur ajustée et la valeur de
référence. • Quelles sont les mesures d’évaluation
• Nous avons des mesures pour : pour les méthodes de régression?
1. les méthodes de régression
2. les méthodes de classification.

• Le choix de la méthode
d’évaluation dépend du problème
traité et de la connaissance métier
associée.
14
EVALUER UNE MÉTHODE D’APPRENTISSAGE : CLASSIFICATION

Matrice de confusion Mesures d’évaluation La courbe de ROC


• Elle vise à mesurer la qualité • Sensibilité : le taux de cas • La courbe ROC (receiver
d'une méthode de positifs correctement identifiés operating characteristic) est
classification. • Spécificité : le taux de cas utilisée pour évaluer la
• Elle indique si la méthode négatifs correctement identifiés performance d’un classifier
parvient à classifier • Accuracy : le taux de cas binaire.
correctement les individus. positifs ou négatifs • La courbe de ROC est la
Prédite correctement identifiés. courbe qui donne la sensibilité
• F-mesure : le taux qui combine en fonction de la spécificité.
Positif Négatif
la sensibilité et la spécificité
Réelle

Positif TP FN
Négatif FP TN
Matrice de confusion

• Les mesures d’évaluation utilisent les notions : • Formules :


1. VP (vrais positifs) : nombre de positifs classés positifs 1. Sensibilité = VP/(VP+FN)
2. FP (faux positifs) : nombre de négatifs classés positifs 2. Spécificité = VN/(VN + FN)
3. FN (faux négatifs) : nombre de positifs classés négatifs 3. Accuracy = (VP + VN)/(VP + VN + FP + FN)
4. VN(vrais négatifs) : nombre de négatifs classés 4. F2 = 2.(Sensibilité+Spécificité)/(Sensibilité + Spécificité)
négatifs
15
EVALUER UNE MÉTHODE D’APPRENTISSAGE : RÉGRESSION

Intérêt des mesures


𝑛

• Elle vise à mesurer la qualité d'une 𝑀𝑆𝐸 = 𝑦𝑙 − 𝑦𝒍 2

méthode de régression en 𝑙=1


calculant une erreur globale
• Une erreur est proche de zéro RMSE = 𝑀𝑆𝐸
indique la pertinence du modèle
𝑛

𝑀𝐴𝐸 = 𝑦𝑙 − 𝑦𝑙
Principales mesures
𝑙=1

• MSE : Erreur quadratique moyenne


(mean Squared Error) 𝑅 2 = 1 − 𝑀𝑆𝐸 𝑛
𝑙=1(𝑦𝑙 − 𝑦)2
• RMSE : c’est la racine carrée de MSE
(root Mean Squared Error)
𝑛 (𝑦𝑙 − 𝑦𝑙 )
• R : Coefficient de détermination 𝑙=1 𝑦𝑙
• MAE : Erreur absolue moyenne 𝑀𝐴𝑃𝐸 = . 100
𝑛
(mean Absolute Error)
• MAPE : Erreur absolue moyenne en
pourcentage (Mean Absolute y𝑙 𝑒𝑠𝑡 𝑙𝑎 𝑣𝑎𝑙𝑒𝑢𝑟 𝑟é𝑒𝑙, (𝑦 est la moyenne de 𝑦 )
Percentage Error) 𝑦𝑙 𝑒𝑠𝑡 𝑙𝑎 𝑣𝑎𝑙𝑒𝑢𝑟 𝑎𝑗𝑢𝑠𝑡é𝑒,
𝑛 𝑑𝑒𝑠𝑖𝑔𝑛𝑒 𝑙𝑒 𝑛𝑜𝑚𝑏𝑟𝑒 𝑑′𝑜𝑏𝑠𝑒𝑟𝑣𝑎𝑡𝑖𝑜𝑛𝑠
16
API POUR L’ÉVALUATION D’UN ALGORITHME D’APPRENTISSAGE 1/2

 Evaluator : Classe abstraite pour l’évaluation  L’API Spark ML propose trois implémentations pour la classe
de la méthode d’apprentissage. abstraite Evaluator.
 Le package : org.apache.spark.ml.evaluation  Les classes sont :
 Trois méthodes à implémenter : 1. RegressionEvaluator pour les méthodes de régression
1. Evaluate : évaluer le modèle 2. BinaryClassificationEvaluator : pour les méthodes de
2. copy : copier une instance du modèle classification binaire
3. uid : associer un ID 3. MulticlassClassificationEvaluator : pour les méthodes de
classification muti-classes.

Evaluator

Pour la régression RegressionEvaluator

Pour la classification binaire BinaryClassificationEvaluator

Pour la classification multi-classes MulticlassClassificationEvaluator


17
API POUR L’ÉVALUATION D’UN ALGORITHME D’APPRENTISSAGE 2/2

 RegressionEvaluator : une classe dédiée aux Package : org.apache.spark.ml.evaluation


algorithmes de régression.
 Différentes mesures sont proposées:
1. RMSE (par défaut) Evaluator
2. MSE
3. R2
4. MAE
 BinaryClassificationEvaluator : une classe
dédiée à l’évaluation des algorithmes de RegressionEvaluator
MulticlassClassificationEvaluator
classification binaire.
 Elle propose deux mesures :
1. areaUnderROC (par défaut) BinaryClassificationEvaluator
2. areaUnderPR

 MulticlassClassificationEvaluator : une classe Pour les trois classes d’évaluation, il est possible de fixer :
dédiée à l’évaluation des algorithmes de 1. Le nom de la colonne label avec la méthode setlabelCol
classification multi-modales. 2. Le nom de la colonne prédite avec la méthode
 Elle propose différentes mesures : setPredictionCol
1. F1 (par défaut) 3. La mesure d’évaluation avec la méthode setMetricName
2. weightedPrecision
3. weightedRecall
4. accuracy 18
VALIDATION CROISÉE 1/2
Intérêt
• La validation croisée est une
méthode d’estimation de fiabilité
d’un modèle, basée sur une
Alors quelles sont les méthodes
technique d’échantillonnage.
portant sur la validation croisée ?
• Elle permet :
• d’optimiser les paramètres du
modèle,
• d’éviter le sur-apprentissage

• Diviser l'échantillon de taille n en deux sous • Diviser les données en k échantillons(i..k)


échantillons : apprentissage (>60%), test (< • Sélectionner un échantillon i pour la validation
30%). et le reste des données pour l'apprentissage.
• Le modèle est ajusté sur l'échantillon • Calculer le score de performance
d'apprentissage et validé sur l'échantillon de • Répéter les étapes 2-3 en sélectionnant un
test. autre échantillon de validation.
• L'erreur est estimée en calculant une mesure • Estimer l’erreur de prédiction en calculant la
ou un score de performance du modèle sur moyenne des k erreurs quadratiques
l'échantillon de test. moyennes
Testset validation k-fold Cross-validation
19
VALIDATION CROISÉE 2/2

Tests et validation k-fold Cross-validation


A. Diviser l'échantillon de taille n en deux sous 1. Diviser les données en k échantillons(i..k)
échantillons : apprentissage (> 60%), test (< 30%). 2. Sélectionner un échantillon i pour la validation et le
B. Le modèle est ajusté sur l'échantillon d'apprentissage reste des données pour l'apprentissage.
et validé sur l'échantillon de test. 3. Calculer le score de performance
C. L'erreur est estimée en calculant une mesure ou un 4. Répéter les étapes 2-3 en sélectionnant un autre
score de performance du modèle sur l'échantillon de échantillon de validation.
test. 5. Estimer l’erreur de prédiction en calculer la moyenne
des k erreurs quadratiques moyennes

DT DA 1 e1
2 e2
A 3 .
.
4 .
B Ajuster le modèle sur DA et 5
valider le modèle sur DT 6 e6
C Estimer l’erreur e
Appliquer A et B pour chaque couple d’échantillon
Calculer les erreurs e1 ….e6
Calculer l’erreur de prédiction
DA : données d’apprentissage
DT : données de test 20
M.MICHRAFY
ML TUNING : SÉLECTION DU MODÈLE ET CHOIX DES PARAMÈTRES

Tuning sous Spark ML


• Spark ML propose des outils (ML org.apache.spark.ml.tuning
tuning) pour la sélection et
l’optimisation d’un modèle.
• Spark ML tuning s’appuie sur : associé au
• La validation croisée
• L’ étude du comportement des Estimator Pipeline
paramètres nécessite s’applique sur
Tuning ML
Tuning et classes associées Evaluator Estimator
• La package portant sur le tuning ML
est org.apache.spark.ml.tuning Paramètres est un
• Spark ML Tuning propose deux
classes étendant Estimator :
1. CrossValidator : pour la
validation croisée
2. TrainValidationSplit : pour CrossValidation TrainValidationSplit
l’optimisation des paramètres
d’une méthode ML.
• Les deux classes nécessitent :
• Estimator
• Evaluator 21
• Parameters
ML TUNING : CROSSVALIDATOR

Classe modélise
CrossValidator
CrossValidator Méthode k-fold
• CrossValidator est la classe
dédiée à la validation croisée.
• C’est l’implémentation de la • Estimator : fixer l’estimateur ML ou le
méthode k-fold. pipeline.
• Elle ne dispose pas de • Evaluator : fixer la mesure d’évaluation.
constructeur Etape d’Initialisation • EstimatorParamMaps : fixer les paramètres
de l’estimateur ML
Mise en place ? • numFolds : fixer le nombre de fold
• Seed : initialiser le générateur aléatoire
Deux étapes : initialisation et
réalisation • fit : cette méthode applique la validation
• Etape initialisation : fixer les Etape d’ajustement croisée et génère les modèles associés.
paramètres d’entrée • Elle retourne un objet de type
• Etape d’ajustement : CrossValidatorModel.
effectuer la validation croisée
via la méthode fit

Alors, quelle sont les méthodes de la classe


CrossValidationModel ?
22
M.MICHRAFY
ML TUNING : CROSSVALIDATORMODEL

CrossValidatorModel Fonctionnalités
• CrossValidatorModel est la • avgMetrics : permet d’accéder à la mesure moyenne pour chaque entrée
classe qui encapsule le de la map des paramètres.
modèle de validation
croisée. • bestModel : retourne le meilleur modèle identifié pendant la validation
croisée.
• Une instance de la classe
CrossValidatorModel est • save : enregistre le modèle ML dans un fichier.
retournée par la méthode fit
de de l’objet CrossValidator • write : retourne une instance de MLwriter qui encapsule le modèle ML.

• Transform : prédire les valeurs de la variable dépendante pour les données


de test. Cette méthode applique le meilleur modèle identifié

23
API SPARK ML : VUE PACKAGES

Package dédié la gestion des Package pour la préparation


paramètres. et le formatage des données.

Package pour l’ évaluation


des méthodes
d’apprentissage
Package dédié aux méthodes Package dédié aux méthodes
de classification de clustering

Package pour la mise au point


des méthodes ML

Package dédié aux méthodes Package dédié aux méthodes


de recommandation de régression

24
MISE EN ŒUVRE SOUS APACHE SPARK ML

• Cette section présente la mise en œuvre sous Spark ML :

1. Les transformateurs et les estimateurs pour la préparation et formatage des


données
2. Les pipelines
3. L’évaluation des méthodes d’apprentissage
4. La mise au point d’un algorithme d’apprentissage

• Les exemples ont été réalisés avec Apache Spark version 2.0.2
• Le langage utilisé est Scala.

• Un prérequis de base en méthodes d’apprentissage est nécessaire

25
LES DONNÉES UTILISÉES

• Description : le jeu de données porte sur la pollution de l’air (112 individus et 13 variables)
OZONE • Variables explicatives : T9, T12, T15, Ne9, Ne12, Ne15, Vx9, Vx12, Vx15, maxO3v, vent, pluie
• Variable dépendante (cible) : maxO3
• URL : http://www.agrocampus-ouest.fr/math/livreR/ozone.txt

• Description : le jeu de données comprend 50 échantillons de chacune des trois espèces d'iris
IRIS • Variables explicatives : Sepallength, Sepalwidth, Petallength, Petalwidth
• Variable dépendante (cible) : Species
• URL : https://archive.ics.uci.edu/ml/machine-learning-databases/iris/

• Description : le jeu de données porte sur le concert de prostate


PROSTATE • Variables explicatives : age, acide, rayonx, taille, grade, Y, log.acid
• Variable dépendante (cible) : Y
• URL : http://www.agrocampus-ouest.fr/math/livreR/cancerprostate.txt

• Il est important de télécharger les jeux de données en local afin de les utiliser.

26
M.MICHRAFY
MISE EN OUVRE DES TRANSFORMATEURS ET ESTIMATEURS

• Cette section présente des transformateurs avec des exemples utilisant


l’API Spark ML

• Les transformateurs présentés sont :


1. IndexToString
2. StringIndexer
3. VectorIndexer
4. OneHotEncoder
5. Normalizer
6. Tokenizer
7. Binarizer
8. VectorAssembler

27
TRANSFORMER : INDEXER VERS STRING M.MICHRAFY

Objectif Exemple
 StringIndexer code une String en // importer de StringIndexer
un double ( plutôt c’est un entier import org.apache.spark.ml. feature.StringIndexer
naturel) // créer une dataFrame à partir d’une séquence
val sq = Seq((0, “aa"), (1, “ab"), (2, "cd"), (3, "ad"), (4, "aa"))
 Ceci permet de gérer les val dfin = spark.createDataFrame(sq). toDF("id", "category")
variables qualitatives en Spark // Etablir le modèle (fit) et construire la colonne sortie (transform)
ML. val indexer = new StringIndexer()
.setInputCol("category" .setOutputCol("categoryIndex")
 StringIndexer permet de coder
une seule variable. val dfout = indexer.fit(dfin).transform(dfin)

dfout. printSchema
root
|-- id: integer (nullable = false)
|-- category: string (nullable = true)
|-- categoryIndex: double (nullable = true)

dfout.show(2)
| id|category|categoryIndex|
| 0| aa| 0.0|
| 1| ab| 2.0|

28
TRANSFORMER : INDEXER VERS STRING M.MICHRAFY

Objectif Exemple
 IndexToString décode un double // importer StringIndexer et , IndexToString
en une String. import org.apache.spark.ml. feature.{StringIndexer, IndexToString}
val sq = Seq((0, “aa"), (1, “ab"), (2, "cd"), (3, "ad"), (4, "aa"))
 indexToString est l’application val dfin = spark.createDataFrame(sq). toDF("id", "category")
inverse de StringIndexer . // fixer la colonne de sortie
val indexer = new StringIndexer()
 Ceci est utile pour retrouver le .setInputCol("category") .setOutputCol("categoryIndex")
nom initiale d’une variable // Etablir le modèle (fit) et construire la colonne sortie (transform)
catégorielle val indexed = indexer.fit(dfin).transform(dfin)

val converter = new IndexToString()


.setInputCol("categoryIndex").setOutputCol("originalCategory")
val converted = converter.transform(indexed)
converted.select("Category", "originalCategory"). printSchema
root
|-- Category: string (nullable = true)
|-- originalCategory: string (nullable = true)
converted.select("Category", "originalCategory").show(2)
|Category|originalCategory|
| a| a|
| b| b|

29
TRANSFORMER : INDENTIFICATION ET CONVERSION VERS VARIABLES
M.MICHRAFY
CATÉGORIELLES
Objectif Exemple
 VectorIndexer permet d’identifier import org.apache.spark.ml. feature.VectorIndexer // importer VectorIndexer
des valeurs catégorielles selon un val dt = spark.read.format(“libsvm”).load(“data.txt”) // charger les données
seuil en utilisant la méthode fit. // fixer la colonne d’entrée et celui de la sortie
val indexer = new StringIndexer()
 La méthode fit de VectorIndexer .setInputCol("features").setOutputCol("indexed").setMaxCategories(2)
renvoie un objet
« VectorIndexerModel » val indexed = indexer.fit(dt) // Ajuster le modèle sur les données(fit)

 VectorIndexerModel permet de // Ajouter la colonne « indexed » à la dataframe dt


mapper une variable en une val indexedDt = indexerModel.transform(dt)
variable catégorielle en utilisant
transform. // afficher les noms des colonnes de la dataframe indexedDt
val indexedData = indexerModel.columns
// res1 : Array[String] = Array(label, features, indexed)

// afficher le nombre de colonnes différentes (features, indexed)


indexedDt.filter(w => (w(1)!=w(2))).count
// res2 : Long = 47
// afficher le nombre des variables catégorielles identfiées
indexerModel.categoryMaps.size
// res3 : Int = 53
30
TRANSFORMER : MAPPER DES LABELS VERS UN VECTEUR BINAIRE M.MICHRAFY

Objectif Exemple
 OneHotEncoder code un vecteur // importer OneHotEncoder, StringIndexerval
de labels (indexé) en un vecteur import org.apache.spark.ml.feature.{OneHotEncoder, StringIndexerval}
binaire. val sq = Seq((0, "a"),(1, "b"),(2, "c"),(3, "a"),(4, "a"),(5, "c"))
val df = spark.createDataFrame(sq).toDF("id", "category") //creer la dataframe
 L’idée est de coder une variable // créer un indexer et ajuster le modèle sur les données df
catégorielle en une liste de val indexer = new StringIndexer()
variable binaires. .setInputCol("category").setOutputCol("categoryIndex").fit(df)
val indexed = indexer.transform(dt) // générer la colonne categoryIndex
 La colonne des labels (indexés)
doit être de type numérique. // créer un opérateur de codage (labels vers binaires)
val encoder = new OneHotEncoder()
 Ce type de décodage est utile .setInputCol("categoryIndex").setOutputCol("categoryVec")
lorsqu’ on a un algorithme qui
n’accepte que les variables // transformer les données (labels vers binaires)
quantitatives. C’est le cas d’une val encoded = encoder.transform(indexed)
régression linéaire.
encoded.columns // afficher le nombre de colonnes de encoded
// res1 : Array[String] = Array(id, category, categoryIndex, categoryVec)

encoded.take(2)// afficher les 3 lignes de encoded


// res2 : Array([0,a,0.0,(2,[0],[1.0])], [1,b,2.0,(2,[],[])], [2,c,1.0,(2,[1],[1.0])])
31
TRANSFORMER : NORMALISATION DES DONNÉES M.MICHRAFY

Objectif Exemple
 Normalizer vise à normaliser les
données en utilisant la norme Lp, p // importer Normalizer
est un paramètre d’entrée. import org.apache.spark.ml.feature.Normalizer

 Lorsque p prend la valeur 2 (valeur // charger les données : sample_libsvm_data.txt de la distribution Spark
par défaut), on retrouve la norme val dt = spark.read.format(“libsvm”)
euclidienne. .load(“SparkPath/data/mllib/sample_libsvm_data.txt”)

 La méthode setP(Double) de la // fixer la colonne d’entrée et celui de la sortie et la norme utilisée


classe Normalizer permet de fixer la val indexer = new Normalizer()
norme. .setInputCol("features") // fixer l’entrée
.setOutputCol("normFeatures") // fixer la sortie
.setP(2.0) // fixer la la nome L2

// Normaliser les données


val l2NormData = normalizer.transform(dt)

// afficher les données de la dataframe l2NormData


l2NormData.show()

32
TRANSFORMER : SEGMENTATION DU TEXTE EN MOTS M.MICHRAFY

Objectif Exemple
 Tokenizer vise à segmenter une
phrase ou une ligne en une liste de // importer Tokenizer
mots. import org.apache.spark.ml.feature.Tokenizer

 Le Tokenizer utilise le séparateur // Créer la dataFrame sentenceDataFrame


espace pour segmenter un texte. val sentenceDataFrame = spark.createDataFrame(Seq(
(0, "La meilleure façon de predire l’avenir est de le creer"),
(1, "Vous ne trouverez jamais ce que vous ne cherchez pas"),
(2, "Si vous pouvez le rever, vous pouvez le faire.")
)).toDF("label", "phrase")

// fixer la colonne d’entrée et celui de la sortie


val tokenizer = new Tokenizer().setInputCol("phrase").setOutputCol("words")

// Segmenter chaque phrase en une liste de mots


val tokenized = tokenizer.transform(sentenceDataFrame)

// afficher les mots de chaque phrase et le label associé


tokenized.select("words", "label").take(3).foreach(println)

33
TRANSFORMER : BINARISER UN VECTEUR M.MICHRAFY

Objectif Exemple
 Binarizer permet de transformer un // importer Binarizer
vecteur numérique en un vecteur import org.apache.spark.ml.feature.Binarizer
binaire en se basant sur un seuil.
// Créer la dataFrame sentenceDataFrame
 La binarisation utilise la règle val data = Array((0, 0.1), (1, 0.5), (2, 0.7), (3,0.8))
suivante : val dataFrame = spark.createDataFrame(data).toDF("label", "feature")
si la valeur > seuil alors 1 sinon 0
//Créer un op binarizer, fixer les colonnes d’entrée et de sortie et le seuil =0.5
val binarizer: Binarizer = new Binarizer()
.setInputCol("feature").setOutputCol("bin_feature").setThreshold(0.5)

// Binariser le vecteur feature et générer le résultat dans la colonne bin_feature


val binarizedDataFrame = binarizer.transform(dataFrame)

// afficher la dataframe générée


binarizedDataFrame.show()
|label|feature|bin_feature|
| 0| 0.1| 0.0|
| 1| 0.5| 0.0|
| 2| 0.7| 1.0|
| 3| 0.8| 1.0|
34
TRANSFORMER : REGROUPER DES COLONNES M.MICHRAFY

Objectif Exemple
 VectorAssembler permet de // importer VectorAssembler
regrouper des colonnes en une import org.apache.spark.ml.feature.VectorAssembler
seule colonne. // Créer une dataframe avec 3 colonnes
val sq = Seq((0,0.0,3.0),(1,1.0,0.0),(2,0.0,4.0),(3,0.0,1.0),(4,1.0,0.0),(5,0.0,2.0))
 Les colonnes à regrouper doivent val df = spark.createDataFrame(sq).toDF("id", "eligible", "couleur")
faire partie des types suivants :
numérique, booléen ou vecteurs //Créer assembler pour regrouper les colonnes "eligible", "couleur"
(de type double). val assembler = new VectorAssembler()
.setInputCols(Array("eligible", "couleur")).setOutputCol("features")
 Ceci est utile puisque les // Generer une la colonne features qui regroupe "eligible", "couleur"
algorithmes de l’API Spark ML val dfas = assembler.transform(df)
nécessitent que les variables
explicatives soient de type // afficher le contenu de la dataframe dfas
vecteur. dfas.show()
| id|eligible|couleur| features|
| 0| 0.0| 3.0|[0.0,3.0]|
| 1| 1.0| 0.0|[1.0,0.0]|
| 2| 0.0| 4.0|[0.0,4.0]|
| 3| 0.0| 1.0|[0.0,1.0]|
| 4| 1.0| 0.0|[1.0,0.0]|
| 5| 0.0| 2.0|[0.0,2.0]|
35
M.MICHRAFY
MISE EN OUVRE DES PIPELINES SOUS SPARK ML

• Cette section porte sur la mise en œuvre des pipelines sous Spark ML.

• Trois exemples sont abordés et portent sur :


1. Pipeline dédié à la régression linéaire
2. Pipeline dédié aux arbres de décision
3. Pipeline dédié à la régression logistique

36
PIPELINE : RÉGRESSION LINÉAIRE, DONNÉES OZONE 1/2 M.MICHRAFY

Objectif Exemple 1
 Proposer un pipeline qui vise à import org.apache.spark.ml.{Pipeline, PipelineModel}
préparer des données et à ajuster import org.apache.spark.ml.feature.{VectorAssembler,StringIndexer,VectorIndexer}
un modèle de régression linéaire import org.apache.spark.ml.regression.LinearRegression

// Charger les données et renommer les colonnes


 Le pipeline est composé de :
val ozone = spark.read.option("header", true).option("inferSchema","true")
1. Estimator : venIndexer .option("delimiter"," ").csv("D:/MMY/PublicationsWeb/SparkML/ozone.txt")
2. Estimator : pluieIndexer .toDF("id", "maxO3", "T9", "T12", "T15", "Ne9", "Ne12", "Ne15", "Vx9", "Vx12", "Vx15",
3. Transformer : assembler "maxO3v", "vent", "pluie")
4. Transformer : featureIndexer // Créer l’indexer pour transformer « vent » en variable catégorielle
5. Estimator : lr val ventIndexer = new StringIndexer().setInputCol("vent").setOutputCol("labelVent")

// Créer l’indexer pour transformer « pluie » en variable catégorielle


val pluieIndexer = new StringIndexer().setInputCol("pluie").setOutputCol("labelPluie")

// Regrouper les prédicteurs en une seul colonne


val assembler = new VectorAssembler()
.setInputCols(Array("T9", "T12", "T15", "Ne9", "Ne12", "Ne15", "Vx9", "Vx12", "Vx15",
"maxO3v", "labelVent", "labelPluie")).setOutputCol("features")

// Identifier et indexer les variables categorielles avec un seuil = 4


val featureIndexer = new VectorIndexer()
.setInputCol("features").setOutputCol("indexedFeatures").setMaxCategories(4)
37
PIPELINE : RÉGRESSION LINÉAIRE, DONNÉES OZONE 2/2 M.MICHRAFY

Suite 2
Importer les packages

Charger les données OZONE // initier le modèle de régression linéaire


val lr = new LinearRegression()
.setMaxIter(20)
Créer l’indexer pour la variable
.setRegParam(0.5)
vent. .setLabelCol("maxO3")
.setFeaturesCol("indexedFeatures")
Créer l’indexer pour la variable .setPredictionCol("maxO3PredictCol")
pluie
// créer le pipeline : ventIndexer, pluieIndexer, assembler, featureIndexer, lr
Regrouper les variables val pipeline = new Pipeline()
.setStages(Array(ventIndexer, pluieIndexer, assembler, featureIndexer, lr))
Regrouper les variables
// ajuster le modèle sur les données ozone
Identifier les variables val model = pipeline.fit(ozone)
catégorielles
// évaluer le modèle sur les données d’apprentissage
Créer le modèle de régression val predictions = model.transform(ozone)
Créer le pipeline
// afficher les resultats de prediction
predictions.select("id", "maxO3", "maxO3PredictCol" )
Ajuster le modèle sur les
38
données et faire la prédiction
PIPELINE : ARBRE DE DÉCISION, DONNÉES IRIS M.MICHRAFY

Objectif Exemple
 Proposer un pipeline qui vise à préparer import org.apache.spark.ml.{Pipeline, PipelineModel}
des données et à ajuster un modèle import org.apache.spark.ml.classification.{DecisionTreeClassifier,DecisionTreeClassificationModel}
basé sur la méthode d’arbre de import org.apache.spark.ml.feature.{StringIndexer, VectorAssembler}
décision. // charger les données iris et renommer les colonnes
 Le pipeline est composé de 2 val iris = spark.read.option("header", true).option("inferSchema",
transformateurs et d’un estimateur. "true").csv("Path/iris.csv").toDF("id", "SepalL","SepalW","PetalL","PetalW", "Species")

val assembler = new VectorAssembler() //Créer assembler pour regrouper les colonnes
Importer les packages
.setInputCols(Array("SepalL","SepalW","PetalL","PetalW")).setOutputCol("features")
Charger les données
val indexer = new // transformer la variable Species en un indexer
Regrouper des colonnes StringIndexer().setInputCol("Species").setOutputCol("SpeciesIndex")

Indexer des catégories val dt = new // Créer le modèle d’apprentissage DT


DecisionTreeClassifier().setLabelCol("SpeciesIndex").
Initier le modèle d’arbre de .setPredictionCol("SpeciesPredictCol").setFeaturesCol("features")
décision // créer un pipeline : assembler, indexer, dt
val pipeline = new Pipeline().setStages(Array(assembler, indexer, dt))
Construire et lancer le // ajuster le modèle
pipeline val model = pipeline.fit(iris)
// evaluer le modèle sur les données d’apprentissage
Evaluer le modèle les val predictions = model.transform(iris)
données d’apprentissage predictions.show // ajuster les résultats
39
PIPELINE : REGRESSION LOGISTIQUE, DONNÉES PROSTATE M.MICHRAFY

Objectif Exemple
 Proposer un pipeline qui vise à préparer import org.apache.spark.ml.{Pipeline, PipelineModel}
des données et à ajuster un modèle import org.apache.spark.ml.feature.{VectorAssembler,StringIndexer,VectorIndexer}
régression logistique import org.apache.spark.ml.classification.LogisticRegression

 Le pipeline est composé de 2 val prostate = spark.read.option("header", true) // charger les données .
transformateurs et d’un estimateur. .option("inferSchema", "true").option("delimiter",";").csv("cancerprostate.txt")
.toDF("age","acide","rayonx","taille", "grade", "Y", "logAcid")
Importer les packages
val assembler = new VectorAssembler() // créer l’assember
.setInputCols(Array("age","acide","rayonx","taille", "grade",
Charger les données
"logAcid")).setOutputCol("features")
Regrouper des colonnes
val indexer = new StringIndexer(). // transformer la variable Y en un indexer
Indexer des catégories setInputCol("Y").setOutputCol("label")

Initier le modèle régression logistique val lr = new LogisticRegression() // Initier le modèle de régression logistique
.setLabelCol("label").setFeaturesCol("features").setPredictionCol("labelPredictCol")
Construire et lancer le pipeline .setMaxIter(20).setRegParam(0.3).setElasticNetParam(0.8)
// créer un pipeline : assembler, indexer, lr
val pipeline = new Pipeline().setStages(Array(assembler, indexer, lr))
Evaluer le modèle sur les
données d’apprentissage val model = pipeline.fit(prostate) // ajuster le modèle sur les données
val predictions = model.transform(prostate) // évaluer le modèle sur Prostate
Afficher les résultats predictions.show // afficher les résultats 40
M.MICHRAFY
MISE EN OUVRE DU PROCESSUS D’ÉVALUATION

• Cette section vise à présenter des techniques relatives à l’évaluation d’une


méthode d’apprentissage

• Trois exemples sont abordés :


1. Evaluation d’une régression linéaire
2. Evaluation dune méthode d’arbre de décision
3. Evaluation de la régression logistique

41
EVALUATION DE LA RÉGRESSION LINÉAIRE, DONNÉES OZONE 1/2 M.MICHRAFY

Objectif Exemple
 Mise en œuvre de l’évaluation import org.apache.spark.ml.{Pipeline, PipelineModel}
d’une méthode de régression import org.apache.spark.ml.feature.{VectorAssembler,StringIndexer,VectorIndexer}
linéaire pour les données OZONE. import org.apache.spark.ml.regression.LinearRegression

// Charger les données et renommer les colonnes


 L’idée est de montrer la manière val ozone = spark.read.option("header", true).option("inferSchema","true")
d’utiliser la classe finale .option("delimiter"," ")..csv("D:/MMY/PublicationsWeb/SparkML/ozone.txt")
RegressionEvaluator. .toDF("id", "maxO3", "T9", "T12", "T15", "Ne9", "Ne12", "Ne15", "Vx9", "Vx12", "Vx15",
"maxO3v", "vent", "pluie")
 Pour ce faire, nous avons deux // Créer l’indexer pour transformer « vent » en variable catégorielle
étapes. val ventIndexer = new StringIndexer().setInputCol("vent").setOutputCol("labelVent")

 L’étape 1 consiste à positionner les // Créer l’indexer pour transformer « pluie » en variable catégorielle
paramètres : label, prédicteur, val pluieIndexer = new StringIndexer().setInputCol("pluie").setOutputCol("labelPluie")
mesure.
// Regrouper les prédicteurs en une seule colonne
 L’étape 2 évalue la méthode val assembler = new VectorAssembler()
ajustée et retourne un score. .setInputCols(Array("T9", "T12", "T15", "Ne9", "Ne12", "Ne15", "Vx9", "Vx12", "Vx15",
"maxO3v", "labelVent", "labelPluie")).setOutputCol("features")
 L’exemple proposé reprend les // Identifier et indexer les variables categorielles avec un seuil = 4
étapes des slides 36-37. val featureIndexer = new VectorIndexer()
.setInputCol("features").setOutputCol("indexedFeatures").setMaxCategories(4)
42
EVALUATION DE LA RÉGRESSION LINÉAIRE, DONNÉES OZONE 2/2 M.MICHRAFY

Exemple
// initier le modèle de régression linéaire
val lr = new LinearRegression().setMaxIter(20).setRegParam(0.5)
Charger les données .setLabelCol("maxO3").setFeaturesCol("indexedFeatures")
.setPredictionCol("maxO3PredictCol")
// créer le pipeline : ventIndexer, pluieIndexer, assembler, featureIndexer, lr
val pipeline = new Pipeline()

Appliquer le pipeline
.setStages(Array(ventIndexer, pluieIndexer, assembler, featureIndexer, lr))
Préparer les données // ajuster le modèle sur les données ozone
val model = pipeline.fit(ozone)
Initier et ajuster le modèle // évaluer le modèle sur les données d’apprentissage
val predictions = model.transform(ozone)

Effectuer la prédiction // import de la classe pour l’evaluation


import org.apache.spark.ml.evaluation.RegressionEvaluator
val evalution = new RegressionEvaluator() // créer l’instance d’évaluation
Evaluation

.setLabelCol("maxO3") //Fixer la colonne du label


Evaluer le modèle

Initier l’évaluateur et .setPredictionCol("maxO3PredictCol") // Fixer la colonne de la prédiction


positionner les params .setMetricName("rmse") // Fixer la mesure d’évaluation
val RMSE = evalution.evaluate(predictions)
Evaluer la méthode print(s"Root Mean Squared Error = ${RMSE}") // afficher la valeur de RMSE
Root Mean Squared Error = 13.60374600320492

43
EVALUATION DE L’ARBRE DE DÉCISION, DONNÉES IRIS M.MICHRAFY

Objectif Exemple
 Mise en œuvre de l’évaluation d’une import org.apache.spark.ml.{Pipeline, PipelineModel}
méthode d’arbre de décision, pour les import org.apache.spark.ml.classification.{DecisionTreeClassifier,DecisionTreeClassificationModel}
données IRIS. import org.apache.spark.ml.feature.{StringIndexer, VectorAssembler}

 La classe d’évaluation utilisée est /*****************************************************************


MulticlassClassificationEvaluator Reprendre les étapes du slide 38 :
depuis le chargement des données,
 La mesure utilisée est Accuracy jusqu'au la génération de la dataframe predictions.
******************************************************************/

Charger les données // import de la classe pour l’évaluation


import org.apache.spark.ml.evaluation. MulticlassClassificationEvaluator
Préparer les données
// créer l’instance d’évaluation
val evalution = new MulticlassClassificationEvaluator()
Ajuster le model ML .setLabelCol("SpeciesIndex") //Fixer la colonne du label
.setPredictionCol("SpeciesPredictCol") // Fixer la colonne de la prédiction
.setMetricName("accuracy") // Fixer la mesure d’évaluation
Initier l’évaluateur et
positionner les params // calculer la valeur de Accuracy
val ACCURACY= evalution.evaluate(predictions)
print(s“ Accuracy= ${ACCURACY}") // afficher la valeur de ACCURACY
Evaluer la méthode via la
mesure Accarucy
44
PIPELINE : REGRESSION LOGISTIQUE, DONNÉES PROSTATE M.MICHRAFY

Objectif Exemple
 Mise en œuvre de l’évaluation d’une import org.apache.spark.ml.{Pipeline, PipelineModel}
méthode de régression logistique, pour import org.apache.spark.ml.feature.{VectorAssembler,StringIndexer,VectorIndexer}
les données PROSTATE. import org.apache.spark.ml.classification.LogisticRegression
 La classe d’évaluation utilisée est
/*****************************************************************
BinaryClassificationEvaluator
Reprendre les étapes du slide 39 :
 La mesure utilisée est areaUnderROC depuis le chargement des données,
jusqu'au la génération de la dataframe predictions.
******************************************************************/
// import de la classe pour l’évaluation
Charger les données import org.apache.spark.ml.evaluation. BinaryClassificationEvaluator

// créer l’instance d’évaluation


Préparer les données val evalution = new BinaryClassificationEvaluator()
.setLabelCol(" label ") //Fixer la colonne du label
.setRawxPredictionCol("labelPredictCol") // Fixer la colonne de la prédiction
Ajuster le model ML .setMetricName("areaUnderROC") // Fixer la mesure d’évaluation

// calculer la valeur de areaUnderROC


Initier l’évaluateur et val areaUnderROC = evalution.evaluate(predictions)
positionner les params print(s“ AreaUnderROC= ${areaUnderROC}") // afficher la valeur de areaUnderROC

Evaluer la méthode avec la


mesure ROC 45
M.MICHRAFY
MISE EN OUVRE DE LA VALIDATION CROISÉE

• Cette section porte sur la mise en œuvre de la validation croisée d’une méthode
d’apprentissage sous Spark ML.

• L’exemple abordé porte sur :


1. les données Prostate
2. la méthode de régression logistique
3. et validation croisée

46
VALIDATION CROISÉE, GRADIENT BOOSTING, DONNÉES PROSTATE 1/3 M.MICHRAFY

Objectif Exemple
1
 Mise en œuvre de la validation croisée import org.apache.spark.ml.{Pipeline, PipelineModel}
d’une méthode de régression logistique , import org.apache.spark.ml.feature.{VectorAssembler,StringIndexer,VectorIndexer}
pour les données PROSTATE. import org.apache.spark.ml.evaluation.BinaryClassificationEvaluator
import org.apache.spark.ml.tuning.{CrossValidator, ParamGridBuilder}
import org.apache.spark.ml.classification.LogisticRegression
// Charger les données et renommer les colonnes
A retenir val prostate = spark.read
.option("header", true) // fichier avec un en-tête
 La validation croisée et la gestion des
paramètres de tuning nécessitent
.option("inferSchema", "true") // faire l’inteférence sur le type de données
l’import de : .option("delimiter",";") // préciser le séparateur
 ParamGridBuilder .csv("D:/MMY/PublicationsWeb/SparkML/cancerprostate.txt")
 CrossValidator .toDF("age","acide","rayonx","taille", "grade","Y", "logAcid") //renommer les cols.

//Créer l’assembler pour regrouper les colonnes


 Lors de la création d’une instance de val assembler = new VectorAssembler()
type CrosseValdation, il est important
de positionner :
.setInputCols(Array("age","acide","rayonx","taille", "grade", "logAcid"))
 le pipleline ou l’algorithme ML .setOutputCol("features")
 l’instance d’évaluation
 les paramètres de tuning // Transformer la variable Y en un indexer
val indexer = new StringIndexer()
.setInputCol("Y")
.setOutputCol("label")
47
VALIDATION CROISÉE, FORÊT DE DÉCISION, DONNÉES PROSTATE 2/3 M.MICHRAFY

Exemple
2
val lr = new LogisticRegression() // Créer le modèle d’apprentissage lr
.setLabelCol("label") // Positionner la variable dépendante
.setFeaturesCol("features") // Positionner le vecteur des variables explicatives
.setPredictionCol("labelPredictCol") // Fixer le nom de la colonne prédite

// Créer l’instance d’évaluation


val evalution = new BinaryClassificationEvaluator() // évaluation binaire
.setLabelCol("label") // Positionner la variable dépendante
.setRawPredictionCol("labelPredictCol") // Positionner le nom de la colonne prédite
.setMetricName("areaUnderROC") // Positionner la mesure d’évaluation

// Positionner les paramètres de tuning pour le modèle lr


val paramGrid = new ParamGridBuilder()
.addGrid(lr.maxIter, Array(20, 30, 50)) // nombre d’itération
addGrid(lr.regParam, Array(0.2, 0.1, 0.01)) // le coef de regularisation
.addGrid(lr. elasticNetParam, Array(0.4, 0.6, 0.8)) // le coef elasticNetParam
.addGrid(lr. threshold, Array(0.4, 0.5, 0.6)) // le seuil
.build()

// créer un pipeline : assembler, indexer, lr


val pipeline = new Pipeline()
.setStages(Array(assembler, indexer, lr))
48
VALIDATION CROISÉE, GRADIENT BOOSTING, DONNÉES PROSTATE 3/3 M.MICHRAFY

Exemple
Importer les packages : 3
Transformateurs, estimateurs, // Instancier la validation croisée
Pipeline, évaluation, validation croisé val cv = new CrossValidator()
.setEstimator(pipeline) // positionner le pipeline
.setEvaluator(evalution) // positionner l’instance d’évaluation
Charger les données (prostate) .setEstimatorParamMaps(paramGrid) // Positionner les params de tuning
.setNumFolds(3) // Positioner le nombre de fold
.setSeed(27) // Positionner seed
Créer les transformateurs et les
estimateurs // Lancer le validation croisée et adjuster le modèle
val cvModel = cv.fit(prostate)

Créer le pipeline // collecter les moyennes pour chaque params de la validation croisée
val avg = cvModel.avgMetrics
println(s"avgMetrics = " + avg.mkString(", "))
Créer l’instance d’évaluation
// pointer la meilleur modele identifié durant la validation croisée
Val bestModel = cvModel.bestModel
Créer l’instance validation croisée

// exécuter la prédiction avec bestModel sur les données d’apprentissage


Lancer la validation croisée et val prediction = cvModel.transform(prostate)
effectuer la prédiction prediction.show(3)
49
DR MUSTAPHA MICHRAFY

CONTACT : DATASCIENCE.KM@GMAIL.COM

Un merci à Dr Bernard Kouakou et Dr Oussama Lachiri pour leurs lectures et remarques pertinentes.

Vous aimerez peut-être aussi