Freigeben über


Optimieren von Hyperparametern – Bekämpfung von Brustkrebs

In diesem Tutorial wird gezeigt, wie mit SynapseML die beste Kombination von Hyperparametern für die ausgewählten Klassifizierer ermittelt werden kann, um letztendlich genauere und zuverlässige Modelle zu erhalten. Zur Veranschaulichung zeigen wir, wie Sie eine Optimierung der Hyperparameter anhand einer verteilten randomisierten Rastersuche durchführen, um ein Modell zur Erkennung von Brustkrebs zu erstellen.

1. Einrichten von Abhängigkeiten

Importieren Sie zuerst Pandas, und richten Sie die Spark-Sitzung ein.

import pandas as pd
from pyspark.sql import SparkSession

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

Lesen Sie als Nächstes die Daten ein, und teilen Sie sie in Optimierungs- und Testsets auf.

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

Definieren Sie die zu verwendenden Modelle.

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. Ermitteln des besten Modells durch automatisiertes maschinelles Lernen

Importieren Sie die AutoML-Klassen von SynapseML aus synapse.ml.automl. Geben Sie die Hyperparameter mit HyperparamBuilder an. Fügen Sie entweder-DiscreteHyperParam- oder RangeHyperParam-Hyperparameter hinzu. TuneHyperparameters wählt nach dem Zufallsprinzip Werte aus einer Gleichverteilung aus:

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)

Führen Sie als Nächstes TuneHyperparameters aus, um das beste Modell zu erhalten.

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

3. Auswerten des Modells

Wir können die Parameter des besten Modells anzeigen und die zugrunde liegende beste Modellpipeline abrufen.

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

Wir können anhand des Testsets eine Bewertung vornehmen und Metriken anzeigen.

from synapse.ml.train import ComputeModelStatistics

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