Académique Documents
Professionnel Documents
Culture Documents
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
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
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.
6
DATAFRAME : MOTIVATIONS
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
DataFrame Transformer
PipelineStage
9
TRANSFORMER ET ESTIMATOR EN SPARK MLIB
Params
Estimator & Transformer
DataFrame DataFrame
Hiérarchie :
Transformer
Estimator
PipelineStage
Transformateur Estimateur
Créer l’opérateur de
transformation Créer l’estimateur
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
Positif TP FN
Négatif FP TN
Matrice de confusion
𝑀𝐴𝐸 = 𝑦𝑙 − 𝑦𝑙
Principales mesures
𝑙=1
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
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
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
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
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.
23
API SPARK ML : VUE PACKAGES
24
MISE EN ŒUVRE SOUS APACHE SPARK ML
• Les exemples ont été réalisés avec Apache Spark version 2.0.2
• Le langage utilisé est Scala.
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/
• 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
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)
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)
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)
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”)
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
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)
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.
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
Suite 2
Importer les packages
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")
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
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
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)
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}
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
• Cette section porte sur la mise en œuvre de la validation croisée d’une méthode
d’apprentissage sous Spark ML.
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.
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
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
CONTACT : DATASCIENCE.KM@GMAIL.COM
Un merci à Dr Bernard Kouakou et Dr Oussama Lachiri pour leurs lectures et remarques pertinentes.