Funktion verstehen

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 würde gerne gradient boosting für eine Klassifizierung implementieren. Nachdem ich die Daten in X_train, X_test, y_train, und y_test geteilt habe, müsste das so funktionieren:

# define custom loss function
def custom_asymmetric_train(y_true, y_pred):
residual = (y_true - y_pred).astype("float")
grad = np.where(residual<0, -2*10.0*residual, -2*residual)
hess = np.where(residual<0, 2*10.0, 2.0)
return grad, hess

def custom_asymmetric_valid(y_true, y_pred):
residual = (y_true - y_pred).astype("float")
loss = np.where(residual < 0, (residual**2)*10.0, residual**2)
return "custom_asymmetric_eval", np.mean(loss), False


import lightgbm
# default lightgbm model with sklearn api
gbm = lightgbm.LGBMClassifier()

# updating objective function to custom
gbm.set_params(**{'objective': custom_asymmetric_train})

# fitting model
gbm.fit(
X_train,
y_train,
eval_set=[(X_test, y_test)],
eval_metric=custom_asymmetric_valid,
verbose=False,
)

y_pred = gbm.predict(X_test)





I would like to implement a gradient boosting for a classification task. After splitting the data into X_train, X_test, y_train, and y_test the gradient boosting should work like this:

# define custom loss function
def custom_asymmetric_train(y_true, y_pred):
residual = (y_true - y_pred).astype("float")
grad = np.where(residual<0, -2*10.0*residual, -2*residual)
hess = np.where(residual<0, 2*10.0, 2.0)
return grad, hess

def custom_asymmetric_valid(y_true, y_pred):
residual = (y_true - y_pred).astype("float")
loss = np.where(residual < 0, (residual**2)*10.0, residual**2)
return "custom_asymmetric_eval", np.mean(loss), False


import lightgbm
# default lightgbm model with sklearn api
gbm = lightgbm.LGBMClassifier()

# updating objective function to custom
gbm.set_params(**{'objective': custom_asymmetric_train})

# fitting model
gbm.fit(
X_train,
y_train,
eval_set=[(X_test, y_test)],
eval_metric=custom_asymmetric_valid,
verbose=False,
)

y_pred = gbm.predict(X_test)


Was ich nicht verstehe ist wie die loss function funktioniert...sie hat als input 2 Parameter (y_true and y_pred), aber wenn ich die Funktion in gbm aufrufe, werden keine Parameter übergeben. Also woher kommen die Werte für y_true and y_pred?
narpfel
User
Beiträge: 645
Registriert: Freitag 20. Oktober 2017, 16:10

@Lizzy: Du rufst die Loss-Funktion gar nicht selbst auf. Du übergibst sie an den `LGBMClassifier`, der die Funktion dann mit den passenden Argumenten aufruft.

Der `set_params`-Aufruf ist übrigens ziemlich umständlich geschrieben, das sollte man einfacher als `gbm.set_params(objective=custom_asymmetric_train)` schreiben.

Bitte setze außerdem deinen Code in Code-Tags (im vollständigen Editor </> bzw. [ code]…[ /code] ohne die Leerzeichen), damit die Einrückung erhalten bleibt und er leichter lesbar ist.
Antworten