Zurück zu den Herausforderungen
Einfach 0 gelöst 0% Erfolgsquote

Verlustfunktionen: MSE, MAE und Kreuzentropie

Miss, wie falsch die Vorhersagen eines Modells sind, mit mittlerem quadratischem Fehler, mittlerem absolutem Fehler oder binärer Kreuzentropie.

Das lernst du

  • Den Vorhersagefehler auf drei Arten messen
  • Wahrscheinlichkeiten begrenzen, um log(0) zu vermeiden
  • Eine Verlustfunktion für Regression oder Klassifikation wählen

Problem

Eine Verlustfunktion macht aus den Fehlern eines Modells eine einzige Zahl, die minimiert werden soll. Implementiere compute_loss(kind, predictions, targets) für drei gängige Verluste, wobei n die Anzahl der Vorhersagen ist:

  • "mse" (mittlerer quadratischer Fehler): Mittelwert von (p - t)²
  • "mae" (mittlerer absoluter Fehler): Mittelwert von |p - t|
  • "binary_cross_entropy": -Mittelwert von [t × ln(p) + (1 - t) × ln(1 - p)]. Begrenze zuerst jede Vorhersage p auf den Bereich [0.0000001, 0.9999999], damit der Logarithmus nie ln(0) ist.

Eingabe

kind: "mse", "mae" oder "binary_cross_entropy".

predictions: Die Vorhersagen des Modells.

targets: Die korrekten Werte (gleiche Länge). Bei der Kreuzentropie sind sie 0 oder 1, und die Vorhersagen liegen zwischen 0 und 1.

Ausgabe

Gib den Verlust als Dezimalzahl zurück.

Einschränkungen

1 ≤ Länge ≤ 1.000

-1.000 ≤ jeder Wert ≤ 1.000 (0 ≤ p ≤ 1 und t ∈ {0, 1} bei Kreuzentropie)

Beispiele

Beispiel 1
Eingabe:
kind = "mse"
targets = [3.0, -0.5, 2.0]
predictions = [2.5, 0.0, 2.0]

Erwartete Ausgabe:
expected = 0.166667
Eingabe:
std::string kind = "mse";
std::vector<double> targets = {3.0, -0.5, 2.0};
std::vector<double> predictions = {2.5, 0.0, 2.0};

Erwartete Ausgabe:
double expected = 0.166667;
Eingabe:
string kind = "mse";
double[] targets = new double[] {3.0, -0.5, 2.0};
double[] predictions = new double[] {2.5, 0.0, 2.0};

Erwartete Ausgabe:
double expected = 0.166667;

Erläuterung

Quadratische Fehler: 0.5² = 0.25, 0.5² = 0.25 und 0² = 0. Ihr Mittelwert ist 0.5 / 3 ≈ 0.166667.

Beispiel 2
Eingabe:
kind = "binary_cross_entropy"
targets = [1.0, 0.0]
predictions = [0.9, 0.2]

Erwartete Ausgabe:
expected = 0.164252
Eingabe:
std::string kind = "binary_cross_entropy";
std::vector<double> targets = {1.0, 0.0};
std::vector<double> predictions = {0.9, 0.2};

Erwartete Ausgabe:
double expected = 0.164252;
Eingabe:
string kind = "binary_cross_entropy";
double[] targets = new double[] {1.0, 0.0};
double[] predictions = new double[] {0.9, 0.2};

Erwartete Ausgabe:
double expected = 0.164252;

Erläuterung

-(ln(0.9) + ln(1 - 0.2)) / 2 = -(-0.105361 - 0.223144) / 2 ≈ 0.164252. Sichere, richtige Vorhersagen ergeben einen kleinen Verlust.

So gehst du vor

Versuch es zuerst allein und öffne dann einen Hinweis nach dem anderen.

Hinweis 1

Jeder Loss vergleicht Vorhersagen mit Zielen elementweise und mittelt dann die Fehler pro Beispiel.

Hinweis 2

Bei Cross-Entropy solltest du Vorhersagen vor dem Logarithmieren von 0 und 1 fernhalten.

Hinweis 3

Denk daran, dass Betrag und Quadrieren nicht dasselbe sind, und dass Cross-Entropy das Ziel als Gewicht für jeden Log-Term nutzt.

Erwartete Komplexität

Zeit O(n), zusätzlicher Speicher O(1)

Referenzen

Diese Aufgabe wurde für CodeUtility angepasst. Beachte die oben genannten Vorgaben und Einschränkungen.

Von anderen lernen

Community-Lösungen

Noch keine veröffentlichten Lösungen. Löse die Aufgabe und teile als Erster eine Lösung.