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?
Funktion verstehen
@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.
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.