Evaluer en model til maskinel indlæring

Fuldført

Så du har oplært en forudsigende model. Hvordan ved du, om det er godt?

Hvis du vil evaluere en model, skal du bruge de valideringsdata, du har holdt tilbage. I forbindelse med overvågede modeller til maskinel indlæring giver denne fremgangsmåde dig mulighed for at sammenligne de mærkater, der forudsiges af modellen, med de faktiske mærkater i valideringsdatasættet. Ved at sammenligne forudsigelserne med de sande mærkatværdier kan du beregne en række evalueringsmålepunkter for at kvantificere modellens forudsigende ydeevne.

Evaluering af regressionsmodeller

Regressionsmodeller forudsiger numeriske værdier, så enhver evaluering af modellens forudsigende ydeevne kræver, at du tager højde for forskellene mellem de forudsagte værdier og de faktiske mærkatværdier i valideringsdatasættet. Da valideringsdatasættet indeholder flere tilfælde, hvoraf nogle kan have mere nøjagtige forudsigelser end andre, skal du bruge en måde at aggregere forskellene på og fastlægge en overordnet metrikværdi for ydeevnen. Typiske målepunkter, der bruges til at evaluere en regressionsmodel, omfatter:

  • MSE (Mean Squared Error): Denne metrikværdi beregnes ved at sætte forskellene mellem hver forudsigelse og den faktiske værdi sammen og lægge de kvadrerede forskelle sammen og beregne middelværdien (gennemsnit). Ved at sætte værdierne sammen gør forskellene absolutte (ignorerer, om forskellen er negativ eller positiv), og giver større forskelle større vægt.
  • RMSE (Root Mean Squared Error): Selvom MSE-metrikværdien er en god indikation af fejlniveauet i modelforudsigelserne, er det ikke relateret til den faktiske måleenhed for etiketten. I en model, der forudsiger salg (i amerikanske dollars), repræsenterer MSE-værdien f.eks. de dollarværdier, der er kvadreret. Hvis du vil evaluere, hvor langt fra forudsigelserne er i dollar, skal du beregne kvadratroden af MSE.
  • Bestemmelseskoefficient (R2): Målepunkterne R2 måler korrelationen mellem den kvadrerede funktion og de forudsagte værdier. Dette resulterer i en værdi mellem 0 og 1, der måler afvigelsen, som kan forklares af modellen. Jo tættere denne værdi er på 1, jo bedre forudsiger modellen.

De fleste strukturer til maskinel indlæring leverer klasser, der beregner disse målepunkter for dig. Spark MLlib-biblioteket leverer f.eks. klassen RegressionEvaluator , som du kan bruge som vist i dette kodeeksempel:

from pyspark.ml.evaluation import RegressionEvaluator

# Inference predicted labels from validation data
predictions_df = model.transform(validation_df)

# Assume predictions_df includes a 'prediction' column with the predicted labels
# and a 'label' column with the actual known label values

# Use an evaluator to get metrics
evaluator = RegressionEvaluator()
evaluator.setPredictionCol("prediction")
mse = evaluator.evaluate(predictions_df, {evaluator.metricName: "mse"})
rmse = evaluator.evaluate(predictions_df, {evaluator.metricName: "rmse"})
r2 = evaluator.evaluate(predictions_df, {evaluator.metricName: "r2"})
print("MSE:", str(mse))
print("RMSE:", str(rmse))
print("R2", str(r2))

Evaluering af klassificeringsmodeller

Klassificeringsmodeller forudsiger kategorimærkater (klasser) ved at beregne en sandsynlighedsværdi for hver mulig klasse og vælge klassenavnet med den højeste sandsynlighed. De målepunkter, der bruges til at evaluere en klassificeringsmodel, afspejler, hvor ofte disse klasseforudsigelser var korrekte sammenlignet med de faktiske kendte mærkater i valideringsdatasættet. Typiske målepunkter, der bruges til at evaluere en klassificeringsmodel, omfatter:

  • Nøjagtighed: En simpel metrikværdi, der angiver den andel af klasseforudsigelser, der er foretaget af modellen, og som var korrekte. Selvom dette kan synes som den åbenlyse måde at evaluere ydeevnen af en klassificeringsmodel på, kan du overveje et scenarie, hvor en model bruges til at forudsige, om en person pendler til arbejde i bil, bus eller sporvogn. Lad os sige, at 95% af tilfælde i valideringssættet bruger en bil, 3% tage bussen og 2% fange en sporvogn. En model, der simpelthen altid forudsiger en bil, vil være 95% nøjagtig - selvom den faktisk ikke har nogen forudsigende evne til at skelne mellem de tre klasser.
  • Målepunkter pr. klasse:
    • Præcision: Andelen af forudsigelser for den angivne klasse, der var korrekt. Dette måles som antallet af sande positive ( korrekte forudsigelser for denne klasse) divideret med det samlede antal forudsigelser for denne klasse (herunder falske positiver).
    • Tilbagekald: Andelen af faktiske forekomster af denne klasse, der blev korrekt forudsagt (sande positiver divideret med det samlede antal, hvis forekomster af denne klasse i valideringsdatasættet, herunder falske negativer – tilfælde, hvor modellen fejlagtigt forudsagde en anden klasse).
    • F1-score: En kombineret metrikværdi for præcision og genkaldelse (beregnet som den harmoniske middelværdi for præcision og genkaldelse).
  • Kombinerede (vægtede) præcisions-, tilbagekaldelses- og F1-målepunkter for alle klasser.

Hvad angår regression, omfatter de fleste strukturer til maskinel indlæring klasser, der kan beregne klassificeringsmålepunkter. Følgende kode bruger f.eks. MulticlassClassificationEvaluator i Spark MLlib-biblioteket.

from pyspark.ml.evaluation import MulticlassClassificationEvaluator

# Inference predicted labels from validation data
predictions_df = model.transform(validation_df)

# Assume predictions_df includes a 'prediction' column with the predicted labels
# and a 'label' column with the actual known label values

# Use an evaluator to get metrics
accuracy = evaluator.evaluate(predictions_df, {evaluator.metricName:"accuracy"})
print("Accuracy:", accuracy)

labels = [0,1,2]
print("\nIndividual class metrics:")
for label in sorted(labels):
    print ("Class %s" % (label))
    precision = evaluator.evaluate(predictions_df, {evaluator.metricLabel:label,
                                                    evaluator.metricName:"precisionByLabel"})
    print("\tPrecision:", precision)
    recall = evaluator.evaluate(predictions_df, {evaluator.metricLabel:label,
                                                 evaluator.metricName:"recallByLabel"})
    print("\tRecall:", recall)
    f1 = evaluator.evaluate(predictions_df, {evaluator.metricLabel:label,
                                             evaluator.metricName:"fMeasureByLabel"})
    print("\tF1 Score:", f1)
    
overallPrecision = evaluator.evaluate(predictions_df, {evaluator.metricName:"weightedPrecision"})
print("Overall Precision:", overallPrecision)
overallRecall = evaluator.evaluate(predictions_df, {evaluator.metricName:"weightedRecall"})
print("Overall Recall:", overallRecall)
overallF1 = evaluator.evaluate(predictions_df, {evaluator.metricName:"weightedFMeasure"})
print("Overall F1 Score:", overallF1)

Evaluering af ikke-overvågede klyngemodeller

Ikke-overvågede klyngemodeller har ikke kendte sande mærkatværdier. Målet med klyngemodellen er at gruppere lignende sager i klynger baseret på deres funktioner. Hvis du vil evaluere en klynge, skal du bruge en metrikværdi, der angiver niveauet af adskillelse mellem klynger. Du kan tænke på de grupperede sager som afbildede punkter i flerdimensionelt rum. Punkter i den samme klynge skal være tæt på hinanden og langt væk fra punkter i en anden klynge.

En sådan metrikværdi er silhuetmålingen , som beregner euklidisk afstand og giver en indikation af konsistens i klynger. Silhouetteværdier kan være mellem 1 og -1, hvor en værdi tæt på 1 angiver, at punkterne i en klynge er tæt på de andre punkter i den samme klynge og langt fra punkterne i de andre klynger.

Spark MLlib-biblioteket indeholder klassen ClusteringEvaluator , som beregner Silhouette for de forudsigelser, der er foretaget af en klyngemodel, som vist her:

from pyspark.ml.evaluation import ClusteringEvaluator
from pyspark.ml.linalg import Vectors

# Inference predicted labels from validation data
predictions_df = model.transform(validation_df)

# Assume predictions_df includes a 'prediction' column with the predicted cluster

# Use an evaluator to get metrics
evaluator = ClusteringEvaluator(predictionCol="prediction")
silhouetteVal  = evaluator.evaluate(predictions_df)
print(silhouetteVal)