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:
|
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.
|
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'
|
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.