Hyperparameter-tuning - bekæmpelse af brystkræft

Denne artikel viser dig, hvordan du bruger SynapseML til at identificere den bedste kombination af hyperparametre for valgte klassifikatorer i Microsoft Fabric. Du udfører distribueret randomiseret grid-søgning hyperparameter-tuning for at bygge en model, der klassificerer brystkræfttumorer som ondartede eller godartede.

Hyperparameter-tuning er processen med at finde optimale konfigurationsværdier (hyperparametre) for en maskinlæringsalgoritme, som ikke er lært fra træningsdataene. Eksempler inkluderer læringsrate, antal træer og regulariseringsstyrke.

I dette selvstudium lærer du, hvordan du:

  • Opsæt afhængigheder og indlæs brystkræftdatasættet.
  • Definér klassifikatorer og et hyperparameter-søgerum med SynapseML.
  • Kør distribueret randomiseret gittersøgning med krydsvalidering.
  • Evaluer den bedste model med klassifikationsmålinger.

Forudsætninger

  • Få et Microsoft Fabric-abonnement. Du kan også tilmelde dig en gratis Prøveversion af Microsoft Fabric.

  • Log på Microsoft Fabric.

  • Skift til Fabric ved at bruge experience-switcheren nederst til venstre på din startside.

    Skærmbillede, der viser valget af Fabric i oplevelsesskifter-menuen.

  • Opret en ny notesbog.
  • Vedhæft din notesbog til et lakehouse. I venstre side af notesbogen skal du vælge Tilføj for at tilføje et eksisterende lakehouse eller oprette et nyt.
  • En Fabric-kapacitet på F4 eller højere anbefales. Mindre kapaciteter kan støde på hukommelsesfejl under hyperparameter-tuning.

Bemærkning

SynapseML, PySpark og pandas leveres forudinstalleret i Fabric-notebooks. Du behøver ikke installere nogen pakker.

Konfigurer afhængighederne

Importér pandas, og konfigurer en Spark-session:

import pandas as pd
from pyspark.sql import SparkSession

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

Verdsig, at Spark-sessionen er aktiv:

print(f"Spark version: {spark.version}")
# Expected output: Spark version: 3.x.x (for example, 3.4.1)

Indlæs og udforsk dataene

Læs Wisconsin Breast Cancer-datasættet fra offentlig blob-lagring. Datasættet indeholder 10 numeriske træk udledt fra digitaliserede billeder af fine nåleaspirater (FNA) biopsier, med en binær Label kolonne (0 = godartet, 1 = ondartet).

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

Kontroller at dataene er indlæst korrekt:

print(f"Total rows: {data.count()}, Columns: {len(data.columns)}")
print(f"Tuning set: {tune.count()} rows, Test set: {test.count()} rows")
print(f"Label distribution:\n{data.groupBy('Label').count().toPandas()}")
# Expected output:
# Total rows: 683, Columns: 10
# Tuning set: 540-550 rows, Test set: 130-140 rows
# Label distribution: Label 0 (benign) 444, Label 1 (malignant) 239

Definér klassifikatorerne

Definér tre klassifikatorer og indpak dem i SynapseML's TrainClassifier. Wrapperen TrainClassifier håndterer automatisk feature-vektorisering og label-indeksering.

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]

Verificér, at modellerne er definerede:

print(f"Models defined: {len(mmlmodels)}")
for i, model in enumerate(smlmodels):
    print(f"  {i+1}. {type(model).__name__}")
# Expected output:
# Models defined: 3
#   1. LogisticRegression
#   2. RandomForestClassifier
#   3. GBTClassifier

Byg hyperparameter-søgerummet

Importér SynapseML AutoML-klasserne fra synapse.ml.automl. Angiv hyperparametrene ved at bruge HyperparamBuilder. Brug DiscreteHyperParam til kategoriske valg og RangeHyperParam til kontinuerlige intervaller. TuneHyperparameters tilfældigt udvælger værdier fra en uniform fordeling.

from synapse.ml.automl import (
    HyperparamBuilder,
    RangeHyperParam,
    DiscreteHyperParam,
    RandomSpace,
)

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)

Verificér søgerummet:

print(f"Hyperparameter entries: {len(searchSpace)}")
if len(searchSpace) == 5:
    print("✓ Search space has 5 entries as expected")
else:
    print(f"⚠ Expected 5 entries but found {len(searchSpace)}")
# Expected output: Hyperparameter entries: 5

Kør hyperparameterjustering

Kør TuneHyperparameters med todelt krydsvalidering for at finde den bedste model. Parameteren numRuns styrer, hvor mange tilfældige konfigurationer der skal evalueres (sat til 6 = 3 modeller x 2 kørsler hver).

from synapse.ml.automl import TuneHyperparameters

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

Tip

Øg parallelism til at køre flere modelevalueringer samtidig på større klynger. Øg numRuns og numFolds for en mere grundig søgning på bekostning af længere driftstid.

Bekræfte, at træningen er gennemført:

print(f"Best model metric (accuracy): {bestModel.getBestMetric():.4f}")
if bestModel.getBestMetric() > 0.5:
    print("✓ Model performs better than random")
else:
    print("⚠ Model accuracy is below 0.5. Try a different seed or increase numRuns.")
# Expected output: Best model metric (accuracy): 0.92-0.97

Evaluer den bedste model

Se parametrene for den bedste model og hent den underliggende pipeline:

print("Best model info:")
print(bestModel.getBestModelInfo())
print("\nBest model pipeline:")
print(bestModel.getBestModel())

Score mod testsættet, og se klassifikationsmålingerne:

from synapse.ml.train import ComputeModelStatistics

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

Verificér evalueringsresultaterne:

metrics_df = metrics.toPandas()
print(f"Evaluation metrics columns: {list(metrics_df.columns)}")
print(f"Accuracy: {metrics_df['accuracy'].iloc[0]:.4f}")
print(f"Precision: {metrics_df['precision'].iloc[0]:.4f}")
print(f"Recall: {metrics_df['recall'].iloc[0]:.4f}")
print(f"AUC: {metrics_df['AUC'].iloc[0]:.4f}")
# Expected output: accuracy 0.92-0.97, precision/recall/AUC in similar range
if metrics_df['accuracy'].iloc[0] > 0.80:
    print("✓ Accuracy exceeds 80% as expected")
else:
    print("⚠ Accuracy is below 80%. Try a different seed or increase numRuns.")

Ryd op

De cachede data frigives automatisk, når Spark-sessionen slutter.

Hvis du har oprettet en notesbog udelukkende til denne tutorial, så slet den fra dit arbejdsområde:

  1. Gå til dit arbejdsområde i Fabric-portalen.
  2. Vælg ... (ellipse) ved siden af notesbogens navn.
  3. Vælg Slet.

Fejlfinding

Spørgsmål Årsag Løsning
Py4JJavaError: ... java.io.IOException Når man læser parket Netværksadgang til mmlspark.blob.core.windows.net er blokeret Tjek dine arbejdsområde-firewallregler tillader outbound HTTPS til Azure Blob Storage. Alternativt kan du downloade datasættet og uploade til dit sommerhus ved søen.
TuneHyperparameters Kører i lang tid Stor numRuns eller numFolds med parallelism=1 Reducer numRuns, reducer numFoldseller øg parallelism for at bruge flere klyngekerner.
Lav præcision (< 0,80) Tilfældig seed- eller datasplitning gav en ugunstig konfiguration Prøv en anden seed værdi, øg numRuns for bredere søgning, eller tilføj flere hyperparameterområder.
IllegalArgumentException: Column Label does not exist Dataset-skema-mismatch eller forkert labelCol værdi Verificér kolonnenavne med data.printSchema(). Labelkolonnen skal matche parameteren labelCol i TrainClassifier.
OutOfMemoryError Under træningen Datasættet, der caches i hukommelsen, overstiger den tilgængelige Spark-driver/executor-hukommelse Fjern .cache() eller øg Spark-klyngens kapacitet i dine Fabric arbejdsområdeindstillinger.