apache spark ml : principes, concepts et mise en œuvre

50
APACHE SPARK MLIB : PRINCIPES ET CONCEPTS POUR LA MISE EN ŒUVRE DES MÉTHODES DAPPRENTISSAGE DR MUSTAPHA MICHRAFY CONTACT : DATASCIENCE.KM@GMAIL.COM

Upload: michrafy-mustafa

Post on 20-Mar-2017

621 views

Category:

Data & Analytics


3 download

TRANSCRIPT

Page 1: Apache SPARK  ML : principes, concepts et  mise en œuvre

APACHE SPARK MLIB : PRINCIPES ET CONCEPTS POUR LA MISE

EN ŒUVRE DES MÉTHODES D’APPRENTISSAGE

DR MUSTAPHA MICHRAFY

CONTACT : [email protected]

Page 2: Apache SPARK  ML : principes, concepts et  mise en œuvre

PLAN

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 composants7. API Pipeline en Spark MLIB

8. ‘Transformers’ et ‘Estimators’ en Spark MLIB

9. Transformer : étapes

10. Gestion des paramètres en Spark MLIB11. 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ée15. Illustration et mise en œuvre sous Spark ML

2

M.MICHRAFY

Page 3: Apache SPARK  ML : principes, concepts et  mise en œuvre

CONTEXTE

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

M.MICHRAFY

Page 4: Apache SPARK  ML : principes, concepts et  mise en œuvre

OBJECTIF ET PRÉREQUIS

• Connaissance du langage Scala

• Connaissance de Spark et Spark SQL

• Connaissance des méthodes

d’apprentissage

Cette étude vise à présenter les étapes d’un

workflow pour la mise en place des

méthodes d’apprentissage basées sur l’API

Apache Spark ML.

PrérequisObjectif

4

M.MICHRAFY

Page 5: Apache SPARK  ML : principes, concepts et  mise en œuvre

SPARK ML : MOTIVATIONS ?

• Spark ML est une brique logiciel incontournable de

la plate forme Apache Spark.

• L’API Spark ML est dédiée à la mise en place des

méthodes d’apprentissage.

• Spark ML offre des services couvrant la

préparation des données, l’enrichissement, la

mise au point des méthodes d’apprentissage, et le

déploiement.

• Préparer, enrichir, transformer des données

• L’API de Spark ML propose plusieurs transformateurs

• Algorithmes pour le développement et la mise au

point des méthodes de :

o Classification

o Régression

o Clustering

o Recommandation

SPARK ML ? Fonctionnalités

5

M.MICHRAFY

• 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.

Page 6: Apache SPARK  ML : principes, concepts et  mise en œuvre

CONCEPTS POUR LA MISE EN PLACE DES ALGORITHMES DE SPARK ML

6

Concepts

Spark ML

Ce sont des algorithmes

permettant de transformer une

dataFrame en une autre

Un pipeline est constitué de plusieurs

Transformers et Estimators pour la

mise en place d’un workflow ML.

Les Transformers et Estimators

partagent la même API pour

spécifier les paramètres.

C’est une structure de

données distribuée, orientée

colonne et adaptée pour les

données statistiques ou

méthodes d’apprentissage

DataFrame

Parameters

Pipeline

Transformers

Ce sont des algorithmes visant

à ajuster une fonction entre les

variables explicatives et la

variable cible. Les algorithmes

s’appuient sur les données

d’une DataFrame.

Estimators

Mesures pour évaluer la

performance d’une méthode

d’apprentissage.

EvaluatorsTechnique pour mettre au

point une méthode

d’apprentissage

Cross Validation

Page 7: Apache SPARK  ML : principes, concepts et  mise en œuvre

DATAFRAME : MOTIVATIONS

7

• Les méthodes d’apprentissage

trouvent des applications dans

divers domaines, et nécessitant

divers types de données.

Variété des données

• Alors quelle structure

de données utilisée ?

• Distribuée, résiliente, orientée

colonne, optimisée

• Supportant divers types de

données, inclus les vecteurs

DataFrame

DataFrame est constituée de

n lignes (les individus)

m colonnes (les variables)

une colonne est typée (vecteur)

Popularisée par R,

repris par python(Pandas)

enfin, étendue par Saprk SQL

Page 8: Apache SPARK  ML : principes, concepts et  mise en œuvre

PIPELINE ET SES COMPOSANTS

8

PIPELINE

Transformer Estimator

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.

Page 9: Apache SPARK  ML : principes, concepts et  mise en œuvre

API PIPELINE EN SPARK MLIB

9

• Une méthode d’apprentissage

fait appel à des phases de

traitement, et d’apprentissage.

• Un Pipeline, en Spark MLIB, est

une séquence d’éléments de

type pipelineStage.

• Chaque PipelineStage estconstitué d’un Transformer ou

d’un Estimator.

• Par conséquent, l’ordre des

étapes (PiplineStage) est

important

Pipeline & PipelineStage

• Pour une étape de

transformation, la méthode

transform() est appelée sur uneDataframe et retourne une

DataFrame.

Etape de Transformation • Pour une étape d’estimation, la

méthode fit() d’un Estimator estappelée sur une dataframe pour

produire un Transformer

Etape d’Estimation

DataFrame

DataFrame

DataFrame

Transformer

Pipeline

PipelineStage

Page 10: Apache SPARK  ML : principes, concepts et  mise en œuvre

TRANSFORMER ET ESTIMATOR EN SPARK MLIB

10

• Un transformer permet de

transformer des données.

• En Spark ML, un transformer

permet de transformer une

DataFrame en une autre

DataFrame.

• Transformer est une classe

abstraite qui étend la classe

abstraite pipelineStage.

Transformer

• Un estimateur permet d’évaluer

ou approcher un paramètre

inconnu.

• Un estimateur statistique vise à

évaluer un paramètre inconnu

via un échantillon de données

• En Spark ML, un Estimator est un

opérateur qui prend en entrée

une DataFrame et retourne un

Transformer.

Estimator

• Les implémentations de transformer

dans :org.apache.spark.ml.feature• Des implémentation d’Estimators dans :

org.apache.spark.ml.regression

org.apache.spark.ml.recomendation

org.apache.spark.ml.clustering

org.apache.spark.ml.feature

org.apache.spark.ml.classification…

….

Package

PipelineStage

Estimator Transformer

ParamsDataFrame

DataFrame

DataFrame

Transformer

Transfo

rmer

Estimato

r

Hiéra

rchie :

Estimato

r&

Transfo

rmer

Page 11: Apache SPARK  ML : principes, concepts et  mise en œuvre

ETAPES POUR LE TRANSFORMATEUR & ESTIMATEUR

11

Créer l’estimateur

Positionner les paramètres d’entrée

fit : ajuster le modèle selon les données

transform : générer la nouvelle DataFrame

Créer l’opérateur de transformation

Positionner les paramètres d’entrée

transform : générer la nouvelle DataFrame

EstimateurTransformateur

Page 12: Apache SPARK  ML : principes, concepts et  mise en œuvre

PARAMETRES

12

• Les transformateurs, les

estimateurs, les évaluateurs

nécessitent des paramètres.

• Spark ML propose un package

dédié à la gestion des

paramètres, partagé par les

estimateurs et les

transformateurs.

Intérêt

• Le package est :

org.apache.spark.ml.param

• La classe de base est Param.

• Des spécialisations de Param,sont proposées, portant sur des

primitifs (Int, Long, Float,

Boolean,Double, String, IntArray,

…)

• Les classes Transformer et

Estimator étendent la classe

Params.

Package Param

Param

BooleanParam

DoubleParam

FloatParam

IntArrayParamIntParam

DoubleArrayParam

StringArrayParam

LongParam

Serializable

ParamPair

ParamMap Params

Estimator

Transformer

Page 13: Apache SPARK  ML : principes, concepts et  mise en œuvre

QUELQUES TRANSFORMERS ET ESTIMATORS

13

StringIndexer : coder des catégories

IndexToString : décoder des index

VectorIndexer : identifier des variables catégorielles selon un seuil de fréquence

QuantileDiscretizer : transformer une variable quantitative en une variable qualitative en utilisant le

quantile

StandardScaler : normaliser un vecteur en utilisant la variance

Etc.

Tokenization : segmenter un texte en une liste de mots.

Binarization : transformer des valeurs numériques en valeurs binaires.

Normalizer : normaliser des vecteur en utilisant p-norm.

N-gram : calculer le prochain caractère à partir d’une séquence d’article

MinMaxScaler : transformer une variable quantitative vers une variable quantitative avec des valeurs dans

un intervalle donné.

Etc.

Transformers Estimators

Page 14: Apache SPARK  ML : principes, concepts et  mise en œuvre

EVALUER UNE MÉTHODE D’APPRENTISSAGE

14

• Pour évaluer la performance d’une

méthode d’apprentissage, nous

utilisons des mesures dédiées.

• Pour un individu donné, une

mesure d’évaluation exploite la

valeur ajustée et la valeur de

référence.

• Nous avons des mesures pour :

1. les méthodes de régression

2. les méthodes de classification.

Mesure d’évaluation ?

• Le choix de la méthode

d’évaluation dépend du problème

traité et de la connaissance métier

associée.

• Quelles sont les mesures d’évaluation

pour les méthodes de classification?

• Quelles sont les mesures d’évaluation

pour les méthodes de régression?

Page 15: Apache SPARK  ML : principes, concepts et  mise en œuvre

EVALUER UNE MÉTHODE D’APPRENTISSAGE : CLASSIFICATION

15

• Sensibilité : le taux de caspositifs correctement identifiés

• Spécificité : le taux de casnégatifs correctement identifiés

• Accuracy : le taux de caspositifs ou négatifs

correctement identifiés.

• F-mesure : le taux qui combinela sensibilité et la spécificité

Mesures d’évaluation

• La courbe ROC (receiver

operating characteristic) estutilisée pour évaluer la

performance d’un classifier

binaire.

• La courbe de ROC est la

courbe qui donne la sensibilité

en fonction de la spécificité.

La courbe de ROC

• Elle vise à mesurer la qualité

d'une méthode de

classification.

• Elle indique si la méthode

parvient à classifier

correctement les individus.

Matrice de confusion

• Les mesures d’évaluation utilisent les notions :1. VP (vrais positifs) : nombre de positifs classés positifs

2. FP (faux positifs) : nombre de négatifs classés positifs

3. FN (faux négatifs) : nombre de positifs classés négatifs

4. VN(vrais négatifs) : nombre de négatifs classés

négatifs

• Formules :1. Sensibilité = VP/(VP+FN)

2. Spécificité = VN/(VN + FN)

3. Accuracy = (VP + VN)/(VP + VN + FP + FN)

4. F2 = 2.(Sensibilité+Spécificité)/(Sensibilité + Spécificité)

Positif Négatif

Positif TP FN

Négatif FP TN

Prédite

Rée

lle

Matrice de confusion

Page 16: Apache SPARK  ML : principes, concepts et  mise en œuvre

EVALUER UNE MÉTHODE D’APPRENTISSAGE : RÉGRESSION

16

• MSE : Erreur quadratique moyenne(mean Squared Error)

• RMSE : c’est la racine carrée de MSE(root Mean Squared Error)

• R : Coefficient de détermination

• MAE : Erreur absolue moyenne(mean Absolute Error)

• MAPE : Erreur absolue moyenne enpourcentage (Mean Absolute

Percentage Error)

Principales mesures

• Elle vise à mesurer la qualité d'une

méthode de régression en

calculant une erreur globale

• Une erreur est proche de zéro

indique la pertinence du modèle

Intérêt des mesures

𝑀𝑆𝐸 =

𝑙=1

𝑛

𝑦𝑙 − 𝑦𝒍2

RMSE = 𝑀𝑆𝐸

𝑀𝐴𝐸 =

𝑙=1

𝑛

𝑦𝑙 − 𝑦𝑙

𝑅2 = 1 − 𝑀𝑆𝐸 𝑙=1𝑛 (𝑦𝑙 − 𝑦)2

𝑀𝐴𝑃𝐸 = 𝑙=1𝑛 (𝑦𝑙 − 𝑦𝑙)

𝑦𝑙𝑛

. 100

y𝑙 𝑒𝑠𝑡 𝑙𝑎 𝑣𝑎𝑙𝑒𝑢𝑟 𝑟é𝑒𝑙, ( 𝑦 est la moyenne de 𝑦 ) 𝑦𝑙 𝑒𝑠𝑡 𝑙𝑎 𝑣𝑎𝑙𝑒𝑢𝑟 𝑎𝑗𝑢𝑠𝑡é𝑒,𝑛 𝑑𝑒𝑠𝑖𝑔𝑛𝑒 𝑙𝑒 𝑛𝑜𝑚𝑏𝑟𝑒 𝑑′𝑜𝑏𝑠𝑒𝑟𝑣𝑎𝑡𝑖𝑜𝑛𝑠

Page 17: Apache SPARK  ML : principes, concepts et  mise en œuvre

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

17

Evaluator

BinaryClassificationEvaluator

MulticlassClassificationEvaluator

RegressionEvaluator

Evaluator : Classe abstraite pour l’évaluation de la méthode d’apprentissage.

Le package : org.apache.spark.ml.evaluation Trois méthodes à implémenter :

1. Evaluate : évaluer le modèle

2. copy : copier une instance du modèle

3. uid : associer un ID

L’API Spark ML propose trois implémentations pour la classe

abstraite Evaluator. Les classes sont :

1. RegressionEvaluator pour les méthodes de régression

2. BinaryClassificationEvaluator : pour les méthodes de classification binaire

3. MulticlassClassificationEvaluator : pour les méthodes de classification muti-classes.

Pour la régression

Pour la classification binaire

Pour la classification multi-classes

Page 18: Apache SPARK  ML : principes, concepts et  mise en œuvre

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

18

Evaluator

BinaryClassificationEvaluator

MulticlassClassificationEvaluatorRegressionEvaluator

RegressionEvaluator : une classe dédiée aux algorithmes de régression.

Différentes mesures sont proposées:

1. RMSE (par défaut)

2. MSE

3. R2

4. MAE

BinaryClassificationEvaluator : une classe dédiée à l’évaluation des algorithmes de

classification binaire.

Elle propose deux mesures :

1. areaUnderROC (par défaut)

2. areaUnderPR

MulticlassClassificationEvaluator : une classe dédiée à l’évaluation des algorithmes de

classification multi-modales.

Elle propose différentes mesures :

1. F1 (par défaut)

2. weightedPrecision

3. weightedRecall

4. accuracy

Pour les trois classes d’évaluation, il est possible de fixer :

1. Le nom de la colonne label avec la méthode setlabelCol2. Le nom de la colonne prédite avec la méthode

setPredictionCol

3. La mesure d’évaluation avec la méthode setMetricName

Package : org.apache.spark.ml.evaluation

Page 19: Apache SPARK  ML : principes, concepts et  mise en œuvre

VALIDATION CROISÉE 1/2

19

• La validation croisée est une

méthode d’estimation de fiabilité

d’un modèle, basée sur une

technique d’échantillonnage.

• Elle permet :

• d’optimiser les paramètres du

modèle,

• d’éviter le sur-apprentissage

Intérêt

Alors quelles sont les méthodes

portant sur la validation croisée ?

• Diviser les données en k échantillons(i..k)

• Sélectionner un échantillon i pour la validation

et le reste des données pour l'apprentissage.

• Calculer le score de performance

• Répéter les étapes 2-3 en sélectionnant un

autre échantillon de validation.

• Estimer l’erreur de prédiction en calculant la

moyenne des k erreurs quadratiques

moyennes

• Diviser l'échantillon de taille n en deux sous

échantillons : apprentissage (>60%), test (<

30%).

• Le modèle est ajusté sur l'échantillon

d'apprentissage et validé sur l'échantillon de

test.

• L'erreur est estimée en calculant une mesure

ou un score de performance du modèle sur

l'échantillon de test.

Testset validation k-fold Cross-validation

Page 20: Apache SPARK  ML : principes, concepts et  mise en œuvre

VALIDATION CROISÉE 2/2

20

1. Diviser les données en k échantillons(i..k)

2. Sélectionner un échantillon i pour la validation et le

reste des données pour l'apprentissage.

3. Calculer le score de performance

4. Répéter les étapes 2-3 en sélectionnant un autre

échantillon de validation.

5. Estimer l’erreur de prédiction en calculer la moyenne

des k erreurs quadratiques moyennes

A. Diviser l'échantillon de taille n en deux sous

échantillons : apprentissage (> 60%), test (< 30%).

B. Le modèle est ajusté sur l'échantillon d'apprentissage

et validé sur l'échantillon de test.

C. L'erreur est estimée en calculant une mesure ou un

score de performance du modèle sur l'échantillon de

test.

Tests et validation k-fold Cross-validation

123456

DADT

A

B Ajuster le modèle sur DA et

valider le modèle sur DT

C Estimer l’erreur eAppliquer A et B pour chaque couple d’échantillon

Calculer les erreurs e1 ….e6

Calculer l’erreur de prédiction

e1e2

e6

DA : données d’apprentissageDT : données de test

.

.

.

Page 21: Apache SPARK  ML : principes, concepts et  mise en œuvre

ML TUNING : SÉLECTION DU MODÈLE ET CHOIX DES PARAMÈTRES

21

• Spark ML propose des outils (MLtuning) pour la sélection et

l’optimisation d’un modèle.

• Spark ML tuning s’appuie sur :

• La validation croisée

• L’ étude du comportement des

paramètres

Tuning sous Spark ML

Tuning ML

Pipeline

Estimator

s’applique sur

org.apache.spark.ml.tuning

associé au

• La package portant sur le tuning ML

est org.apache.spark.ml.tuning• Spark ML Tuning propose deux

classes étendant Estimator :

1. CrossValidator : pour lavalidation croisée

2. TrainValidationSplit : pourl’optimisation des paramètres

d’une méthode ML.

• Les deux classes nécessitent :

• Estimator

• Evaluator

• Parameters

Tuning et classes associées

CrossValidation TrainValidationSplit

Estimator

Evaluator

est un

nécessite

Paramètres

M.MICHRAFY

Page 22: Apache SPARK  ML : principes, concepts et  mise en œuvre

ML TUNING : CROSSVALIDATOR

22

• CrossValidator est la classedédiée à la validation croisée.

• C’est l’implémentation de la

méthode k-fold.• Elle ne dispose pas de

constructeur

CrossValidator

Deux étapes : initialisation et

réalisation

• Etape initialisation : fixer les

paramètres d’entrée

• Etape d’ajustement :

effectuer la validation croisée

via la méthode fit

Mise en place ?

Méthode k-fold

modélise

Etape d’Initialisation

• Estimator : fixer l’estimateur ML ou le pipeline.

• Evaluator : fixer la mesure d’évaluation.

• EstimatorParamMaps : fixer les paramètres de l’estimateur ML

• numFolds : fixer le nombre de fold

• Seed : initialiser le générateur aléatoire

Etape d’ajustement

• fit : cette méthode applique la validation croisée et génère les modèles associés.

• Elle retourne un objet de type

CrossValidatorModel.

Alors, quelle sont les méthodes de la classe

CrossValidationModel ?

Classe

CrossValidator

Page 23: Apache SPARK  ML : principes, concepts et  mise en œuvre

ML TUNING : CROSSVALIDATORMODEL

23

• CrossValidatorModel est laclasse qui encapsule le

modèle de validation

croisée.

• Une instance de la classe

CrossValidatorModel est

retournée par la méthode fit

de de l’objet CrossValidator

CrossValidatorModel

• avgMetrics : permet d’accéder à la mesure moyenne pour chaque entréede la map des paramètres.

• bestModel : retourne le meilleur modèle identifié pendant la validationcroisée.

• save : enregistre le modèle ML dans un fichier.

• 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éesde test. Cette méthode applique le meilleur modèle identifié

Fonctionnalités

M.MICHRAFY

Page 24: Apache SPARK  ML : principes, concepts et  mise en œuvre

API SPARK ML : VUE PACKAGES

24

Package pour l’ évaluation

des méthodes

d’apprentissage

Package pour la mise au point

des méthodes ML

Package pour la préparation

et le formatage des données.

Package dédié aux méthodes

de classification

Package dédié aux méthodes

de régression

Package dédié aux méthodes

de clustering

Package dédié aux méthodes

de recommandation

Package dédié la gestion des

paramètres.

Page 25: Apache SPARK  ML : principes, concepts et  mise en œuvre

MISE EN ŒUVRE SOUS APACHE SPARK ML

25

• 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

Page 26: Apache SPARK  ML : principes, concepts et  mise en œuvre

LES DONNÉES UTILISÉES

26

• Description : le jeu de données porte sur la pollution de l’air (112 individus et 13 variables)

• 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

OZONE

• Description : le jeu de données comprend 50 échantillons de chacune des trois espèces d'iris

• Variables explicatives : Sepallength, Sepalwidth, Petallength, Petalwidth

• Variable dépendante (cible) : Species

• URL : https://archive.ics.uci.edu/ml/machine-learning-databases/iris/

IRIS

• Description : le jeu de données porte sur le concert de 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

PROSTATE

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

Page 27: Apache SPARK  ML : principes, concepts et  mise en œuvre

MISE EN OUVRE DES TRANSFORMATEURS ET ESTIMATEURS

27

M.MICHRAFY

• 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

Page 28: Apache SPARK  ML : principes, concepts et  mise en œuvre

TRANSFORMER : INDEXER VERS STRING

StringIndexer code une String en

un double ( plutôt c’est un entier

naturel)

Ceci permet de gérer les

variables qualitatives en Spark

ML.

StringIndexer permet de coder

une seule variable.

Objectif

// importer de StringIndexer

import org.apache.spark.ml. feature.StringIndexer

// créer une dataFrame à partir d’une séquence

val sq = Seq((0, “aa"), (1, “ab"), (2, "cd"), (3, "ad"), (4, "aa"))

val dfin = spark.createDataFrame(sq). toDF("id", "category")

// Etablir le modèle (fit) et construire la colonne sortie (transform)

val indexer = new StringIndexer()

.setInputCol("category" .setOutputCol("categoryIndex")

val dfout = indexer.fit(dfin).transform(dfin)

dfout. printSchemaroot|-- 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|

Exemple

28

M.MICHRAFY

Page 29: Apache SPARK  ML : principes, concepts et  mise en œuvre

TRANSFORMER : INDEXER VERS STRING

IndexToString décode un double

en une String.

indexToString est l’application

inverse de StringIndexer .

Ceci est utile pour retrouver le

nom initiale d’une variable

catégorielle

Objectif

// importer StringIndexer et , IndexToString

import org.apache.spark.ml. feature.{StringIndexer, IndexToString}

val sq = Seq((0, “aa"), (1, “ab"), (2, "cd"), (3, "ad"), (4, "aa"))

val dfin = spark.createDataFrame(sq). toDF("id", "category")

// fixer la colonne de sortie

val indexer = new StringIndexer()

.setInputCol("category") .setOutputCol("categoryIndex")

// Etablir le modèle (fit) et construire la colonne sortie (transform)

val indexed = indexer.fit(dfin).transform(dfin)

val converter = new IndexToString()

.setInputCol("categoryIndex").setOutputCol("originalCategory")

val converted = converter.transform(indexed)

converted.select("Category", "originalCategory"). printSchemaroot|-- Category: string (nullable = true)|-- originalCategory: string (nullable = true)

converted.select("Category", "originalCategory").show(2)|Category|originalCategory|| a| a|| b| b|

Exemple

29

M.MICHRAFY

Page 30: Apache SPARK  ML : principes, concepts et  mise en œuvre

TRANSFORMER : INDENTIFICATION ET CONVERSION VERS VARIABLES

CATÉGORIELLES

VectorIndexer permet d’identifierdes valeurs catégorielles selon un

seuil en utilisant la méthode fit.

La méthode fit de VectorIndexer

renvoie un objet

« VectorIndexerModel »

VectorIndexerModel permet de

mapper une variable en une

variable catégorielle en utilisant

transform.

Objectif

import org.apache.spark.ml. feature.VectorIndexer // importer VectorIndexer

val dt = spark.read.format(“libsvm”).load(“data.txt”) // charger les données

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

val indexer = new StringIndexer()

.setInputCol("features").setOutputCol("indexed").setMaxCategories(2)

val indexed = indexer.fit(dt) // Ajuster le modèle sur les données(fit)

// Ajouter la colonne « indexed » à la dataframe dt

val indexedDt = indexerModel.transform(dt)

// 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

Exemple

30

M.MICHRAFY

Page 31: Apache SPARK  ML : principes, concepts et  mise en œuvre

TRANSFORMER : MAPPER DES LABELS VERS UN VECTEUR BINAIRE

OneHotEncoder code un vecteurde labels (indexé) en un vecteur

binaire.

L’idée est de coder une variable

catégorielle en une liste de

variable binaires.

La colonne des labels (indexés)

doit être de type numérique.

Ce type de décodage est utilelorsqu’ on a un algorithme qui

n’accepte que les variables

quantitatives. C’est le cas d’une

régression linéaire.

Objectif

// importer OneHotEncoder, StringIndexerval

import org.apache.spark.ml.feature.{OneHotEncoder, StringIndexerval}

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

// créer un indexer et ajuster le modèle sur les données df

val indexer = new StringIndexer()

.setInputCol("category").setOutputCol("categoryIndex").fit(df)

val indexed = indexer.transform(dt) // générer la colonne categoryIndex

// créer un opérateur de codage (labels vers binaires)

val encoder = new OneHotEncoder()

.setInputCol("categoryIndex").setOutputCol("categoryVec")

// transformer les données (labels vers binaires)

val encoded = encoder.transform(indexed)

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])])

Exemple

31

M.MICHRAFY

Page 32: Apache SPARK  ML : principes, concepts et  mise en œuvre

TRANSFORMER : NORMALISATION DES DONNÉES

Normalizer vise à normaliser lesdonnées en utilisant la norme Lp, p

est un paramètre d’entrée.

Lorsque p prend la valeur 2 (valeurpar défaut), on retrouve la norme

euclidienne.

La méthode setP(Double) de la

classe Normalizer permet de fixer la

norme.

Objectif

// importer Normalizer

import org.apache.spark.ml.feature.Normalizer

// charger les données : sample_libsvm_data.txt de la distribution Spark

val dt = spark.read.format(“libsvm”)

.load(“SparkPath/data/mllib/sample_libsvm_data.txt”)

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

val indexer = new Normalizer()

.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()

Exemple

32

M.MICHRAFY

Page 33: Apache SPARK  ML : principes, concepts et  mise en œuvre

TRANSFORMER : SEGMENTATION DU TEXTE EN MOTS

Tokenizer vise à segmenter une

phrase ou une ligne en une liste de

mots.

Le Tokenizer utilise le séparateur

espace pour segmenter un texte.

Objectif

// importer Tokenizer

import org.apache.spark.ml.feature.Tokenizer

// Créer la dataFrame sentenceDataFrame

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)

Exemple

33

M.MICHRAFY

Page 34: Apache SPARK  ML : principes, concepts et  mise en œuvre

TRANSFORMER : BINARISER UN VECTEUR

Binarizer permet de transformer unvecteur numérique en un vecteur

binaire en se basant sur un seuil.

La binarisation utilise la règle

suivante :

si la valeur > seuil alors 1 sinon 0

Objectif

// importer Binarizer

import org.apache.spark.ml.feature.Binarizer

// Créer la dataFrame sentenceDataFrame

val data = Array((0, 0.1), (1, 0.5), (2, 0.7), (3,0.8))

val dataFrame = spark.createDataFrame(data).toDF("label", "feature")

//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|

Exemple

34

M.MICHRAFY

Page 35: Apache SPARK  ML : principes, concepts et  mise en œuvre

TRANSFORMER : REGROUPER DES COLONNES

VectorAssembler permet deregrouper des colonnes en une

seule colonne.

Les colonnes à regrouper doivent

faire partie des types suivants :

numérique, booléen ou vecteurs

(de type double).

Ceci est utile puisque lesalgorithmes de l’API Spark ML

nécessitent que les variables

explicatives soient de type

vecteur.

Objectif

// importer VectorAssembler

import org.apache.spark.ml.feature.VectorAssembler

// 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))

val df = spark.createDataFrame(sq).toDF("id", "eligible", "couleur")

//Créer assembler pour regrouper les colonnes "eligible", "couleur"

val assembler = new VectorAssembler()

.setInputCols(Array("eligible", "couleur")).setOutputCol("features")

// Generer une la colonne features qui regroupe "eligible", "couleur"

val dfas = assembler.transform(df)

// afficher le contenu de la dataframe dfas

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]|

Exemple

35

M.MICHRAFY

Page 36: Apache SPARK  ML : principes, concepts et  mise en œuvre

MISE EN OUVRE DES PIPELINES SOUS SPARK ML

36

M.MICHRAFY

• 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

Page 37: Apache SPARK  ML : principes, concepts et  mise en œuvre

PIPELINE : RÉGRESSION LINÉAIRE, DONNÉES OZONE 1/2

Proposer un pipeline qui vise àpréparer des données et à ajuster

un modèle de régression linéaire

Le pipeline est composé de :

1. Estimator : venIndexer

2. Estimator : pluieIndexer

3. Transformer : assembler

4. Transformer : featureIndexer

5. Estimator : lr

Objectif

import org.apache.spark.ml.{Pipeline, PipelineModel}import org.apache.spark.ml.feature.{VectorAssembler,StringIndexer,VectorIndexer}import org.apache.spark.ml.regression.LinearRegression

// Charger les données et renommer les colonnes

val ozone = spark.read.option("header", true).option("inferSchema","true")

.option("delimiter"," ").csv("D:/MMY/PublicationsWeb/SparkML/ozone.txt")

.toDF("id", "maxO3", "T9", "T12", "T15", "Ne9", "Ne12", "Ne15", "Vx9", "Vx12", "Vx15",

"maxO3v", "vent", "pluie")// Créer l’indexer pour transformer « vent » en variable catégorielle

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 colonneval 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)

Exemple

37

M.MICHRAFY

1

Page 38: Apache SPARK  ML : principes, concepts et  mise en œuvre

PIPELINE : RÉGRESSION LINÉAIRE, DONNÉES OZONE 2/2

// initier le modèle de régression linéaire

val lr = new LinearRegression()

.setMaxIter(20)

.setRegParam(0.5)

.setLabelCol("maxO3")

.setFeaturesCol("indexedFeatures")

.setPredictionCol("maxO3PredictCol")

// créer le pipeline : ventIndexer, pluieIndexer, assembler, featureIndexer, lr

val pipeline = new Pipeline()

.setStages(Array(ventIndexer, pluieIndexer, assembler, featureIndexer, lr))

// ajuster le modèle sur les données ozone

val model = pipeline.fit(ozone)

// évaluer le modèle sur les données d’apprentissage

val predictions = model.transform(ozone)

// afficher les resultats de prediction

predictions.select("id", "maxO3", "maxO3PredictCol" )

Suite

38

M.MICHRAFY

2Importer les packages

Charger les données OZONE

Créer l’indexer pour la variable vent.

Créer l’indexer pour la variable pluie

Regrouper les variables

Regrouper les variables

Identifier les variables catégorielles

Créer le modèle de régression

Créer le pipeline

Ajuster le modèle sur les données et faire la prédiction

Page 39: Apache SPARK  ML : principes, concepts et  mise en œuvre

PIPELINE : ARBRE DE DÉCISION, DONNÉES IRIS

Proposer un pipeline qui vise à préparerdes données et à ajuster un modèlebasé sur la méthode d’arbre de

décision. Le pipeline est composé de 2

transformateurs et d’un estimateur.

Objectif

import org.apache.spark.ml.{Pipeline, PipelineModel}

import org.apache.spark.ml.classification.{DecisionTreeClassifier,DecisionTreeClassificationModel}

import org.apache.spark.ml.feature.{StringIndexer, VectorAssembler}

// charger les données iris et renommer les colonnes

val iris = spark.read.option("header", true).option("inferSchema",

"true").csv("Path/iris.csv").toDF("id", "SepalL","SepalW","PetalL","PetalW", "Species")

val assembler = new VectorAssembler() //Créer assembler pour regrouper les colonnes

.setInputCols(Array("SepalL","SepalW","PetalL","PetalW")).setOutputCol("features")

val indexer = new // transformer la variable Species en un indexer

StringIndexer().setInputCol("Species").setOutputCol("SpeciesIndex")

val dt = new // Créer le modèle d’apprentissage DT

DecisionTreeClassifier().setLabelCol("SpeciesIndex").

.setPredictionCol("SpeciesPredictCol").setFeaturesCol("features")

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

val pipeline = new Pipeline().setStages(Array(assembler, indexer, dt))// ajuster le modèle

val model = pipeline.fit(iris)// evaluer le modèle sur les données d’apprentissage

val predictions = model.transform(iris)

predictions.show // ajuster les résultats

Exemple

39

M.MICHRAFY

Importer les packages

Charger les données

Indexer des catégories

Regrouper des colonnes

Initier le modèle d’arbre de décision

Construire et lancer le pipeline

Evaluer le modèle les données d’apprentissage

Page 40: Apache SPARK  ML : principes, concepts et  mise en œuvre

PIPELINE : REGRESSION LOGISTIQUE, DONNÉES PROSTATE

Proposer un pipeline qui vise à préparerdes données et à ajuster un modèle

régression logistique

Le pipeline est composé de 2transformateurs et d’un estimateur.

Objectif

import org.apache.spark.ml.{Pipeline, PipelineModel}

import org.apache.spark.ml.feature.{VectorAssembler,StringIndexer,VectorIndexer}

import org.apache.spark.ml.classification.LogisticRegression

val prostate = spark.read.option("header", true) // charger les données .

.option("inferSchema", "true").option("delimiter",";").csv("cancerprostate.txt")

.toDF("age","acide","rayonx","taille", "grade", "Y", "logAcid")

val assembler = new VectorAssembler() // créer l’assember

.setInputCols(Array("age","acide","rayonx","taille", "grade",

"logAcid")).setOutputCol("features")

val indexer = new StringIndexer(). // transformer la variable Y en un indexer

setInputCol("Y").setOutputCol("label")

val lr = new LogisticRegression() // Initier le modèle de régression logistique

.setLabelCol("label").setFeaturesCol("features").setPredictionCol("labelPredictCol")

.setMaxIter(20).setRegParam(0.3).setElasticNetParam(0.8)

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

val pipeline = new Pipeline().setStages(Array(assembler, indexer, lr))

val model = pipeline.fit(prostate) // ajuster le modèle sur les données

val predictions = model.transform(prostate) // évaluer le modèle sur Prostate

predictions.show // afficher les résultats

Exemple

40

M.MICHRAFY

Importer les packages

Charger les données

Indexer des catégories

Regrouper des colonnes

Initier le modèle régression logistique

Construire et lancer le pipeline

Evaluer le modèle sur les données d’apprentissage

Afficher les résultats

Page 41: Apache SPARK  ML : principes, concepts et  mise en œuvre

MISE EN OUVRE DU PROCESSUS D’ÉVALUATION

41

M.MICHRAFY

• 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

Page 42: Apache SPARK  ML : principes, concepts et  mise en œuvre

EVALUATION DE LA RÉGRESSION LINÉAIRE, DONNÉES OZONE 1/2

Mise en œuvre de l’évaluationd’une méthode de régression

linéaire pour les données OZONE.

L’idée est de montrer la manière

d’utiliser la classe finale

RegressionEvaluator.

Pour ce faire, nous avons deux

étapes.

L’étape 1 consiste à positionner les

paramètres : label, prédicteur,

mesure.

L’étape 2 évalue la méthode

ajustée et retourne un score.

L’exemple proposé reprend les

étapes des slides 36-37.

Objectif

import org.apache.spark.ml.{Pipeline, PipelineModel}import org.apache.spark.ml.feature.{VectorAssembler,StringIndexer,VectorIndexer}import org.apache.spark.ml.regression.LinearRegression

// Charger les données et renommer les colonnes

val ozone = spark.read.option("header", true).option("inferSchema","true")

.option("delimiter"," ")..csv("D:/MMY/PublicationsWeb/SparkML/ozone.txt")

.toDF("id", "maxO3", "T9", "T12", "T15", "Ne9", "Ne12", "Ne15", "Vx9", "Vx12", "Vx15",

"maxO3v", "vent", "pluie")// Créer l’indexer pour transformer « vent » en variable catégorielle

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 seule colonneval 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)

Exemple

42

M.MICHRAFY

Page 43: Apache SPARK  ML : principes, concepts et  mise en œuvre

EVALUATION DE LA RÉGRESSION LINÉAIRE, DONNÉES OZONE 2/2

// initier le modèle de régression linéaire

val lr = new LinearRegression().setMaxIter(20).setRegParam(0.5)

.setLabelCol("maxO3").setFeaturesCol("indexedFeatures")

.setPredictionCol("maxO3PredictCol")

// créer le pipeline : ventIndexer, pluieIndexer, assembler, featureIndexer, lr

val pipeline = new Pipeline()

.setStages(Array(ventIndexer, pluieIndexer, assembler, featureIndexer, lr))

// ajuster le modèle sur les données ozone

val model = pipeline.fit(ozone)

// évaluer le modèle sur les données d’apprentissage

val predictions = model.transform(ozone)

// import de la classe pour l’evaluation

import org.apache.spark.ml.evaluation.RegressionEvaluator

val evalution = new RegressionEvaluator() // créer l’instance d’évaluation

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

.setPredictionCol("maxO3PredictCol") // Fixer la colonne de la prédiction

.setMetricName("rmse") // Fixer la mesure d’évaluation

val RMSE = evalution.evaluate(predictions)

print(s"Root Mean Squared Error = ${RMSE}") // afficher la valeur de RMSE

Root Mean Squared Error = 13.60374600320492

Exemple

43

M.MICHRAFY

Charger les données

Ap

pliq

uer le p

ipelin

e

Préparer les données

Initier et ajuster le modèle

Effectuer la prédiction

Initier l’évaluateur et positionner les params

Evaluer la méthode

Evaluer le m

od

èle

Eval

uat

ion

Page 44: Apache SPARK  ML : principes, concepts et  mise en œuvre

EVALUATION DE L’ARBRE DE DÉCISION, DONNÉES IRIS

Mise en œuvre de l’évaluation d’uneméthode d’arbre de décision, pour lesdonnées IRIS.

La classe d’évaluation utilisée estMulticlassClassificationEvaluator

La mesure utilisée est Accuracy

Objectif

import org.apache.spark.ml.{Pipeline, PipelineModel}

import org.apache.spark.ml.classification.{DecisionTreeClassifier,DecisionTreeClassificationModel}

import org.apache.spark.ml.feature.{StringIndexer, VectorAssembler}

/*****************************************************************

Reprendre les étapes du slide 38 :

depuis le chargement des données,

jusqu'au la génération de la dataframe predictions.

******************************************************************/

// import de la classe pour l’évaluation

import org.apache.spark.ml.evaluation. MulticlassClassificationEvaluator

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

val evalution = new MulticlassClassificationEvaluator()

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

.setPredictionCol("SpeciesPredictCol") // Fixer la colonne de la prédiction

.setMetricName("accuracy") // Fixer la mesure d’évaluation

// calculer la valeur de Accuracy

val ACCURACY= evalution.evaluate(predictions)

print(s“ Accuracy= ${ACCURACY}") // afficher la valeur de ACCURACY

Exemple

44

M.MICHRAFY

Charger les données

Préparer les données

Ajuster le model ML

Initier l’évaluateur et positionner les params

Evaluer la méthode via la mesure Accarucy

Page 45: Apache SPARK  ML : principes, concepts et  mise en œuvre

PIPELINE : REGRESSION LOGISTIQUE, DONNÉES PROSTATE

Mise en œuvre de l’évaluation d’uneméthode de régression logistique, pourles données PROSTATE.

La classe d’évaluation utilisée est

BinaryClassificationEvaluator

La mesure utilisée est areaUnderROC

Objectif

import org.apache.spark.ml.{Pipeline, PipelineModel}

import org.apache.spark.ml.feature.{VectorAssembler,StringIndexer,VectorIndexer}import org.apache.spark.ml.classification.LogisticRegression

/*****************************************************************

Reprendre les étapes du slide 39 :

depuis le chargement des données,

jusqu'au la génération de la dataframe predictions.******************************************************************/

// import de la classe pour l’évaluation

import org.apache.spark.ml.evaluation. BinaryClassificationEvaluator

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

val evalution = new BinaryClassificationEvaluator()

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

.setRawxPredictionCol("labelPredictCol") // Fixer la colonne de la prédiction

.setMetricName("areaUnderROC") // Fixer la mesure d’évaluation

// calculer la valeur de areaUnderROC

val areaUnderROC = evalution.evaluate(predictions)

print(s“ AreaUnderROC= ${areaUnderROC}") // afficher la valeur de areaUnderROC

Exemple

45

M.MICHRAFY

Charger les données

Préparer les données

Ajuster le model ML

Initier l’évaluateur et positionner les params

Evaluer la méthode avec la mesure ROC

Page 46: Apache SPARK  ML : principes, concepts et  mise en œuvre

MISE EN OUVRE DE LA VALIDATION CROISÉE

46

M.MICHRAFY

• 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

Page 47: Apache SPARK  ML : principes, concepts et  mise en œuvre

VALIDATION CROISÉE, GRADIENT BOOSTING, DONNÉES PROSTATE 1/3

Mise en œuvre de la validation croiséed’une méthode de régression logistique ,pour les données PROSTATE.

Objectif

import org.apache.spark.ml.{Pipeline, PipelineModel}import org.apache.spark.ml.feature.{VectorAssembler,StringIndexer,VectorIndexer}import org.apache.spark.ml.evaluation.BinaryClassificationEvaluatorimport org.apache.spark.ml.tuning.{CrossValidator, ParamGridBuilder}import org.apache.spark.ml.classification.LogisticRegression

// Charger les données et renommer les colonnesval prostate = spark.read

.option("header", true) // fichier avec un en-tête

.option("inferSchema", "true") // faire l’inteférence sur le type de données

.option("delimiter",";") // préciser le séparateur

.csv("D:/MMY/PublicationsWeb/SparkML/cancerprostate.txt")

.toDF("age","acide","rayonx","taille", "grade","Y", "logAcid") //renommer les cols.

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

val assembler = new VectorAssembler()

.setInputCols(Array("age","acide","rayonx","taille", "grade", "logAcid"))

.setOutputCol("features")

// Transformer la variable Y en un indexer

val indexer = new StringIndexer()

.setInputCol("Y")

.setOutputCol("label")

Exemple

47

M.MICHRAFY

La validation croisée et la gestion desparamètres de tuning nécessitentl’import de :

ParamGridBuilder CrossValidator

Lors de la création d’une instance detype CrosseValdation, il est importantde positionner :

le pipleline ou l’algorithme ML l’instance d’évaluation les paramètres de tuning

A retenir

1

Page 48: Apache SPARK  ML : principes, concepts et  mise en œuvre

VALIDATION CROISÉE, FORÊT DE DÉCISION, DONNÉES PROSTATE 2/3

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))

Exemple

48

M.MICHRAFY

2

Page 49: Apache SPARK  ML : principes, concepts et  mise en œuvre

VALIDATION CROISÉE, GRADIENT BOOSTING, DONNÉES PROSTATE 3/3

// Instancier la validation croisée

val cv = new CrossValidator()

.setEstimator(pipeline) // positionner le pipeline

.setEvaluator(evalution) // positionner l’instance d’évaluation

.setEstimatorParamMaps(paramGrid) // Positionner les params de tuning

.setNumFolds(3) // Positioner le nombre de fold

.setSeed(27) // Positionner seed

// Lancer le validation croisée et adjuster le modèle

val cvModel = cv.fit(prostate)

// collecter les moyennes pour chaque params de la validation croisée

val avg = cvModel.avgMetrics

println(s"avgMetrics = " + avg.mkString(", "))

// pointer la meilleur modele identifié durant la validation croisée

Val bestModel = cvModel.bestModel

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

val prediction = cvModel.transform(prostate)

prediction.show(3)

Exemple

49

M.MICHRAFY

Importer les packages : Transformateurs, estimateurs, Pipeline, évaluation, validation croisé

Charger les données (prostate)

Créer les transformateurs et les estimateurs

Créer le pipeline

Créer l’instance d’évaluation

Créer l’instance validation croisée

Lancer la validation croisée et effectuer la prédiction

3

Page 50: Apache SPARK  ML : principes, concepts et  mise en œuvre

DR MUSTAPHA MICHRAFY

CONTACT : [email protected]

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