Seite 1 von 1

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

Verfasst: Montag 11. Februar 2019, 08:06
von Lizzy
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!!

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

Verfasst: Montag 11. Februar 2019, 13:22
von ThomasL
schon mal geschaut wie deine shapes für X_train, y_train, X_test, y_test aussehen?
1218 ist 3*406

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

Verfasst: Montag 11. Februar 2019, 16:43
von Lizzy
Die Shapes sehen folgendermaßen aus:
X_train: (406,5)
X_test: (102,5)
y_train: (406, )
y_test: (102, )

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

Verfasst: Mittwoch 13. Februar 2019, 09:53
von DeaD_EyE
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

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

Verfasst: Mittwoch 13. Februar 2019, 14:02
von Lizzy
Danke für die Antwort! Das betaloss ist allerdings eine Zahl...heißt das kann ja gar nicht die gleiche shape haben oder?