Gradient einer Funktion berechnen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Lizzy
User
Beiträge: 48
Registriert: Mittwoch 30. Januar 2019, 15:22

Ich habe eine Funktion, die zwei Werte zurückgeben soll: den gradient und hess des zuvor berechneten "margin".

Code: Alles auswählen

def softmax(mat):
    res = np.exp(mat)
    res = np.multiply(res, 1/np.sum(res, axis=1, keepdims=True))
    return res

def function1(y_true, y_pred_encoded):
    pred = y_pred_encoded.reshape((-1, 3), order='F')
    pred = softmax(pred)
    y_true = OneHotEncoder(sparse=False, categories='auto').fit_transform(y_true.reshape(-1, 1))
    #pen wird hier berechnet und hat (wie y_true zuvor) die shape (153,) und wird dann ebenfalls transformiert
    pen = OneHotEncoder(sparse=False, categories='auto').fit_transform(pen.reshape(-1, 1))
    margin = (pred - y_true + pen).astype("float")
    grad = ??
    hess =??
    return grad, hess
Hat jemand eine Idee wie das in diesem Fall funktionieren könnte? (grad(margin) bekommt leider eine Fehlermeldung)
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Kannst du mir mal einen Link zu dem Kurs oder einem Jupyter Notebook geben,
ich bräuchte da etwas mehr Backgroundverständnis was du da machen willst.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Lizzy
User
Beiträge: 48
Registriert: Mittwoch 30. Januar 2019, 15:22

Ist es hier irgendwie mögliche eine Datei hochzuladen?
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Ok, wenn du mir jetzt noch die Datei V1_2_ML_Boosted.xlsx zur Verfügung stellen könntest.....
so ohne Daten ist es schwierig.... :roll:
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Lizzy
User
Beiträge: 48
Registriert: Mittwoch 30. Januar 2019, 15:22

Sorry vergessen. Vielen Dank schonmal für die Mühe!
https://wetransfer.com/downloads/2a305e ... 230/c568ee
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Hallo Lizzy,
habe mir mal den Code angeschaut.
Du möchtest also eine custom loss function für LightGBM entwickeln,
so ähnlich wie hier: https://towardsdatascience.com/custom-l ... 9c1b40466d

Was soll denn deine Funktion genau machen?
Ich werde da nicht so richtig schlau raus.
Hast du dafür eine Vorgabe / Funktionsbeschreibung?
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Lizzy
User
Beiträge: 48
Registriert: Mittwoch 30. Januar 2019, 15:22

Eine Vorgabe gibt es nicht, es ist nur eine Idee von mir: Die Loss Funktion soll nicht nur falsche Klassifizierungen berücksichtigen, sondern auch eine Nebenbedingung meines Modells beachten (bzw zumindest in einer Form bestrafen wenn sie nicht eingehalten wird): https://wetransfer.com/downloads/70c0b2 ... 251/f78a4e
Die Nebenbedingung soll für alle items in den Testdaten einen bestimmten Wert haben, zB 0,9. Da ich keine Möglichkeit gefunden habe einen "overall constraint" in einer loss function zu implementieren (weil die dafür wohl auch nicht geeignet ist), war meine Idee die folgende: Ich berechne was jedes item im Schnitt zum constraint beitragen müsste, und berechne dann die Abweichung dazu. Somit bekomme ich einen Vektor der mir für jedes item sagt ob es "genug" beiträgt oder nicht. Ich dachte damit kann ich quasi "bestrafen" wenn ein item unter dem Schnitt liegt und das eben in der loss function berücksichtigen.
Lizzy
User
Beiträge: 48
Registriert: Mittwoch 30. Januar 2019, 15:22

@ThomasL: Hast Du eine Idee wie ich für diese Funktion die grad und hess berechnen kann?
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Hi Lizzy, leider habe ich noch nicht wieder die Zeit gehabt, mich mit deiner Loss-Funktion zu beschäftigen.
Was mir aufgefallen war, dass ich eine andere softmax() Funktion habe als du.

Code: Alles auswählen

# deine softmax function
def softmax(mat):
    res = np.exp(mat)
    res = np.multiply(res, 1/np.sum(res, axis=1, keepdims=True))
    return res

# ich würde die so umsetzen
def softmax(x):
    exps = np.exp(x)
    return exps / np.sum(exps, axis=0)
Wenn mat eine Liste [0.2, 0.3, 0.03] ist, wirft deine einen AxisError
KA ob es was damit zu tun haben könnte
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Lizzy
User
Beiträge: 48
Registriert: Mittwoch 30. Januar 2019, 15:22

Danke für den Tipp, ich bin mir nicht sicher ob es hilft da auf jeden Fall noch ein Fehler bei meinem "pen" array liegt....nur weiß ich nicht wo :(
Antworten