LoslegenKostenlos starten

Benutzerdefinierte Verlustfunktion

Bisher haben wir die mittlere quadratische Abweichung als Verlustfunktion verwendet. Das funktioniert gut, aber bei der Vorhersage von Aktienkursen kann es sinnvoll sein, eine benutzerdefinierte Verlustfunktion zu implementieren. Eine benutzerdefinierte Verlustfunktion kann die Leistung unseres Modells in von uns gewählten Punkten verbessern. Wir werden zum Beispiel eine benutzerdefinierte Verlustfunktion erstellen, die eine hohe Strafe verhängt, wenn Kursbewegungen in die falsche Richtung vorhergesagt werden. So lernt unser Netz zumindest, Bewegungen in die richtige Richtung zu prognostizieren.

Dafür müssen wir eine Funktion schreiben, die die Argumente (y_true, y_predicted) entgegennimmt. Außerdem verwenden wir Funktionalität aus dem Backend von keras (mit tensorflow), um Fälle zu finden, in denen sich das Vorzeichen von wahrem Wert und Vorhersage unterscheidet, und bestrafen diese Fälle dann entsprechend.

Diese Übung ist Teil des Kurses

<Kurs>Maschinelles Lernen für Finanzen in Python</Kurs>
Kurs ansehen

Übungsanweisungen

  • Setze die Argumente der Funktion sign_penalty() auf y_true und y_pred.
  • Multipliziere den quadratischen Fehler (tf.square(y_true - y_pred)) mit penalty, wenn sich die Vorzeichen von y_true und y_pred unterscheiden.
  • Gib den Durchschnitt der Variable loss aus der Funktion zurück – das ist die mittlere quadratische Abweichung (mit unserer Strafterm-Erweiterung für entgegengesetzte Vorzeichen von Ist vs. Vorhersage).

Interaktive praktische Übung

Versuche dich an dieser Übung, indem du diesen Beispielcode vervollständigst.

import keras.losses
import tensorflow as tf

# Create loss function
def sign_penalty(____, ____):
    penalty = 100.
    loss = tf.where(tf.less(y_true * y_pred, 0), \
                     ____ * tf.square(y_true - y_pred), \
                     tf.square(y_true - y_pred))

    return tf.reduce_mean(____, axis=-1)

keras.losses.sign_penalty = sign_penalty  # enable use of loss with keras
print(keras.losses.sign_penalty)
Code bearbeiten und ausführen