Saltar al contenido

¿Cómo funciona internamente la función predict_proba () en LightGBM?

Solución:

Breve explicación

A continuación, podemos ver una ilustración de lo que cada método llama bajo el capó. Primero el predict_proba() método de la clase LGBMClassifier está llamando al predict() método de LGBMModel (hereda de ella).

LGBMClassifier.predict_proba() (inherits from LGBMModel)
  |---->LGBMModel().predict() (calls LightGBM Booster)
          |---->Booster.predict()

Entonces, llama al predict() método del LightGBM Booster (el Booster clase). Para llamar a este método, primero se debe entrenar al Booster.

Básicamente, el Booster es el que genera el valor predicho para cada muestra llamando a su predict() método. Vea a continuación, para un seguimiento detallado de cómo funciona este refuerzo.

Explicación detallada o ¿Cómo funciona LightGBM Booster?

Buscamos dar respuesta a la pregunta ¿cómo funciona el amplificador LightGBM ?. Al revisar el código Python podemos tener una idea general de cómo se entrena y actualiza. Pero, hay algunas referencias adicionales a las bibliotecas C ++ de LightGBM que no estoy en condiciones de explicar. Sin embargo, se explica una visión general del flujo de trabajo Booster de LightGBM.

A. Inicialización y entrenamiento del amplificador

los _Booster de LGBMModel se inicializa llamando al train() función, en la línea 595 de sklearn.py vemos el siguiente código

self._Booster = train(params, train_set,
                      self.n_estimators, valid_sets=valid_sets, valid_names=eval_names,
                      early_stopping_rounds=early_stopping_rounds,
                      evals_result=evals_result, fobj=self._fobj, feval=feval,
                      verbose_eval=verbose, feature_name=feature_name,
                      callbacks=callbacks, init_model=init_model)

Nota. train() proviene de engine.py.

Dentro train() vemos que el Booster está inicializado (línea 231)

# construct booster
try:
    booster = Booster(params=params, train_set=train_set)
...

y actualizado en cada iteración de entrenamiento (línea 242).

for i in range_(init_iteration, init_iteration + num_boost_round):
     ...
     ... 
     booster.update(fobj=fobj)
     ...

B. ¿Cómo booster.update() ¿obras?

Para entender como el update() El método funciona, debemos ir a la línea 2315 de basic.py. Aquí vemos que esta función actualiza el Booster para una iteración.

Allí dos alternativas para actualizar el booster, dependiendo de si proporciona o no una función objetiva.

  • La función objetivo es None

En la línea 2367 llegamos al siguiente código

if fobj is None:
    ...
    ...
    _safe_call(_LIB.LGBM_BoosterUpdateOneIter(
               self.handle,
               ctypes.byref(is_finished)))
    self.__is_predicted_cur_iter = [False for _ in range_(self.__num_dataset)]
    return is_finished.value == 1

observe que como la función objetivo (fobj) no se proporciona actualiza el amplificador llamando LGBM_BoosterUpdateOneIter de _LIB. Para abreviar, _LIB son los cargados C++ Bibliotecas LightGBM.

Que es _LIB?

_LIB es una variable que almacena la biblioteca LightGBM cargada llamando _load_lib() (línea 29 de basic.py).

Luego _load_lib() carga la biblioteca LightGBM encontrando en su sistema la ruta a lib_lightgbm.dll(Windows) o lib_lightgbm.so (Linux).

  • Función objetivo proporcionada

Cuando se encuentra una función de objeto personalizado, llegamos al siguiente caso

else:
    ...
    ...
    grad, hess = fobj(self.__inner_predict(0), self.train_set)

dónde __inner_predict() es un método de Booster de LightGBM (vea la línea 1930 de basic.py para más detalles del Booster clase), que predice los datos de entrenamiento y validación. Dentro __inner_predict() (línea 3142 de basic.py) vemos que llama LGBM_BoosterGetPredict de _LIB para obtener las predicciones, es decir,

_safe_call(_LIB.LGBM_BoosterGetPredict(
                self.handle,
                ctypes.c_int(data_idx),
                ctypes.byref(tmp_out_len),
                data_ptr))

Finalmente, después de actualizar range_(init_iteration, init_iteration + num_boost_round) veces el refuerzo será entrenado. Por lo tanto, Booster.predict() puede ser llamado por LightGBMClassifier.predict_proba().

Nota. El refuerzo se entrena como parte del paso de ajuste del modelo, específicamente por LGBMModel.fit(), consulte la línea 595 de sklearn.py para obtener detalles sobre el código.

LightGBM, como todos los métodos de clasificación de aumento de gradiente, esencialmente combina árboles de decisión y regresión logística. Comenzamos con la misma función logística que representa las probabilidades (también conocida como softmax):

P(y = 1 | X) = 1/(1 + exp(Xw))

El giro interesante es que la matriz de características X se compone de los nodos terminales de un conjunto de árbol de decisión. Todos estos son luego ponderados por w, un parámetro que debe aprenderse. El mecanismo utilizado para aprender los pesos depende del algoritmo de aprendizaje preciso que se utilice. Del mismo modo, la construcción de X también depende del algoritmo. LightGBM, por ejemplo, introdujo dos características novedosas que les valieron las mejoras de rendimiento sobre XGBoost: “Muestreo de un lado basado en gradientes” y “Paquete de características exclusivas”. Sin embargo, en general, cada fila recopila las hojas terminales de cada muestra y las columnas representan las hojas terminales.

Así que esto es lo que podrían decir los médicos …

Estimaciones de probabilidad.

Las probabilidades de clase predichas de una muestra de entrada se calculan como el softmax de la terminal ponderada sale del conjunto del árbol de decisión correspondiente a la muestra proporcionada.

Para obtener más detalles, tendría que profundizar en los detalles del impulso, XGBoost y finalmente el papel LightGBM, pero eso parece un poco torpe dados los otros ejemplos de documentación que ha dado.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *