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 alib_lightgbm.dll
(Windows) olib_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.