HyperParameterTuning: Lucha contra el cáncer de mama

En este tutorial se muestra cómo se puede usar SynapseML para identificar la mejor combinación de hiperparámetros para los clasificadores elegidos, lo que da lugar a modelos más precisos y confiables. Para demostrar esto, mostraremos cómo realizar el ajuste de hiperparámetros distribuidos de búsqueda de cuadrícula aleatoria para crear un modelo para identificar el cáncer de mama.

1 - Configuración de dependencias

Empiece por importar Pandas y configurar nuestra sesión de Spark.

import pandas as pd
from pyspark.sql import SparkSession

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

A continuación, lea los datos y divídalos en conjuntos de pruebas y ajuste.

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

Defina los modelos que se van a usar.

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 - Búsqueda del mejor modelo mediante AutoML

Importe las clases AutoML de SynapseML desde synapse.ml.automl. Especifique los hiperparámetros mediante HyperparamBuilder. Agregue hiperparámetros DiscreteHyperParam o RangeHyperParam. TuneHyperparameters elegirá aleatoriamente los valores de una distribución 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)

A continuación, ejecute TuneHyperparameters para obtener el mejor modelo.

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

3 - Evaluar el modelo

Podemos ver los mejores parámetros del modelo y recuperar la canalización del mejor modelo subyacente.

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

Podemos puntuar con el conjunto de pruebas y ver las métricas.

from synapse.ml.train import ComputeModelStatistics

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