sklearn logistic learning example machine-learning scikit-learn

machine-learning - learning - logistic regression sklearn example



¿Cómo implementa scikitlearn la búsqueda de líneas? (3)

La implementación depende de la función de pérdida que elija al inicializar una instancia de GradientBoostingClassifier (use esto, por ejemplo, la parte de regresión debería ser similar). La función de pérdida predeterminada es ''desviación'' y el algoritmo de optimización correspondiente se implementa aquí . En la función _update_terminal_region , se implementa una simple iteración de Newton con solo un paso.

¿Es esta la respuesta que quieres?

En esta sección de la documentación sobre el aumento de gradiente, dice

Gradient Boosting intenta resolver este problema de minimización numéricamente a través del descenso más empinado: la dirección de descenso más pronunciada es el gradiente negativo de la función de pérdida evaluada en el modelo actual F_ {m-1} que puede calcularse para cualquier función de pérdida diferenciable:

Donde la longitud del paso / gamma_m se elige usando la búsqueda de línea:

Entiendo el propósito de la búsqueda en línea, pero no entiendo el algoritmo en sí. Leí el código fuente , pero todavía no está haciendo clic. Una explicación sería muy apreciada.


Sospecho que lo que encuentras confuso es esto: puedes ver dónde scikit-learn calcula el gradiente negativo de la función de pérdida y ajusta un estimador base a ese gradiente negativo. Parece que el método _update_terminal_region es responsable de calcular el tamaño del paso, pero no se puede ver en ningún lado que pueda resolver el problema de minimización de búsqueda de línea como está escrito en la documentación.

La razón por la que no puede encontrar una búsqueda en línea es que, para el caso especial de los regresores de árboles de decisión, que son solo funciones constantes por partes, la solución óptima es generalmente conocida. Por ejemplo, si observa el método _update_terminal_region de la función de pérdida LeastAbsoluteError , verá que a las hojas del árbol se les asigna el valor de la mediana ponderada de la diferencia entre y y el valor predicho para los ejemplos para los que esa hoja es relevante . Esta mediana es la solución óptima conocida.

Para resumir lo que está sucediendo, para cada iteración de descenso de gradiente se toman los siguientes pasos:

  1. Calcule el gradiente negativo de la función de pérdida en la predicción actual.

  2. Ajuste un DecisionTreeRegressor al degradado negativo. Este ajuste produce un árbol con buenas divisiones para disminuir la pérdida.

  3. Reemplace los valores en las hojas del DecisionTreeRegressor con valores que minimicen la pérdida. Estos generalmente se calculan a partir de una fórmula simple conocida que aprovecha el hecho de que el árbol de decisión es solo una función constante por partes.

Este método debería ser al menos tan bueno como el descrito en los documentos, pero creo que en algunos casos podría no ser idéntico.


Según sus comentarios, parece que el algoritmo en sí mismo no está claro y no es la forma en que scikitlearn lo implementa.

La notación en el artículo de wikipedia es ligeramente descuidada, no se diferencia simplemente por una función evaluada en un punto. Una vez que reemplaza F_{m-1}(x_i) con /hat{y_i} y reemplaza derivada parcial con una derivada parcial evaluada en /hat{y}=F_{m-1}(x) cosas se vuelven más claras:

Esto también eliminaría x_{i} (más o menos) del problema de minimización y muestra el propósito de la búsqueda en línea: para optimizar según la predicción actual y no según el conjunto de entrenamiento. Ahora, fíjate que:

Por lo tanto, solo estás minimizando:

Así que la búsqueda de línea simplemente optimiza un grado de libertad que tiene (una vez que ha encontrado la dirección correcta del gradiente): el tamaño del paso.