Fehler: operands could not be broadcast together with shapes (406,) (1218,)

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

Hallo,

ich habe einen Entscheidungsbaum mit GBM implementiert. Die Daten werden zuerst in Training (X_train, y_train) und Test (X_test, y_test) unterteilt.
Dann wird eine individuelle Loss-Function implementiert (betaloss ist eine zuvor definierte Variable):

Code: Alles auswählen

def custom_asymmetric_train(y_true, y_pred):
    residual = ((y_true - y_pred)^2 + betaloss*10).astype("float")
    grad = np.where(residual>6, -2*10.0*residual, -2*residual)
    hess = np.where(residual>6, 2*10.0, 2.0)
    return grad, hess

def custom_asymmetric_valid(y_true, y_pred):
    residual = ((y_true - y_pred)^2 + betaloss*10).astype("float")
    loss = np.where(residual > 6, (residual**2)*10.0, residual**2) 
    return "custom_asymmetric_eval", np.mean(loss), False 
Der Classifier:

Code: Alles auswählen

gbm = lightgbm.LGBMClassifier() 
gbm.set_params(**{'objective': custom_asymmetric_train})
Und dann die fit Funktion:

Code: Alles auswählen

gbm.fit(
    X_train,
    y_train,
    eval_set=[(X_test, y_test)],
    eval_metric=custom_asymmetric_valid,
    verbose=False,
)
Nach Aufruf der fit Funktion kommt der Fehler: operands could not be broadcast together with shapes (406,) (1218,)

Weiß jemand woran das liegen könnte?

Danke!!
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

schon mal geschaut wie deine shapes für X_train, y_train, X_test, y_test aussehen?
1218 ist 3*406
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

Die Shapes sehen folgendermaßen aus:
X_train: (406,5)
X_test: (102,5)
y_train: (406, )
y_test: (102, )
Benutzeravatar
DeaD_EyE
User
Beiträge: 1012
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Die Arrays y_true, y_pred und betaloss müssen schon die gleichen shapes haben.

Dann ist noch ein kleiner Fehler in beiden Funktionen. Der Operator ^ steht für Bitwise Exclusive Or.
Du willst wahrscheinlich potenzieren. Der Operator für Potenzen ist: **

Code: Alles auswählen

def custom_asymmetric_train(y_true, y_pred):
    residual = ((y_true - y_pred) ** 2 + betaloss*10).astype("float")
    grad = np.where(residual>6, -2*10.0*residual, -2*residual)
    hess = np.where(residual>6, 2*10.0, 2.0)
    return grad, hess

def custom_asymmetric_valid(y_true, y_pred):
    residual = ((y_true - y_pred) ** 2 + betaloss*10).astype("float")
    loss = np.where(residual > 6, (residual**2)*10.0, residual**2) 
    return "custom_asymmetric_eval", np.mean(loss), False
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Lizzy
User
Beiträge: 48
Registriert: Mittwoch 30. Januar 2019, 15:22

Danke für die Antwort! Das betaloss ist allerdings eine Zahl...heißt das kann ja gar nicht die gleiche shape haben oder?
Antworten