Estoy trabajando en un clasificador binario utilizando LightGBM. Intento ver los resultados de los clasificadores al cambiar los costos de falsos positivos y falsos negativos, aún trabajando en los mismos conjuntos de datos de entrenamiento y validación. La función objetivo se define de la siguiente manera:
def my_scorer(y_true, y_pred):
tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()
model_gain = loss * tp - gain * fp
max_gain = loss * (fn + tp)
return model_gain / max_gain
def lgbm_scorer(labels, preds):
return 'lgbm_scorer', scorer_collection(labels, (preds > 0.5)), True
Como quiero tener probabilidades como resultado de mi modelado, utilizo regresión isotónica como parte final del proceso.
# Versión de sklearn, por la calibración
bst_ = LGBMClassifier(**search_params, **static_params, n_estimators = 1500)
bst_.fit(X = X_train, y = y_train, sample_weight = TRAIN_WEIGHTS,
eval_set = (X_test, y_test), eval_sample_weight = [TEST_WEIGHTS],
eval_metric = lgbm_scorer,
early_stopping_rounds = 150,
callbacks = [lgb.reset_parameter(learning_rate = lambda current_round: learning_rate_decay(current_round,
base_learning_rate = learning_rate,
decay_power = decay_power))],
categorical_feature = cat_vars)
# Calibrar
calibrated_clf = CalibratedClassifierCV(
base_estimator=bst_,
method = 'isotonic',
cv="prefit"
)
calibrated_clf.fit(X_train, y_train)
search_params
son hiperparámetros definidos individualmente (un conjunto por modelo) utilizando Optuna para que la puntuación de ROC-AUC sea aproximadamente la misma para todos los modelos, de modo que sean comparables.
Solo cambiando variables de la función objetivo personalizada (loss
y gain
), puedo ver que la mayoría de los clasificadores están perfectamente calibrados, pero solo unos pocos no lo están - todos esos pocos están por debajo de la línea 'perfectamente calibrada'.
¿Por qué ha sucedido eso? ¿Cómo es que la calibración no puede ser perfecta - en general y en este escenario?