Réglage des hyperparamètres – Combattre le cancer du sein

Ce didacticiel montre comment SynapseML peut être utilisé pour identifier la meilleure combinaison d'hyperparamètres pour les classificateurs que vous avez choisis, aboutissant finalement à des modèles plus précis et plus fiables. Afin de démontrer cela, nous montrerons comment effectuer un réglage d'hyperparamètres de recherche de grille randomisée distribuée pour construire un modèle permettant d'identifier le cancer du sein.

1 – Configurer les dépendances

Commencez par importer des pandas et configurez notre session Spark.

import pandas as pd
from pyspark.sql import SparkSession

# Bootstrap Spark Session
spark = SparkSession.builder.getOrCreate()

Ensuite, lisez les données et divisez-les en ensembles de réglage et de test.

data = spark.read.parquet(
    "wasbs://publicwasb@mmlspark.blob.core.windows.net/BreastCancer.parquet"
).cache()
tune, test = data.randomSplit([0.80, 0.20])
tune.limit(10).toPandas()

Définir les modèles à utiliser.

from synapse.ml.automl import TuneHyperparameters
from synapse.ml.train import TrainClassifier
from pyspark.ml.classification import (
    LogisticRegression,
    RandomForestClassifier,
    GBTClassifier,
)

logReg = LogisticRegression()
randForest = RandomForestClassifier()
gbt = GBTClassifier()
smlmodels = [logReg, randForest, gbt]
mmlmodels = [TrainClassifier(model=model, labelCol="Label") for model in smlmodels]

2 – Trouvez le meilleur modèle avec AutoML

Importez les classes AutoML de SynapseML depuis synapse.ml.automl. Spécifiez les hyperparamètres à l'aide de la HyperparamBuilder. Ajoutez des hyperparamètres DiscreteHyperParam ou RangeHyperParam. TuneHyperparameters choisira au hasard des valeurs à partir d'une distribution uniforme :

from synapse.ml.automl import *

paramBuilder = (
    HyperparamBuilder()
    .addHyperparam(logReg, logReg.regParam, RangeHyperParam(0.1, 0.3))
    .addHyperparam(randForest, randForest.numTrees, DiscreteHyperParam([5, 10]))
    .addHyperparam(randForest, randForest.maxDepth, DiscreteHyperParam([3, 5]))
    .addHyperparam(gbt, gbt.maxBins, RangeHyperParam(8, 16))
    .addHyperparam(gbt, gbt.maxDepth, DiscreteHyperParam([3, 5]))
)
searchSpace = paramBuilder.build()
# The search space is a list of params to tuples of estimator and hyperparam
print(searchSpace)
randomSpace = RandomSpace(searchSpace)

Ensuite, exécutez Tune Hyperparameters pour obtenir le meilleur modèle.

bestModel = TuneHyperparameters(
    evaluationMetric="accuracy",
    models=mmlmodels,
    numFolds=2,
    numRuns=len(mmlmodels) * 2,
    parallelism=1,
    paramSpace=randomSpace.space(),
    seed=0,
).fit(tune)

3 – Évaluer le modèle

Nous pouvons afficher les paramètres du meilleur modèle et récupérer le meilleur pipeline de modèle sous-jacent

print(bestModel.getBestModelInfo())
print(bestModel.getBestModel())

Nous pouvons noter par rapport à l'ensemble de tests et afficher les indicateurs de performance.

from synapse.ml.train import ComputeModelStatistics

prediction = bestModel.transform(test)
metrics = ComputeModelStatistics().transform(prediction)
metrics.limit(10).toPandas()