Scikit Learn - Descenso de gradiente estocástico

Aquí, aprenderemos sobre un algoritmo de optimización en Sklearn, denominado Descenso de gradiente estocástico (SGD).

El descenso de gradiente estocástico (SGD) es un algoritmo de optimización simple pero eficiente que se utiliza para encontrar los valores de parámetros / coeficientes de funciones que minimizan una función de costo. En otras palabras, se utiliza para el aprendizaje discriminativo de clasificadores lineales bajo funciones de pérdida convexa como SVM y regresión logística. Se ha aplicado con éxito a conjuntos de datos a gran escala porque la actualización de los coeficientes se realiza para cada instancia de entrenamiento, en lugar de al final de las instancias.

Clasificador SGD

El clasificador de descenso de gradiente estocástico (SGD) básicamente implementa una rutina de aprendizaje de SGD simple que admite varias funciones de pérdida y penalizaciones para la clasificación. Scikit-learn proporcionaSGDClassifier módulo para implementar la clasificación SGD.

Parámetros

La siguiente tabla consta de los parámetros utilizados por SGDClassifier módulo -

No Señor Descripción de parámetros
1

loss - str, predeterminado = 'bisagra'

Representa la función de pérdida que se utilizará durante la implementación. El valor predeterminado es 'bisagra' que nos dará una SVM lineal. Las otras opciones que se pueden utilizar son:

  • log - Esta pérdida nos dará una regresión logística, es decir, un clasificador probabilístico.

  • modified_huber - una pérdida suave que aporta tolerancia a valores atípicos junto con estimaciones de probabilidad.

  • squared_hinge - similar a la pérdida de 'bisagra' pero se penaliza cuadráticamente.

  • perceptron - como sugiere el nombre, es una pérdida lineal que utiliza el algoritmo perceptron.

2

penalty - str, 'ninguno', 'l2', 'l1', 'elasticnet'

Es el término de regularización utilizado en el modelo. De forma predeterminada, es L2. Podemos usar L1 o 'elasticnet; también, pero ambos pueden traer escasez al modelo, por lo tanto, no se puede lograr con L2.

3

alpha - flotante, predeterminado = 0.0001

Alpha, la constante que multiplica el término de regularización, es el parámetro de ajuste que decide cuánto queremos penalizar al modelo. El valor predeterminado es 0,0001.

4

l1_ratio - flotar, predeterminado = 0,15

Esto se denomina parámetro de mezcla de ElasticNet. Su rango es 0 <= l1_ratio <= 1. Si l1_ratio = 1, la penalización sería L1. Si l1_ratio = 0, la penalización sería una penalización L2.

5

fit_intercept - Booleano, predeterminado = verdadero

Este parámetro especifica que se debe agregar una constante (sesgo o intersección) a la función de decisión. No se utilizará ninguna intersección en el cálculo y se asumirá que los datos ya están centrados, si se establece en falso.

6

tol - flotante o ninguno, opcional, predeterminado = 1.e-3

Este parámetro representa el criterio de detención para las iteraciones. Su valor predeterminado es Falso, pero si se establece en Ninguno, las iteraciones se detendrán cuandoloss > best_loss - tol for n_iter_no_changeépocas sucesivas.

7

shuffle - Booleano, opcional, predeterminado = Verdadero

Este parámetro representa si queremos que nuestros datos de entrenamiento se mezclen después de cada época o no.

8

verbose - entero, predeterminado = 0

Representa el nivel de verbosidad. Su valor predeterminado es 0.

9

epsilon - flotante, predeterminado = 0.1

Este parámetro especifica el ancho de la región insensible. Si pérdida = 'insensible a épsilon', cualquier diferencia, entre la predicción actual y la etiqueta correcta, será menor que el umbral.

10

max_iter - int, opcional, predeterminado = 1000

Como sugiere el nombre, representa el número máximo de pasadas durante las épocas, es decir, datos de entrenamiento.

11

warm_start - bool, opcional, predeterminado = falso

Con este parámetro establecido en True, podemos reutilizar la solución de la llamada anterior para ajustarla como inicialización. Si elegimos default, es decir, falso, borrará la solución anterior.

12

random_state - int, instancia de RandomState o None, opcional, predeterminado = ninguno

Este parámetro representa la semilla del número pseudoaleatorio generado que se usa mientras se barajan los datos. Las siguientes son las opciones.

  • int - En este caso, random_state es la semilla utilizada por el generador de números aleatorios.

  • RandomState instance - En este caso, random_state es el generador de números aleatorios.

  • None - En este caso, el generador de números aleatorios es la instancia de RandonState utilizada por np.random.

13

n_jobs - int o none, opcional, Default = None

Representa el número de CPU que se utilizarán en el cálculo OVA (One Versus All), para problemas de varias clases. El valor predeterminado es ninguno, lo que significa 1.

14

learning_rate - cadena, opcional, predeterminado = 'óptimo'

  • Si la tasa de aprendizaje es 'constante', eta = eta0;

  • Si la tasa de aprendizaje es 'óptima', eta = 1.0 / (alfa * (t + t0)), donde t0 es elegido por Leon Bottou;

  • Si la tasa de aprendizaje = 'invscalling', eta = eta0 / pow (t, power_t).

  • Si la tasa de aprendizaje = 'adaptativo', eta = eta0.

15

eta0 - doble, predeterminado = 0.0

Representa la tasa de aprendizaje inicial para las opciones de tasa de aprendizaje mencionadas anteriormente, es decir, "constante", "invscalling" o "adaptativo".

dieciséis

power_t - idouble, predeterminado = 0.5

Es el exponente de la tasa de aprendizaje "incscalling".

17

early_stopping - bool, predeterminado = falso

Este parámetro representa el uso de una parada anticipada para finalizar el entrenamiento cuando la puntuación de validación no mejora. Su valor predeterminado es falso, pero cuando se establece en verdadero, automáticamente aparta una fracción estratificada de los datos de entrenamiento como validación y detiene el entrenamiento cuando la puntuación de validación no mejora.

18

validation_fraction - flotante, predeterminado = 0.1

Solo se usa cuando early_stopping es verdadero. Representa la proporción de datos de entrenamiento que se establecen a un lado como conjunto de validación para la terminación anticipada de los datos de entrenamiento.

19

n_iter_no_change - int, predeterminado = 5

Representa el número de iteraciones sin mejora si el algoritmo se ejecuta antes de una parada anticipada.

20

classs_weight - dict, {class_label: weight} o "balanceado", o Ninguno, opcional

Este parámetro representa los pesos asociados con las clases. Si no se proporciona, se supone que las clases tienen un peso 1.

20

warm_start - bool, opcional, predeterminado = falso

Con este parámetro establecido en True, podemos reutilizar la solución de la llamada anterior para ajustarla como inicialización. Si elegimos default, es decir, falso, borrará la solución anterior.

21

average - iBoolean o int, opcional, predeterminado = falso

Representa el número de CPU que se utilizarán en el cálculo OVA (One Versus All), para problemas de varias clases. El valor predeterminado es ninguno, lo que significa 1.

Atributos

La siguiente tabla consta de los atributos utilizados por SGDClassifier módulo -

No Señor Atributos y descripción
1

coef_ - matriz, forma (1, n_features) si n_classes == 2, else (n_classes, n_features)

Este atributo proporciona el peso asignado a las características.

2

intercept_ - matriz, forma (1,) si n_clases == 2, más (n_clases,)

Representa el término independiente en función de decisión.

3

n_iter_ - int

Da el número de iteraciones para alcanzar el criterio de parada.

Implementation Example

Al igual que otros clasificadores, Stochastic Gradient Descent (SGD) tiene que estar equipado con las siguientes dos matrices:

  • Una matriz X que contiene las muestras de entrenamiento. Es de tamaño [n_samples, n_features].

  • Una matriz Y que contiene los valores objetivo, es decir, etiquetas de clase para las muestras de entrenamiento. Es de tamaño [n_samples].

Example

El siguiente script de Python usa el modelo lineal SGDClassifier -

import numpy as np
from sklearn import linear_model
X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])
Y = np.array([1, 1, 2, 2])
SGDClf = linear_model.SGDClassifier(max_iter = 1000, tol=1e-3,penalty = "elasticnet")
SGDClf.fit(X, Y)

Output

SGDClassifier(
   alpha = 0.0001, average = False, class_weight = None,
   early_stopping = False, epsilon = 0.1, eta0 = 0.0, fit_intercept = True,
   l1_ratio = 0.15, learning_rate = 'optimal', loss = 'hinge', max_iter = 1000,
   n_iter = None, n_iter_no_change = 5, n_jobs = None, penalty = 'elasticnet',
   power_t = 0.5, random_state = None, shuffle = True, tol = 0.001,
   validation_fraction = 0.1, verbose = 0, warm_start = False
)

Example

Ahora, una vez ajustado, el modelo puede predecir nuevos valores de la siguiente manera:

SGDClf.predict([[2.,2.]])

Output

array([2])

Example

Para el ejemplo anterior, podemos obtener el vector de peso con la ayuda del siguiente script de Python:

SGDClf.coef_

Output

array([[19.54811198, 9.77200712]])

Example

Del mismo modo, podemos obtener el valor de la intercepción con la ayuda de la siguiente secuencia de comandos de Python:

SGDClf.intercept_

Output

array([10.])

Example

Podemos obtener la distancia firmada al hiperplano usando SGDClassifier.decision_function como se usa en la siguiente secuencia de comandos de Python -

SGDClf.decision_function([[2., 2.]])

Output

array([68.6402382])

Regresor SGD

El regresor de descenso de gradiente estocástico (SGD) básicamente implementa una rutina de aprendizaje de SGD simple que admite varias funciones de pérdida y penalizaciones para adaptarse a los modelos de regresión lineal. Scikit-learn proporcionaSGDRegressor módulo para implementar la regresión SGD.

Parámetros

Parámetros usados ​​por SGDRegressorson casi los mismos que se utilizaron en el módulo SGDClassifier. La diferencia radica en el parámetro de 'pérdida'. porSGDRegressor parámetro de pérdida de los módulos, los valores positivos son los siguientes:

  • squared_loss - Se refiere al ajuste ordinario por mínimos cuadrados.

  • huber: SGDRegressor- corrija los valores atípicos cambiando de pérdida cuadrada a lineal más allá de una distancia de épsilon. El trabajo de 'huber' es modificar 'squared_loss' para que el algoritmo se centre menos en corregir valores atípicos.

  • epsilon_insensitive - En realidad, ignora los errores menos que épsilon.

  • squared_epsilon_insensitive- Es lo mismo que epsilon_insensitive. La única diferencia es que se convierte en pérdida al cuadrado más allá de la tolerancia de épsilon.

Otra diferencia es que el parámetro llamado 'power_t' tiene el valor predeterminado de 0.25 en lugar de 0.5 como en SGDClassifier. Además, no tiene los parámetros 'class_weight' y 'n_jobs'.

Atributos

Los atributos de SGDRegressor también son los mismos que los del módulo SGDClassifier. Más bien tiene tres atributos adicionales de la siguiente manera:

  • average_coef_ - matriz, forma (n_features,)

Como sugiere el nombre, proporciona los pesos medios asignados a las funciones.

  • average_intercept_ - matriz, forma (1,)

Como sugiere el nombre, proporciona el término de intersección promediado.

  • t_ - int

Proporciona el número de actualizaciones de peso realizadas durante la fase de entrenamiento.

Note - los atributos average_coef_ y average_intercept_ funcionarán después de habilitar el parámetro 'average' en True.

Implementation Example

Siguiendo los usos del script de Python SGDRegressor modelo lineal -

import numpy as np
from sklearn import linear_model
n_samples, n_features = 10, 5
rng = np.random.RandomState(0)
y = rng.randn(n_samples)
X = rng.randn(n_samples, n_features)
SGDReg =linear_model.SGDRegressor(
   max_iter = 1000,penalty = "elasticnet",loss = 'huber',tol = 1e-3, average = True
)
SGDReg.fit(X, y)

Output

SGDRegressor(
   alpha = 0.0001, average = True, early_stopping = False, epsilon = 0.1,
   eta0 = 0.01, fit_intercept = True, l1_ratio = 0.15,
   learning_rate = 'invscaling', loss = 'huber', max_iter = 1000,
   n_iter = None, n_iter_no_change = 5, penalty = 'elasticnet', power_t = 0.25,
   random_state = None, shuffle = True, tol = 0.001, validation_fraction = 0.1,
   verbose = 0, warm_start = False
)

Example

Ahora, una vez instalado, podemos obtener el vector de peso con la ayuda del siguiente script de Python:

SGDReg.coef_

Output

array([-0.00423314, 0.00362922, -0.00380136, 0.00585455, 0.00396787])

Example

Del mismo modo, podemos obtener el valor de la intercepción con la ayuda de la siguiente secuencia de comandos de Python:

SGReg.intercept_

Output

SGReg.intercept_

Example

Podemos obtener la cantidad de actualizaciones de peso durante la fase de entrenamiento con la ayuda del siguiente script de Python:

SGDReg.t_

Output

61.0

Pros y contras de SGD

Siguiendo los pros de SGD -

  • El descenso de gradiente estocástico (SGD) es muy eficiente.

  • Es muy fácil de implementar, ya que hay muchas oportunidades para ajustar el código.

Siguiendo los contras de SGD -

  • El descenso de gradiente estocástico (SGD) requiere varios hiperparámetros como los parámetros de regularización.

  • Es sensible a la escala de características.